02Bread MCP · 第 2 章
总进度 11 / 33最简 MCP server(echo 工具)
MCP 在 JSON RPC 消息之上约定了初始化流程、能力声明和一组方法。先看看表中的方法各自做什么;服务端支持哪些能力,要在初始化时明确说明。
2026-09-28约 45 分钟120 行代码难度 ★★
如果想获取全套课程资料,请关注微信公众号 「AI面包君」,回复 「课程资料」 即可领取。
1. 用 echo 观察一次完整调用
MCP 在 JSON-RPC 消息之上约定了初始化流程、能力声明和一组方法。先看看表中的方法各自做什么;服务端支持哪些能力,要在初始化时明确说明。
| 方法 | 用途 |
|---|---|
initialize | 握手。客户端和服务端交换协议版本、各自支持的能力 |
tools/list | 列出我有哪些工具 |
tools/call | 调用一个工具 |
resources/list / resources/read | (进阶)暴露文件等资源 |
prompts/list / prompts/get | (进阶)暴露 prompt 模板 |
这一章我们实现最基础的 3 个:initialize / tools/list / tools/call。
服务端先只提供 echo:收到什么文本,就返回什么文本。这样结果容易核对,你可以把注意力放在请求怎样进入、响应怎样返回上。
本章用测试脚本逐条发送消息,下一章再把重复的收发和连接管理封装进 client。
<!-- bread-visual:start -->
<!-- bread-visual:end -->图解: 按顺序看清一来一回的协议消息。 图按课程中的协议实现绘制;通知没有 id,也没有对应响应。
2. 跑起来
cd ch01_min_server
python test_by_hand.py
test_by_hand.py 会:
- 启动
server.py子进程。 - 依次发送初始化请求、初始化完成通知、工具列表请求、echo 调用和一个错误请求。
- 打印发出的消息及收到的响应;通知不等待响应。
- 最后显示服务端的 stderr 日志。
预期输出大致:
--> {"jsonrpc": "2.0", "id": 1, "method": "initialize", ...}
<-- {"jsonrpc":"2.0","id":1,"result":{"protocolVersion":"2024-11-05",...}}
--> {"jsonrpc": "2.0", "method": "notifications/initialized"}
--> {"jsonrpc": "2.0", "id": 2, "method": "tools/list"}
<-- {"jsonrpc":"2.0","id":2,"result":{"tools":[{"name":"echo",...}]}}
--> {"jsonrpc": "2.0", "id": 3, "method": "tools/call", "params": {"name": "echo", ...}}
<-- {"jsonrpc":"2.0","id":3,"result":{"content":[{"type":"text","text":"echo: 你好 MCP"}],...}}
--> {"jsonrpc": "2.0", "id": 4, "method": "no_such_method"}
<-- {"jsonrpc":"2.0","id":4,"error":{"code":-32601,...}}
=== server 退出,返回码 = 0
=== server stderr ===
[server] started, protocol=2024-11-05
[server] initialize from test-by-hand 0.1.0
...

对照输出,先看握手怎样结束,再看工具列表和调用结果。注意 initialized 是通知,不会像请求一样收到对应响应。
试读到这里 · 后续内容已封存
关注公众号,继续把这章学完
在「AI面包君」发送关键词「学习AI」拿到口令。验证一次,这个浏览器就能继续阅读全部课程。