無狀態 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。