02Bread MCP · 第 4 章
总进度 13 / 33真实工具集 MCP server
echo 帮我们看清了通信过程,这一章换成读文件、列目录和查时间。它们仍走同样的协议,变化主要发生在工具的注册和执行部分:
2026-09-28约 35 分钟180 行代码难度 ★★
如果想获取全套课程资料,请关注微信公众号 「AI面包君」,回复 「课程资料」 即可领取。
1. 在同一个服务里提供多个工具
echo 帮我们看清了通信过程,这一章换成读文件、列目录和查时间。它们仍走同样的协议,变化主要发生在工具的注册和执行部分:
| 工具 | 作用 |
|---|---|
read_file | 读取文本文件内容 |
list_dir | 列出目录下文件 |
get_time | 返回当前系统时间 |
工程上的关键升级有 4 点:
- dispatch 表注册工具(不再 if-elif 一堆)
- schema 和实现配对存放(看
TOOL_REGISTRY) - 工具失败用
isError=true返回(不抛异常给协议) - handler 也用 dict 分发(看
HANDLERS)
TOOL_REGISTRY 把工具描述和函数放在同一项里。新增工具时补上一项,列出工具和按名称调用的逻辑就能继续复用。
文件结构:
ch03_real_tools/
├── server.py # 真实工具集 server
├── client.py # ch02 的 MCPClient(复用)
├── demo.py # 演示脚本:连 server + 调 4 个用例
└── README.md
<!-- bread-visual:start -->

<!-- bread-visual:end -->图解: TOOL_REGISTRY 把工具的说明书和实现放在一起。 schema 参数要与实现一致;调用失败用 isError=true 表示,server 仍可运行。
2. 跑起来
cd ch03_real_tools
python demo.py
预期输出:
已连接: bread-mcp-fs v0.1.0
--- list_tools ---
read_file 读取一个文本文件的内容(超过 4000 字会截断)。
list_dir 列出一个目录下的文件和子目录。
get_time 返回服务器当前的本地时间(精确到秒)。
--- 调 get_time ---
结果: 2026-05-17 23:01:23 (error=False)
--- 调 list_dir(.) ---
结果:
FILE README.md
FILE client.py
FILE demo.py
FILE server.py
--- 调 read_file(README.md) ---
前 200 字: # 第 3 章 ...
--- 调一个会出错的:read_file(不存在的文件) ---
isError=True, 错误信息: FileNotFoundError: ...
最后一行重点看——工具执行报错时,server 没崩,而是返回了 isError=true + 错误说明。

试读到这里 · 后续内容已封存
关注公众号,继续把这章学完
在「AI面包君」发送关键词「学习AI」拿到口令。验证一次,这个浏览器就能继续阅读全部课程。