无状态 MCP 为何重新值得关注
MCP 2.0,也就是 2026-07-28 版 Model Context Protocol 规范,带来了 MCP 自发布以来最重要的一次变化:无状态 MCP。
MCP(Model Context Protocol)是一种标准协议,用于向由大语言模型驱动的 Agent 框架暴露外部工具。它在 2024 年 11 月由 Anthropic 推出,2025 年曾获得大量关注。后来,随着 Anthropic 的 Skills 机制出现,以及 Agent 可以通过终端和 curl 更灵活地完成许多类似任务,MCP 的热度有所下降。
但无状态 MCP 让它重新变得有吸引力。让 Agent 拥有 Shell 环境和互联网访问能力存在明显风险,而且需要模型具备足够强的环境操作能力。相比之下,MCP 工具更容易审计和控制,接口也足够简单,小型本地模型也能较好调用。
无状态 MCP 简化了什么
旧版有状态 MCP 通常需要两次 HTTP 请求:
- 初始化会话,获取
Mcp-Session-Id - 携带该会话 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
为了交互式探索 MCP 服务,一个新的 Python CLI 工具 mcp-explorer 被构建出来。它支持无状态 MCP,并且可以通过 uvx 直接运行:
uvx mcp-explorer list https://agentic-mermaid.dev/mcp
这个命令会查询一个 Mermaid 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 a Mermaid source string to themeable SVG. Returns { ok, svg }.
Render a Mermaid source string to text. Returns { ok, text }.
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
构建这样的 CLI 工具,是熟悉新协议的一种高效方式,即使大部分实际代码由编码 Agent 协助完成。
datasette-mcp:让 Datasette 暴露 MCP 端点
另一个项目是 datasette-mcp,它是一个 Datasette 插件,可以为任意 Datasette 实例添加 /-/mcp 端点。
该插件提供三个工具:
list_databases():列出数据库get_database_schema(database_name):获取指定数据库的 Schemaexecute_sql(database_name, sql):执行 SQL 查询,目前为只读
把这些工具接入 Agent,或接入 ChatGPT、Claude 这样的聊天工具后,它们就可以针对托管的 Datasette 实例运行 SQL 查询。
在一次 Claude 会话中,用户先询问:
list tables in simonwillison.net
然后继续询问:
what has Simon said recently about MCP?
Claude 为了回答这个问题运行了 7 条独立 SQL 查询。
llm-mcp-client:为 LLM 工具接入 MCP
llm-mcp-client 是一个 alpha 阶段插件,目标是为 LLM 命令行工具提供 MCP 集成。示例用法:
llm install llm-mcp-client
llm -T 'MCP("https://datasette.simonwillison.net/-/mcp")' 'count the notes'
一次运行中,模型根据问题“count the notes”判断需要统计博客笔记数量,并返回:
There are 151 notes.
该插件成熟后,可能会被考虑纳入 LLM 工具核心部分。后续也计划在 Datasette Agent 和 llm-coding-agent 中继续实验 MCP。
MCP 可能是更安全的 Agent 构建方式
MCP 并非没有安全问题。早期 MCP 模式允许终端用户混合搭配工具,这会把避免数据外泄攻击的责任部分转移给用户。提示注入与工具组合风险依然需要认真处理。
不过,与给 Agent 任意 Shell 和开放网络访问权限相比,MCP 的能力边界更清晰,也更容易推理:
- 工具是明确暴露的
- 参数和返回结构可以被描述和审计
- 服务端可以限制工具行为
- 小模型也更容易稳定调用
对于构建涉及敏感数据或敏感操作的 LLM 应用来说,无状态 MCP 降低了协议实现复杂度,也让 Agent 能力控制更加可管理。