使用说明
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开始往下走。
