无状态 MCP 重新点燃了我的兴趣(并催生了 mcp-explorer 和 datasette-mcp)
MCP 2.0 无状态规范发布,大幅简化客户端与服务器实现。作者借此构建了 mcp-explorer、datasette-mcp 和 llm-mcp-client 三个工具,并认为 MCP 比给 agent 直接开放 shell 更安全、更易于审计。
无状态 MCP 重新点燃了我的兴趣(并催生了 mcp-explorer 和 datasette-mcp)
本周二(7月28日)发布的 Model Context Protocol 2.0 规范,也就是常说的 Stateless MCP,是自 MCP 问世以来最重要的一次更新,也让作者重新燃起对这个协议的兴趣。
MCP 是 Anthropic 在 2024 年 11 月推出的模型上下文协议,为 LLM 智能体框架提供标准化的工具接入方式。它在 2025 年迅速走红,但后来被 Anthropic 的另一项发明 Skills 抢去风头,因为一个能使用终端和 curl 的智能体能以更灵活的方式完成 MCP 的绝大部分工作。不过作者现在又回到了 MCP 阵营:给智能体一个能访问互联网的 shell 环境风险很高,而且对模型能力要求高;相比之下,MCP 工具更容易审计和控制,即使是能在笔记本上运行的小模型也能较好地驱动它们。新规范还大幅降低了实现客户端和服务器的复杂度。
旧的状态化 MCP(作者称为 legacy MCP)需要两次 HTTP 请求:第一次初始化会话并获得 Mcp-Session-Id,第二次才真正调用工具。新的无状态方式只需一次请求,在请求头中带上 MCP-Protocol-Version、Mcp-Method 和 Mcp-Name 即可。这不仅让客户端和服务端实现更干净,也更适合构建可扩展的 Web 应用,因为不需要在服务端维护会话状态,也不用担心同一会话被路由到不同后端机器。
作者本周基于新规范构建了三个项目。第一个是 mcp-explorer,一个用 Python 写的无状态 CLI 工具,可以通过 uvx 直接运行,无需安装。它可以列出 MCP 服务器暴露的工具,例如查询 Ade Oshineye 的 agentic-mermaid.dev 演示服务器;可以用 inspect 查看工具的输入输出 JSON schema;还可以用 call 直接调用工具并传入参数,比如渲染一段 Mermaid 图表并获得 SVG。
第二个项目是 datasette-mcp,一个 Datasette 插件,为任意 Datasette 实例添加 /-/mcp 端点。它提供三个工具:list_databases()、get_database_schema(database_name) 和 execute_sql(database_name, sql),其中 execute_sql() 目前是只读的。接入 ChatGPT 或 Claude 后,这些工具就能让 AI 直接对你的 Datasette 实例执行 SQL 查询。作者已经把它跑在博客的 Datasette 镜像上,并分享了一段 Claude 会话,AI 通过 7 次 SQL 查询回答了“Simon 最近对 MCP 说了什么”。
第三个是 llm-mcp-client,这是作者为 LLM 工具开发的 MCP 插件 alpha 版。安装后可以用类似 llm -T 'MCP("https://datasette.simonwillison.net/-/mcp")' 'count the notes' 的命令让模型通过 MCP 查询数据。作者计划在成熟后将其直接整合进 LLM 核心,并尝试在 Datasette Agent 和 llm-coding-agent 中使用 MCP。
关于安全:作者在 MCP 发布后不久就写过提示注入的安全问题,认为让终端用户自由混搭工具会把防数据外泄的责任推给用户。但随后出现的通用智能体可以任意执行 shell 和 curl 命令,安全形势更加复杂。作者现在认为,MCP 的优势在于,相比在开放网络环境中任意执行命令,更容易梳理智能体的能力和可能出现的问题。他计划在基于 LLM 构建敏感应用时更多依赖 MCP。