9月4日、LangChainが「MCP in LangChain: Stateless Protocol, Elicitation, and More!」と題した記事を公開した。ChatGPTユーザーによるMCPツール呼び出し回数が2026年を通じて98倍に増加し(8月だけで2倍以上)、Tier 1 SDKの月間ダウンロードが5億件に迫るなか、LangChainは2026年7月のMCPプロトコル大規模改定に追従する形でMCP対応を全面刷新した。ステートレス化・エリシテーション・ツールキャッシュなどの機能を取り込み、MCPサポートをメインパッケージへ統合している。
MCPサポートがメインパッケージに統合
従来は別パッケージ langchain-mcp-adapters として提供されていたMCPサポートが、**langchain.mcp としてメインパッケージに統合**された。インストールは以下のワンライナーで完結する:
pip install "langchain[mcp]"
なお langchain[mcp]>=1.4.0 が必要で、現時点ではベータ扱いのためAPIが変更される可能性がある。TypeScript対応は近日予定とされている。
既存ユーザーへの変更点として、MultiServerMCPClient は単一の MCPAdapter クラスに集約された。詳細はマイグレーションガイドを参照されたい。
最大の変更点:ステートレスプロトコルへの対応
旧仕様のMCPはセッションベースの設計だった。ツール呼び出しのたびにクライアントとサーバーがハンドシェイクしてセッションIDを発行し、以降のリクエストはすべてそのIDを持ち回る必要があった。これはスティッキールーティング(特定のクライアントを特定のサーバーインスタンスに固定する設計)とセッションストアを必要とし、スケールアウトの妨げになっていた。
新仕様ではステートレスなコアが実現された。セッションが存在しないため、サーバーの再デプロイで既存のセッションが切断されることもない。MCPチームがもっとも要望の多かった機能のひとつと説明しており、信頼性とスケーラビリティの向上が主な狙いだ。
このステートレス化によって可能になった2つの機能が、今回のLangChain対応の柱となっている。
ポイント①:エリシテーション(人間への確認)をLangGraphのinterruptで実現
エリシテーション(Elicitation)とは、ツールが処理を完了できない場合に呼び出し元へ問い合わせるMCPのヒューマン・イン・ザ・ループ機能だ。例えば、削除操作の確認や、モデルが指定し忘れたパラメータの補完などに使われる。
旧来の実装ではコネクションを保持したまま待機する必要があったが、ステートレス化により「クライアントが答えを付けてリトライする」という構造に変わった。LangChainではこれを既存の LangGraph interrupt プリミティブにマッピングして実装している。interrupt とは、LangGraphのグラフ実行を任意の時点で一時停止し、外部からの入力(ユーザーの回答や承認など)を待ってから処理を再開するための仕組みだ(LangGraph interrupt ドキュメント)。
paused = await agent.ainvoke(
{"messages": [{"role": "user", "content": "Book a table for 4."}]}, config
)
question = paused["__interrupt__"][0].value.requests[0]
answer = {"action": "accept", "content": {"date": "2026-09-14"}}
result = await agent.ainvoke(
Command(resume={"responses": {question["key"]: answer}}), config
)
チェックポインターを設定するだけで動作し、追加のセットアップは不要だ。質問を断るケースや、破壊的なツール実行を承認フローで制御する方法はエリシテーションのドキュメントにまとめられている。
ポイント②:ツールリストのクライアントサイドキャッシュ
エージェントは実行のたびに「どんなツールが使えるか」を問い合わせるラウンドトリップを行う。新仕様ではサーバーがツールリストの有効期限(TTL)を通知できるようになったため、クライアント側でカタログをキャッシュできる。
from fastmcp import Client
from langchain.mcp import MCPAdapter
client = Client("https://billing.internal/mcp", cache=True)
async with MCPAdapter(client) as adapter:
tools = await adapter.list_tools(cache_mode="use")
agent = create_deep_agent(
model="google_genai:gemini-3.8-flash",
tools=tools
)
cache=True でインメモリキャッシュが有効になり、サーバーのTTLに従って再取得タイミングが制御される。キャッシュはクライアントインスタンスに紐付いているため、呼び出し元ごとに独立したカタログを保持できる。
FastMCPを基盤に採用
内部実装はFastMCPのクライアントライブラリに依拠している。FastMCPはAnthropicの公式Python SDK上に構築されたサードパーティライブラリで、旧仕様・新仕様の両プロトコルへの自動ネゴシエーション、OAuth 2.1認証、各種トランスポート(streamable HTTP / stdio / インメモリ)、レスポンスキャッシュなどを担う。LangChainがFastMCPを採用した理由として、旧仕様サーバーとの後方互換性を保ちつつ新仕様の機能を段階的に利用できる点、およびOAuth 2.1対応によって企業内システムとのセキュアな接続を別途実装なしに扱える点が挙げられる。
OAuth 2.1はOAuth 2.0のセキュリティベストプラクティスを統合した改訂版仕様であり、MCPサーバーが外部APIや社内サービスに接続する際のトークン管理を標準化する意義がある(OAuth 2.1 draft)。
複数サーバーを扱う場合は ClientGroup で個別に接続設定を持てる。旧仕様のサーバーを mode="legacy" で固定しつつ、新仕様サーバーは mode="auto" で自動ネゴシエーションさせる、といった混在構成が可能だ。ツール名はサーバー名をプレフィックスとして付与するため(例:billing_search、docs_search)、名前の衝突を避けられる。
取得したツールは通常のLangChainツールとして扱えるため、create_deep_agent、create_agent、または自作のグラフに渡すことができる。
詳細はMCP in LangChain: Stateless Protocol, Elicitation, and More!を参照していただきたい。