无状态 MCP 重新勾起了我的兴趣

查看原文 HN 讨论

文章摘要

Simon Willison 把 2026 年 7 月 28 日称作「无状态 MCP 日」——MCP 2.0(正式名称是 2026-07-28 版模型上下文协议规范)的发布,是 MCP 自诞生以来最重大的一次变更,也重新点燃了他个人对这个协议的兴趣。

他先交代背景:MCP 是 Anthropic 于 2024 年 11 月推出的、向 LLM agent 框架暴露工具的标准方式,在 2025 年大部分时间里热度极高,随后被 Skills(同样出自 Anthropic)盖过了风头——因为大家发现,一个能用终端和 curl 的 agent 框架,可以用更灵活的方式做到 MCP 能做的大部分事情。而他现在正在转回来,理由有两条:第一,给 agent 一个能访问互联网的 shell 环境风险很大,而且需要一个足够强的模型才能有效驱动这种环境;相比之下 MCP 工具更容易审计和控制,简单到能在笔记本上运行的小模型也能把它们用得不错。第二,新的无状态规范大大降低了客户端和服务端的实现复杂度——他一周之内就写了三个。

具体差别在于:旧的有状态 MCP(他称之为「legacy MCP」)需要两次 HTTP 请求,第一次初始化会话拿到 Mcp-Session-Id,第二次才真正调用工具;新的无状态方式只需要一次 POST,通过 MCP-Protocol-VersionMcp-MethodMcp-Name 等请求头加上 JSON-RPC 载荷一次搞定,客户端信息挪进了 _meta 字段。这不仅让两端实现都干净得多,也更适合构建可伸缩的 Web 应用——服务端不再需要维护会话 ID 状态,也不用操心把同一会话路由到同一台后端机器。

他随后介绍了自己一周内做出的三个项目。mcp-explorer 是一个无状态的 Python CLI 工具,用来交互式探查 MCP 服务器,通过 uvx 免安装即可试用,支持 list 列出工具、inspect 查看某个工具(包括输入输出的 JSON schema)、call 带参数调用。他认为构建这类 CLI 工具是熟悉一份规范极其高效的方式,哪怕大部分代码是 agent 写的。datasette-mcp 是给任意 Datasette 实例加上 /-/mcp 端点的插件——这已经是他第四次尝试写这个插件,多亏新的无状态规范才终于做出一个自己满意、愿意发布的版本;它只提供三个工具:list_databases()get_database_schema(database_name)execute_sql(database_name, sql)(目前只读)。接到 agent 或 ChatGPT、Claude 这类聊天工具上,它们就获得了对你托管的 Datasette 实例执行 SQL 查询的能力;他把它跑在自己博客的 Datasette 镜像上,问「Simon 最近关于 MCP 说了什么」时模型跑了 7 条独立 SQL 查询才给出答案。第三个是 llm-mcp-client,给他的 LLM 命令行工具补上官方 MCP 集成的 alpha 版插件,他正考虑把它直接并入 LLM 核心。

文章最后一节的观点值得单独拎出来:MCP 是构建 agent 更安全的方式。他回顾了自己早年写的《模型上下文协议存在提示注入安全问题》一文——当时他指出,让终端用户自由搭配工具的模式,把避免数据外泄攻击的责任推给了用户自己(那时他还没造出「致命三要素 / Lethal Trifecta」这个词,但想的正是这件事)。然而随后拥有任意 shell 和 curl 权限的通用 agent 出现了,那要安全得多难得多。他现在体会到的是:相比在开放网络环境里执行任意命令(今天多数通用 agent 和编码 agent 工具的默认状态),MCP 让推理「agent 有哪些能力、可能出什么错」容易得多。因此在构建敏感应用时,他打算大幅倒向 MCP。

HN 评论精华