Tutto.Praxis · talking deck
Praxis: built from Anthropic's Introduction to Model Context Protocol

One protocol, so any
AI app can reach any
tool or data source.

Eleven ideas, one per screen. Each is a thing to point at while you explain. The drama is in the watching, so take the silences.

01
Tutto.The shape of the course
Where we're going

The whole course on one screen

Four moves: grasp what MCP is, then learn its three primitives (tools, resources, prompts) one at a time, server side and client side.

Foundation

  1. 1 Introducing MCP
  2. 2 MCP clients
  3. 3 Project setup

Tools

  1. 4 Defining tools
  2. 5 The server inspector
  3. 6 Implementing a client

Resources & prompts

  1. 7 Defining resources
  2. 8 Accessing resources
  3. 9 Defining prompts
  4. 10 Prompts in the client

Recap

  1. 11 MCP review
02
Tutto.Lesson 1 · Foundation
Lesson 1

M×N integrations become M+N

Without a standard, every app wires up to every tool by hand. MCP is the standard connector that ends the tangle.

Without MCP every app × every tool, by hand app app app tool tool tool 9 custom integrations With MCP build to the protocol once app app app MCP standard tool tool tool 6 connections to one standard

MCP is a standard, like USB-C for AI: build to the protocol once and every compliant tool just works. It also splits the work: app builders on one side, tool builders on the other.

03
Tutto.Lesson 2 · Foundation
Lesson 2

Host, client, server: one client per server

The app you use is the host. Inside it, each client holds one connection to one server, and the server wraps the real tool or data.

Host Claude Code · Desktop · Cursor client one server client one server JSON-RPC Server exposes tools · resources · prompts Server exposes tools · resources · prompts a real tool / API a database / files

Messages travel as JSON-RPC over a transport: stdio for a local server, HTTP for a remote one. The host can hold many clients at once, but each client talks to exactly one server.

What does each side hold? The server offers the capabilities: tools, resources, prompts. The client is the connection that reaches one server and brokers them to the host. Supplier vs. connector.

Is the client one shared pipe? No: one client per server. The host opens a separate, named line to each server, so you grant and revoke them one at a time.

04
Tutto.Lesson 3 · Foundation
Lesson 3

A server is a few lines to start

The Python SDK's FastMCP does the protocol plumbing. You create a server, register capabilities, and run it over a transport.

Project uv · mcp SDK Server FastMCP("name") Register @tool @resource Run stdio · HTTP Decorators turn ordinary Python functions into MCP capabilities.

stdio runs the server as a local subprocess of the host; HTTP exposes it as a remote service. Same server code either way; the transport is just how messages travel.

What does "transport-agnostic" mean? MCP fixes the language, not the channel. The JSON-RPC messages are identical whether they ride a local stdio pipe or an HTTP connection; neither side's logic changes.

Rewrite the server to go remote? No. Its tools, resources and prompts stay the same; you swap the transport (stdio → HTTP), not the code.

05
Tutto.Lesson 4 · Tools
Lesson 4

Tools: actions the model can choose to call

Decorate a function and its name, docstring and typed arguments become a schema the model reads. The model decides when to use it.

@mcp.tool() def get_weather(city): name · description · input schema the verbs: they do things, have side effects exposed Model reads the schema, decides to call it Result returned to the model Model-controlled: the model picks the moment, not the app or the user.

A clear name and description matter: that text is all the model has to decide whether and how to call the tool. Treat the docstring as a prompt, not a comment.

06
Tutto.Lesson 5 · Tools
Lesson 5

Test the server before wiring it to an app

The Inspector connects straight to your server, no LLM involved. List what it exposes, call each tool by hand, read the raw response.

MCP Inspector a test client, no model browser UI call raw response Your server tools · resources · prompts Check, in isolation does it list correctly? does each call return? is the shape right?

Debug the server on its own first. If the Inspector can list and call everything cleanly, the problem later is in the client wiring, not the server.

07
Tutto.Lesson 6 · Tools
Lesson 6

The client feeds tools to the model, in a loop

Your client lists the server's tools, hands their schemas to Claude, runs whatever Claude asks for, and feeds the result back, until it has an answer.

Client lists tools Claude asks for a tool Server runs it Answer when done result back to Claude: loop until the task is done

This is the same agentic loop a chat window doesn't have: the model can act, see the result, and decide what to do next. MCP is just how the tools get there.

08
Tutto.Lesson 7 · Resources & prompts
Lesson 7

Resources: data to pull in, addressed by URI

Read-only data the server exposes at an address. No side effects: think GET, not POST.

@mcp.resource("docs://documents") direct: returns the whole list docs://documents/{id} templated: a parameter picks one item read Returns data no side effects · safe to read anytime like a GET endpoint, addressed by URI contrast tools, which do things

A URI scheme like docs:// names the data. Direct resources return a collection; templated ones take a parameter to fetch exactly one: a single document, a single record.

09
Tutto.Lesson 8 · Resources & prompts
Lesson 8

The app decides which resources to load

Unlike tools, the model doesn't reach for resources. The application (often the user) chooses what context to bring in.

User picks @report.pdf Client reads list, then read by URI Into context contents dropped in for the model Application-controlled: the host surfaces resources as @-mentions you choose from.

That's the difference from a tool: a tool is the model's to call, a resource is the app's to load. Same server, two different control models, which is the heart of MCP.

10
Tutto.Lesson 9 · Resources & prompts
Lesson 9

Prompts: reusable templates the author ships

A tested, parameterized prompt the server exposes, so the right wording is baked in instead of reinvented every time.

@mcp.prompt() def summarize(doc_id): a parameter to fill expert wording, written once expands to A full message "Summarise document {doc_id}, three bullets…" ready to send to the model

Prompts move hard-won phrasing out of people's heads and into the server. The author tunes it once; everyone else just calls it and gets the good version.

11
Tutto.Lesson 10 · Resources & prompts
Lesson 10

Prompts surface as slash commands

The client lists the server's prompts and offers them to the user. Pick one, fill the arguments, and it expands into the full message.

User types /summarize Fill arguments which doc? how long? Sent to the model expanded, ready to run User-controlled: the user triggers it deliberately, not the model, not the app.

If you've used a slash command in Claude Code, you've used an MCP prompt. The server ships the command; the client makes it a one-keystroke action.

12
Tutto.Lesson 11 · Recap
Lesson 11: if you take one thing away

Three primitives, three owners

The whole protocol, in one picture: what the server exposes, and who gets to trigger each one.

Tools model-controlled actions · the model calls them Resources application-controlled data · the app loads them Prompts user-controlled templates · the user triggers them all exposed by a server, reached by a client inside your host over JSON-RPC, on stdio (local) or HTTP (remote)

Everything in the course hangs off this: tools the model calls, resources the app loads, prompts the user triggers. Get the owners straight and the rest follows.

13
Tutto.Praxis
The whole thing, in one line

One protocol.
Three primitives.
Any tool, any app.

Tools, resources and prompts, exposed by a server and reached by a client inside your host, so context and capability plug in once instead of being rebuilt every time.

tutto.one/praxis · daniel@tutto.one

14
← → or space · F11 fullscreen