post cover

Simon Willison:无状态 MCP 重新点燃了我的兴趣(并催生了 mcp-explorer 与 datasette-mcp)(2026-08-01)


本文为翻译/转载,原文使用 CC BY-NC-SA 4.0 协议发布。 原文作者:Simon Willison 原文标题:Stateless MCP has recaptured my interest (and inspired mcp-explorer and datasette-mcp) 原文链接:https://simonwillison.net/2026/Jul/31/stateless-mcp/ 原文发布:2026-07-31 本博客不参与任何商业变现(含 ads / 付费 / affiliate),本译文遵循 CC BY-NC-SA 4.0 条款发布。

【译者按】

MCP(模型上下文协议)自 2024 年 11 月由 Anthropic 推出以来,一直是国内 Agent 生态讨论的焦点;而 2026-07-28 发布的 MCP 2.0 规范将协议改为”无状态”模式——一次 HTTP 请求即可调用工具,无需维护会话 ID。本文是 Simon Willison 对新规范的亲测报告:他一周内基于新规范写出了 mcp-explorer、datasette-mcp、llm-mcp-client 三个开源工具,并系统对比了”给 Agent 一个 shell + curl”与”受控 MCP 工具”两条路线的安全权衡。对中文圈读者来说,这是理解 MCP 2.0 迁移价值的第一手资料,也呼应了国内围绕”Agent 到底该给多大权限”的持续讨论——MCP 的”白名单式”工具接口,正是一种务实的中间路线。

【正文】

2026 年 7 月 31 日

周二(7 月 28 日)是”无状态 MCP 日”——MCP 2.0 正式发布,用更正式但更难记的名字说,就是 2026-07-28 版 Model Context Protocol 规范。这是 MCP 规范自首次发布以来最重大的一次变更,也重新点燃了我个人对这个协议的兴趣。

背景补充:MCP 即 Model Context Protocol(模型上下文协议),它定义了一种向 LLM 驱动的 Agent 框架暴露新工具的标准方式。它由 Anthropic 于 2024 年 11 月提出,在 2025 年的大部分时间里热度飙升,随后逐渐被 Skills(Anthropic 的另一项发明)盖过风头——因为人们发现,一个能访问终端和 curl 的 Agent 框架,大多数 MCP 能做的事它都能以更灵活的方式完成。我在 2025 年度回顾里写过这件事。

现在我又回到了 MCP 这边。给 Agent 一个能联网的 shell 环境风险重重,而且需要一个足够强的模型才能有效驾驭这样的环境。MCP 工具更容易审计和控制,而且足够简单,连跑在笔记本上的小模型也能很好地驱动它们。

新的无状态 MCP 规范还大幅降低了协议客户端和服务端的实现复杂度。我这周就用它写了三个工具!

无状态 MCP 让什么变得更简单了

展示有状态与无状态 MCP 之间差异的最佳范例,是 5 月 21 日那篇介绍新规范 RC 版本的博客文章,里面有一个清晰的”前后对比”示例。

旧的有状态 MCP(我打算叫它”传统 MCP”)需要两次 HTTP 请求——第一次初始化会话并获取 Mcp-Session-Id,第二次才真正调用工具:

POST /mcp HTTP/1.1
Content-Type: application/json

{
 "jsonrpc": "2.0",
 "id": 1,
 "method": "initialize",
 "params": {
   "protocolVersion": "2025-11-25",
   "capabilities": {
   },
   "clientInfo": {
     "name": "my-app",
     "version": "1.0"
   }
 }
}

POST /mcp HTTP/1.1
Mcp-Session-Id: 1868a90c-3a3f-4f5b
Content-Type: application/json

{
 "jsonrpc": "2.0",
 "id": 2,
 "method": "tools/call",
 "params": {
   "name": "search",
   "arguments": {
     "q": "otters"
   }
 }
}

新的无状态方式只需要一次 HTTP 请求,长这样:

POST /mcp HTTP/1.1
MCP-Protocol-Version: 2026-07-28
Mcp-Method: tools/call
Mcp-Name: search
Content-Type: application/json

{
 "jsonrpc": "2.0",
 "id": 1,
 "method": "tools/call",
 "params": {
   "name": "search",
   "arguments": {
     "q": "otters"
   },
   "_meta": {
     "io.modelcontextprotocol/clientInfo": {
       "name": "my-app",
       "version": "1.0"
     }
   }
 }
}

无论从客户端还是服务端的实现角度来看,这都干净太多了。它也更适合构建可扩展的 Web 应用:你不再需要维护服务端状态来跟踪那些会话 ID,也不必担心把同一会话路由到同一台后端机器上。

mcp-explorer

我一直没找到一个好用的、能交互式探查 MCP 服务器的 CLI 工具,于是让 Codex 帮我写了一个。

mcp-explorer 就是成果。它是一个无状态的 Python CLI 工具,甚至不用安装就能试用——配合 uvx 这样运行:

uvx mcp-explorer list https://agentic-mermaid.dev/mcp

这会查询 Ade Oshineye 的 agentic-mermaid.dev 演示 MCP。上面这条命令会返回如下工具列表:

execute(code: string, timeoutMs?: integer) - Execute Mermaid SDK code
 Run JavaScript in an isolated sandbox; return a value.

describe_sdk(family: string, detail?: string) - Describe Mermaid SDK operations
 Return version-matched mutation operations for one diagram family.

render_svg(source: string, options?: object) - Render Mermaid as SVG
 Render a Mermaid source string to themeable SVG. Returns { ok, svg }.

render_ascii(source: string, useAscii?: boolean, targetWidth?: integer, options?: object) - Render Mermaid as text
 Render a Mermaid source string to text. Returns { ok, text }.

