How the Model Context Protocol works — and how it differs from a traditional API
GET /v1/usersPOST /v1/ordersEvery integration is bespoke: you read the docs, hand-write a client for that service's endpoints, and update it whenever the API changes. One service = one custom integration.
stdio (local) or HTTP + SSE (remote) — two-way, stateful
tools/list with every tool's name, description, and input schema. No docs to read — the server describes itself.tools/call; the server runs it (search a corpus, query a DB, hit an API) and returns the result.One protocol, unlimited servers. Write the server once; every MCP-compatible host can use it with zero per-client integration code.
| Traditional API | MCP | |
|---|---|---|
| Who decides what to call | You, in code, ahead of time | The model, per conversation, from tool descriptions |
| Discovery | Read the docs, hand-write a client | tools/list — the server describes itself |
| Integration cost | Bespoke per service | One protocol; any host works with any server |
| Transport | Usually HTTP REST | JSON-RPC 2.0 over stdio or HTTP+SSE |
| Primitives | Endpoints with fixed shapes | Tools (actions), Resources (data), Prompts (templates) |
| Data access | Remote service, API keys | Often local — the server runs next to your data |
| Changes | Client code breaks, you patch it | Server updates its descriptions; model adapts |
tools/list → sees 4 toolsYou ask "what needs my eyes?" → the model sees the
tracking tool description → calls tracking(status="needs-eyes") →
server.py reads data.json → the model summarizes the result. No endpoint was hard-coded for
that question — the model composed it from the tool's description.