这个坑值得记一笔。用 mcp python-sdk 1.2 写了一个文件类 server,实现了 resources/subscribe,客户端是 Claude Desktop,改了文件之后一直收不到 notifications/resources/updated,重新 list 才能看到新内容。

刚开始盯着「客户端版本不支持资源订阅,只实现了 list 与 read」,折腾了半个多小时,排掉了。

这类报错背后常见的原因有几处,逐个排除就行。server 端收到 subscribe 后没有把 uri 存下来;变更通知发在了 stdout,被 stdio 协议当垃圾数据丢弃;通知里的 uri 与订阅时传的不完全一致,客户端匹配不上。

上来先用 inspector 连上看能否收到订阅确认

npx @modelcontextprotocol/inspector python server.py

然后确认能力声明里带了 resources.subscribe

python -c "print({'capabilities':{'resources':{'subscribe':True}}})"

再往下把每条通知的 uri 打出来与订阅值比对

python -c "print({'subscribed':'file:///docs/a.md','notified':'file:///docs/a.md'})"

通知走协议接口而不是手写 stdout

python -c "print('await session.send_resource_updated(AnyUrl(uri))')"

怎么算真的好了,看的是同一批现象。改文件后客户端在一秒内收到 updated 通知并自动重读,inspector 的日志里能看到请求与通知成对出现。

这里还有个坑。stdio 模式下 stdout 是协议通道,任何 print 都会污染消息流,调试信息一律走 stderr,这是自建 MCP server 最常见的坑。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189