render_png(source: string, scale?: number, background?: string, fitTo?: object, options?: object) - Render Mermaid as PNG
 Rasterize a Mermaid source string to PNG. Returns { ok, png_base64 }.
...

然后可以这样查看某个工具:

uvx mcp-explorer inspect render_svg

它会输出一大堆信息,包括输入输出的 JSON Schema。

要调用该工具并传入参数:

uvx mcp-explorer call \
 https://agentic-mermaid.dev/mcp \
 render_svg \
 -a source 'graph TD; A-->B' \
 -a options '{"padding":24}'

返回结果:

{"ok":true,"svg":"<svg xmlns=\"http://www.w3.org/2000/svg\" width=...

只想拿原始 SVG 的话,可以在命令后面加上 | jq .svg -r。我拿到了这张图

README 里还有几个命令,但你应该已经明白大致思路了。我觉得构建这样的 CLI 工具是熟悉一份规范的高效方式——哪怕大部分代码其实是 Agent 写的。

datasette-mcp

第二个项目是 datasette-mcp,一个给任意 Datasette 实例添加 /-/mcp 端点的 Datasette 插件。

这大概是我第四次尝试写这个插件了,但多亏了新的无状态 MCP 规范,我终于做出了一个值得发布的版本。

它只提供三个工具:list_databases()get_database_schema(database_name)execute_sql(database_name, sql)。它们做的事情和名字完全一致——只不过 execute_sql() 目前是只读的。

把它们接进一个 Agent,或者接进 ChatGPT、Claude 这类聊天工具,它们就获得了对你的托管 Datasette 实例执行 SQL 查询的能力。

目前我把它跑在我博客的 Datasette 镜像上:datasette.simonwillison.net/-/mcp。把它接入 ChatGPT 和 Claude 花了点功夫调试,但最后还是搞定了。这里有一篇新的 TIL记录了具体做法。

这是一个共享的 Claude 会话,我问它:

列出 simonwillison.net 中的表

然后又问:

Simon 最近关于 MCP 说了什么?

它跑了 7 条独立的 SQL 查询才得出答案。

llm-mcp-client

我的 LLM 工具早就该有一个官方的 MCP 集成了。新的 alpha 版 llm-mcp-client 插件正是我在这方面的尝试:

llm install llm-mcp-client
llm -T 'MCP("https://datasette.simonwillison.net/-/mcp")' 'count the notes'

这是输出(包括推理过程,我用的 LLM 0.32rc2):

正在考虑 note 数量

我理解”count the notes”这个问题大概是想让我统计博客笔记的总数。也可能是指已发布的笔记或草稿,所以这里存在一些歧义。我需要弄清楚笔记的总数,很可能是同时查询已发布笔记和草稿的数量才能得到清晰的答案。让我来执行这个统计!

共有 151 条笔记。

以及那次提示词的 llm logs 输出

等这个插件完全成熟后,我考虑直接把它并入 LLM 核心。我也很期待在 Datasette Agentllm-coding-agent 里实验 MCP。

MCP 是用 Agent 构建的更安全的方式

MCP 刚发布几个月后,我写过一篇《Model Context Protocol has prompt injection security problems》(MCP 存在提示注入安全问题),指出让终端用户自行混搭工具的模式,把防止数据外泄的责任推到了用户自己身上。那时我还没提出致命三连(Lethal Trifecta)这个概念,但我心里想的绝对就是它。

后来,拥有任意 shell 和 curl 权限的通用 Agent 出现了,那玩意儿要保证安全可难多了!

我对 MCP 越来越欣赏的一点是:与在开放网络环境里执行任意命令——如今大多数通用 Agent 和编码 Agent 工具的默认形态——相比,MCP 让你更容易推演 Agent 的能力边界和可能出问题的地方。

我打算在基于 LLM 构建敏感应用时,更多地倚重 MCP。

【译者注】

  1. MCP 2.0 / 无状态化背景:2026-07-28 发布的 MCP 2.0(无状态 MCP)是协议自 2024 年 11 月推出以来最大的一次变更。核心变化是每次请求都携带完整上下文(如 MCP-Protocol-VersionMcp-Method 等头部),服务端无需保存会话状态,天然适配 Serverless 与水平扩展。国内各大云厂商的 MCP 市场/网关大多已跟进支持该规范,迁移成本主要在于客户端 SDK 与工具注册方式。
  2. 有状态 vs 无状态:传统 MCP 需要 initialize 握手 + Mcp-Session-Id 会话管理,两次请求才能完成一次工具调用;新版单请求即可完成 tools/call,实现复杂度大幅下降,也让”给每个工具一个独立 URL/端点”的部署方式成为可能。
  3. Skills vs MCP 之争:Anthropic 2025 年推出的 Skills 让 Agent 直接通过终端 + curl 完成任务,一度让 MCP 热度回落。Simon 的观点很明确:shell 路线对模型能力要求高、风险大(对应其此前写的”Agent 越权操作”系列),而 MCP 工具是”白名单式”的受控接口。国内关于”给 Agent 完整终端 vs 受控工具集”的讨论与此高度相似。
  4. 致命三连(Lethal Trifecta):Simon Willison 提出的概念,指 LLM 应用中”不可信输入 + 不可信代码执行 + 不可信数据外泄通道”三者叠加形成的高危组合。本文中他进一步指出:无 shell 权限的 MCP 工具形态,恰好能拆掉这个三连中的关键一环。
  5. 三个工具均为开源(GitHub 仓库:simonw/mcp-explorer、datasette/datasette-mcp、simonw/llm-mcp-client),可自行试用。datasette-mcp 的 execute_sql 目前为只读,非常适合做”只读数据库问答”类应用;mcp-explorer 用 uvx 即可零安装体验。

【延伸阅读】