展开本页目录
开始前准备什么
- 下载本题完整练习包,区分待实现 starter 与作者完成 reference。
- 按README准备本题原生依赖;所有输入均为原创或明确标注的本地fixture。
- 本地练习不需要付费模型Key;真实模型调用未执行,MiniLM题另有明确实际推理说明。
- 启动原生服务
- 声明订阅能力
- 订阅指定资源
- 修改并收通知
- 取消后再修改
- 主动回读新版
- 复跑客户端
原创输入、待完成starter、作者reference及实际运行产物,依README本地准备依赖。
环境要求、具体操作、产物核对与未运行范围。
1. 启动原生服务
下载 server.py 与 verify.py,安装锁定的 MCP Python SDK。服务通过 stdio 运行在独立子进程,提供 exercise://notes/a 和 b 两个资源,不连接真实工作文件或模型。
2. 声明订阅能力
本题采用与2025-11-25资源规范对应的 SDK 1.25.0 接口。初始化明确声明 resources.subscribe;仅有 resources/list 并不代表客户端可以假设订阅一定受支持。
本地启动与复现
cd reference
python3 verify.py3. 订阅指定资源
客户端先读取 a 的 version 1,再发送 resources/subscribe。URI 是订阅键;a 与 b 必须保持独立,工具调用只是本题用来触发本地版本变化的入口。
4. 修改并收通知
先更新未订阅的 b,确认没有通知;再更新 a,原生 ClientSession 的 message handler 收到一次 resources/updated。通知只给出发生变化的 URI,需要另行读取内容。
5. 取消后再修改
调用 resources/unsubscribe 后再更新 a。已经收过的历史通知不会从日志中消失,但本次不应多收到一条;应比较通知数量的增量,而不是要求日志清空。
6. 主动回读新版
取消订阅不撤销读取权限。客户端主动 read_resource 仍能得到 version 3,这与“服务器仍在推送”是两件不同的事。
7. 复跑客户端
运行 python3 verify.py,回读初始化能力、订阅更新、未订阅资源和取消后行为。这里实际执行的是 SDK 服务与客户端,没有调用聊天模型,也没有把固定通知数组当作协议执行。
怎样确认已经完成
- 初始化能力声明resources.subscribe,订阅后更新目标URI能收到通知。
- 未订阅URI更新不产生通知,取消后新增通知数为零。
- 取消不影响主动读取新版内容,历史通知日志仍保留。
常见问题
MCP工具之外,文件变化能主动通知客户端吗?
可以,服务器声明resources.subscribe后,客户端订阅指定URI,更新时发resources/updated,客户端再主动读取内容。本文用真实stdio SDK链路验证。
MCP取消订阅后为什么还在收到旧通知?
取消不会删除已经收到的历史日志。应比较取消后通知增量;本题再次更新a后没有新通知,但主动读取仍能看到新版。
哪些部分实际运行,哪些需要独立验证?
MCP SDK stdio服务与客户端已实跑资源订阅、更新通知、未订阅URI隔离与取消后不新增通知;未调用LLM。 目标AI助手账号生成、云平台部署和生产环境不在本次执行范围。




