02Bread MCP · 第 4 章
总进度 13 / 33

真实工具集 MCP server

echo 帮我们看清了通信过程,这一章换成读文件、列目录和查时间。它们仍走同样的协议,变化主要发生在工具的注册和执行部分:

2026-09-28约 35 分钟180 行代码难度 ★★

如果想获取全套课程资料,请关注微信公众号 「AI面包君」,回复 「课程资料」 即可领取。

1. 在同一个服务里提供多个工具

echo 帮我们看清了通信过程,这一章换成读文件、列目录和查时间。它们仍走同样的协议,变化主要发生在工具的注册和执行部分:

工具作用
read_file读取文本文件内容
list_dir列出目录下文件
get_time返回当前系统时间

工程上的关键升级有 4 点:

  1. dispatch 表注册工具(不再 if-elif 一堆)
  2. schema 和实现配对存放(看 TOOL_REGISTRY)
  3. 工具失败用 isError=true 返回(不抛异常给协议)
  4. handler 也用 dict 分发(看 HANDLERS)

TOOL_REGISTRY 把工具描述和函数放在同一项里。新增工具时补上一项,列出工具和按名称调用的逻辑就能继续复用。

文件结构:

ch03_real_tools/
├── server.py    # 真实工具集 server
├── client.py    # ch02 的 MCPClient(复用)
├── demo.py      # 演示脚本:连 server + 调 4 个用例
└── README.md
<!-- bread-visual:start -->

同一份注册表,两种用途

图解: TOOL_REGISTRY 把工具的说明书和实现放在一起。 schema 参数要与实现一致;调用失败用 isError=true 表示,server 仍可运行。

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

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 + 错误说明。

<!-- bread-visual:start -->

工具可用,工具报错也可被处理

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

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

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