MCP协议实现教程

一个从零开始构建Model Context Protocol(MCP)的教程,涵盖从基础JSON-RPC到官方SDK集成的全过程。

  • by brianwang00001
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 brianwang00001/mcp-from-scratch

使用说明

MCP从头开始

该项目完全由AI Agent生成。

构建 模型上下文协议 (MCP)从第一性原理出发。从stdio上的原始JSON-RPC开始,构建一个自定义服务器和客户端,然后将它们交换为官方SDK。

这个项目背后的想法

我最初构建这个项目是为了了解MCP的工作原理。我没有直接进入官方库,而是提示一个AI Agent(主要是Sonnet 4.6)从头开始生成一个风格的教程。

会话0 因为预热涵盖了大多数原子成分,例如 stdioJSON模式和 asyncio 库,这对于构建MCP服务器和客户端的玩具版本是必要的(希望是足够的)。

自 第1节 到 第5节,我们构建了一个玩具版的MCP,它反映了真实MCP的API。在那之前,我们没有使用官方提供的任何实际功能 mcp 图书馆。我们只是使用基本的Python组件构建一切。

它只在 最后一次会议 我们拿出我们的代码,把一些玩具类换成MCP库中的真实类,然后看着它仍然工作!

通过这样做,我们可以更好地掌握引擎盖下的机制。这就是为什么从头开始构建东西一直是我最喜欢的学习方式之一,我希望这对你也有帮助。

先决条件

  • Python 3.10+
  • 紫外线
  • 虚拟大语言模型 (适用于模块5和6)

堆栈

┌──────────────────────────────────────────────────────────┐
│  06 — Real LLM loop   (swap toys → real mcp + FastMCP)  │
├──────────────────────────────────────────────────────────┤
│  05 — Toy LLM loop    (ToyMCP + ToyClientSession + vLLM) │
├──────────────────────────────────────────────────────────┤
│  04 — ToyClient       (mirrors mcp.ClientSession)        │
├──────────────────────────────────────────────────────────┤
│  03 — ToyMCP class    (modules 1+2 combined)             │
├──────────────────────────────────────────────────────────┤
│  02 — Tool introspection  (decorators + type hints → schema) │
├──────────────────────────────────────────────────────────┤
│  01 — The wire        (raw JSON-RPC over stdio)          │
├──────────────────────────────────────────────────────────┤
│  00 — Concepts + Warmup                                  │
└──────────────────────────────────────────────────────────┘

模块

00-概念和热身(00_concepts/, 00_warmup/)

阅读协议基础知识。练习稍后使用的Python模式(异步、子进程、检查)。

01-电线(01_the_wire/)

仅使用构建服务器 sys 和 json。这只是stdin/stdout上的JSON-RPC。

02--反思(02_introspection/)

编写一个装饰器,将Python函数转换为JSON模式工具定义。

03-ToyMCP(03_toy_mcp/)

将模块1和2组合成一个 ToyMCP 类。它看起来像FastMCP,但它是你的。

04--玩具客户端(04_toy_client/)

构建客户端。将服务器作为子进程生成,并通过管道与之通信。

05--玩具LLM环(05_llm_loop_toy/)

将玩具客户端和服务器连接到本地LLM(vLLM)以构建功能代理。

06--真正的LLM环路(06_llm_loop_real/)

最后一步。把你的玩具换成正式的 mcp 图书馆。逻辑是一样的。


设置

# Run an exercise
uv run python <module>/exercise/<file>.py

# vLLM (Modules 5 & 6)
vllm serve Qwen/Qwen3.5-9B --enable-auto-tool-choice --tool-call-parser qwen3_xml --port 8000

每个文件夹都有一个 exercise/ (填空)和a solution/.从00开始往下走。