无状态 MCP 为何重新值得关注

Simon Willison2026-08-02 05:03

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 请求:

  1. 初始化会话,获取 Mcp-Session-Id
  2. 携带该会话 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):获取指定数据库的 Schema
  • execute_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 能力控制更加可管理。

评论

请登录后发表观点

暂无数据