动态

两块真板找出了一处规范违规

作者: makemind · 2026年7月31日

七月最后一周。这一周 没有模拟器。校验没有板子也不会通过。

本周 Signal

开发板交出了自己的画面。开发板交出自己的画面」把桌上的 STM32H723 用 USB 串口接上,把用 mDNS 找到的 ESP32 用 Wi-Fi TCP 接上。两块板各自给出画面定义,按下按钮 LED 是真的会亮。客户端代码在两种情况下一个字都不差——变的只有启动哪个桥接程序。

三台终端接到了同一颗芯片上。接到一颗芯片上」在店里的收款终端旁边立一个服务端,接上平板、PC 和后厨屏。三台机器一个 App 都没做,刷卡授权那条路一行都没碰。

工具与包的备忘

这周真正的收获不是文章,而是 找到的缺陷。一接上真板,listResources() 当场就死。

type 'Null' is not a subtype of type 'String' in type cast

一开始怀疑板子。可 MCP 规范里 resource 的 description 是可选的,板子只是没发而已。板子是对的。mcp_client 1.1.1 把这个字段当成非空来转换,而 2.1.0 里早已修好。

为什么到现在才看见?因为调 listResources() 的使用者很少。只跑 initialize → tools/list → tools/call → resources/read 的路径根本不经过那段代码。把规范里可选的字段当必填来接的解析器,只有遇到遵守规范的对方时才会死。 而这场相遇,通常发生在实物接上来的那一天。

一点想法

模拟器通常是按我们写的样子回答的。所以我们理解错的地方,它会原样放行。这周确认的既不是性能也不是便利,而是这件事——真实硬件不会同意我们的想当然。

下个月

往现场终端走。排队、拣货动线、交接班、断网的收银台。


makemind.dev 「动态」— 每周一次,这一周上了什么,做的时候又卡在哪儿。

Twitter