one host, stateless JSON-RPC requests, three primitives
Host (LLM app)
Claude Desktop / Claude Code / ChatGPT
LLM runtime
model + prompt + context
MCP client
one per server mounted
user UI / approval
slash commands, confirms
JSON-RPC 2.0 (stdio / HTTP)
_meta each request • discover optional
Server
your code: FastMCP / SDK / custom
Tools
functions the model calls; JSON Schema input
Resources
URI-addressed read-only content
Prompts
user-invoked templates (slash commands)
protocol version and client capabilities travel in params._meta on every request.
destructive tools set destructiveHint: true so the host can gate on human approval.