AI・機械学習
ステートレスMCPが私の興味を再び掻き立てた
Stateless MCP has recaptured my interest (simonwillison.net)
要約
Simon Willison氏は、LLMエージェントフレームワーク向けの標準プロトコルであるModel Context Protocol(MCP)の新しいステートレス仕様について解説しています。この更新により、クライアントとサーバーの実装が大幅に簡素化され、スケーラブルなWebアプリケーション構築に適したものになりました。同氏は、この新仕様を活用したCLIツール「mcp-explorer」とDatasetteプラグイン「datasette-mcp」を開発し、MCPがエージェントの安全な構築に貢献すると述べています。
全文翻訳
Stateless MCP has recaptured my interest (and inspired mcp-explorer and datasette-mcp)
31st July 2026
火曜日はStateless MCPの日でした。MCP 2.0、あるいはより正式だが覚えにくい名前である2026-07-28 Model Context Protocol仕様のロールアウトです。これはMCP仕様が最初にローンチされて以来、最も重要な変更であり、このプロトコルに対する私の個人的な興味を再燃させることにもなりました。
背景として、MCPはModel Context Protocolの略で、LLM搭載エージェントフレームワークに新しいツールを公開するための標準的な方法を記述しています。これは2024年11月にAnthropicによって導入され、2025年の大半で大きな関心を集めましたが、その後、エージェントハーネスがターミナルとcurlへのアクセスを持つことで、MCPが提供する機能のほとんどをより柔軟な方法で実現できることが明らかになり、Skills(これもAnthropicの発明)にやや影が薄くなりました。私は2025年のレビューでそのことについて書きました。
私は今、MCPに戻ってきています。エージェントにインターネットにアクセスできるシェル環境を与えることはリスクを伴い、そのような環境を効果的に駆動できる強力なモデルが必要です。MCPツールは監査と制御が容易であり、ラップトップで実行できる小規模なモデルでもそれらを比較的うまく駆動できるほどシンプルです。新しいステートレスMCP仕様は、プロトコルのクライアントとサーバーの両方の実装の複雑さを大幅に軽減します。私は今週、そのうち3つを構築しました!
ステートレスMCPで何が容易になるか
ステートフルMCPとステートレスMCPの違いの最良のデモンストレーションは、新しい仕様のRCを紹介した5月21日のブログ記事にあります。そこには、明確な変更前後の例が含まれていました。古いステートフルMCP(「レガシーMCP」と呼びます)は、2つのHTTPリクエストを必要としました。1つ目はセッションを初期化しMcp-Session-Idを取得するため、2つ目は実際にツールを呼び出すためです。
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"
}
}
}
}
これは、クライアント側とサーバー側の両方の実装の観点から、はるかにクリーンです。また、サーバー側でセッションIDを追跡する必要がなくなり、同じセッションを同じバックエンドマシンにルーティングする心配もなくなったため、スケーラブルなWebアプリケーションの構築にも適しています。
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) - Mermaid SDKコードを実行します。隔離されたサンドボックスでJavaScriptを実行し、値を返します。
describe_sdk(family: string, detail?: string) - Mermaid SDK操作を記述します。1つのダイアグラムファミリーのバージョン一致したミューテーション操作を返します。
render_svg(source: string, options?: object) - MermaidをSVGとしてレンダリングします。Mermaidソース文字列をテーマ可能なSVGにレンダリングします。{ ok, svg }を返します。
render_ascii(source: string, useAscii?: boolean, targetWidth?: integer, options?: object) - Mermaidをテキストとしてレンダリングします。Mermaidソース文字列をテキストにレンダリングします。{ ok, text }を返します。
render_png(source: string, scale?: number, background?: string, fitTo?: object, options?: object) - MermaidをPNGとしてレンダリングします。Mermaidソース文字列をPNGにラスター化します。{ ok, png_base64 }を返します。
...
次にツールを検査するには:
uvx mcp-explorer inspect render_svg
これは、入力と出力のJSONスキーマを含む多くの情報を出力します。そのツールを呼び出し、引数を渡すには:
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ツールを構築することは、仕様に慣れるための非常に生産的な方法だと感じています。
datasette-mcp
2番目のプロジェクトはdatasette-mcpです。これは、任意のDatasetteインスタンスに/-/mcpエンドポイントを追加するDatasetteプラグインです。これはおそらく私がこのプラグインを構築しようとした4回目ですが、新しいステートレスMCP仕様のおかげで、ついにリリースできると感じるバージョンができました。それは3つのツールのみを提供します:list_databases()、get_database_schema(database_name)、およびexecute_sql(database_name, sql)です。これらは期待通りのことを行います(ただし、execute_sql()は現在のところ読み取り専用です)。これらをエージェントや、ChatGPTやClaudeのようなチャットツールに接続すれば、ホストされているDatasetteインスタンスに対してSQLクエリを実行できるようになります。今のところ、私はそれを私のブログのDatasetteミラー、datasette.simonwillison.net/-/mcpで実行しています。それをChatGPTやClaudeに接続する方法を理解するには少し手間がかかりましたが、最終的にはできました。ここに、その方法を正確に示す新しいTILがあります。ここに共有されたClaudeセッションがあります。そこで私は次のように尋ねました。
simonwillison.netのテーブルを一覧表示してください。
そして:MCPについてSimonは最近何を言っていますか?
それは、答えを見つけるために7回の個別のSQLクエリを実行しました。
llm-mcp-client
私のLLMツールは、公式のMCP統合がずっと前から必要でした。新しいアルファ版のllm-mcp-clientプラグインは、まさにその試みです。
llm install llm-mcp-client
llm -T 'MCP("https://datasette.simonwillison.net/-/mcp")' 'count the notes'
以下は出力です(推論トレースを含む。LLM 0.32rc2を使用しています):
ノート数を考慮する
「ノート数を数える」という質問は、おそらくブログのノートを集計することを求めているのだと思います。公開されたノートや下書きを意味する可能性もあり、曖昧さがあります。公開されたノートと下書きの両方のカウントをクエリして明確な答えを得ることで、ノートの総数を把握する必要があるでしょう。そのカウントを実行しましょう!
ノートは151件です。
そして、そのプロンプトに対するllmログの出力です。
これが完全に完成したら、LLMコアに直接組み込むことを検討しています。Datasette Agentやllm-coding-agentでもMCPを実験することを楽しみにしています。
MCPはエージェントとの安全な構築方法です
MCPが最初にリリースされてから数ヶ月後、私は「Model Context Protocolにはプロンプトインジェクションのセキュリティ問題がある」と書き、エンドユーザーがツールを混在させるパターンが、データ漏洩攻撃を回避する責任をユーザー自身に押し付けることを指摘しました。私はまだLethal Trifectaという言葉を考案していませんでしたが、まさにそれを念頭に置いていました。その後、任意のシェルとcurlアクセスを持つ汎用エージェントが登場し、それはセキュリティを維持するのがはるかに困難になりました!
MCPについて私が評価するようになったのは、今日のほとんどの汎用およびコーディングエージェントツールでデフォルトとなっている、開かれたネットワーク環境での任意のコマンド実行と比較して、エージェントの機能と何が起こりうるかを推論するのがはるかに容易であるということです。LLM上に機密性の高いアプリケーションを構築する際には、MCPにさらに多くのことを依存するつもりです。