这个坑值得记一笔。用 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 最常见的坑。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。
