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 -->

第一次握手到调用 echo

图解: 按顺序看清一来一回的协议消息。 图按课程中的协议实现绘制;通知没有 id,也没有对应响应。

<!-- bread-visual:end -->

2. 跑起来

cd ch01_min_server
python test_by_hand.py

test_by_hand.py 会:

  1. 启动 server.py 子进程。
  2. 依次发送初始化请求、初始化完成通知、工具列表请求、echo 调用和一个错误请求。
  3. 打印发出的消息及收到的响应;通知不等待响应。
  4. 最后显示服务端的 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
...

image-20260610181711531

对照输出,先看握手怎样结束,再看工具列表和调用结果。注意 initialized 是通知,不会像请求一样收到对应响应。

试读到这里 · 后续内容已封存

关注公众号,继续把这章学完

在「AI面包君」发送关键词「学习AI」拿到口令。验证一次,这个浏览器就能继续阅读全部课程。