0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

LangChain MCP Adapters — 複数MCPサーバーをLangGraphエージェントで束ねる

0
Last updated at Posted at 2026-06-19

TL;DR

  • LangChain MCP Adapters は MCP サーバーを LangChain/LangGraph のツールに変換するライブラリ(MIT)
  • MultiServerMCPClient 1 つで Stdio・HTTP・SSE の複数サーバーを同時接続し、すべてのツールを統一的に扱える
  • v0.3.0 で MCPエラー(isError=true)を ToolMessage(status="error") に自動変換——エージェントが自己修正できる
  • pip install langchain-mcp-adapters langgraph だけで動き、LangGraph の StateGraph + ToolNode とシームレスに統合できる

LangChain MCP Adapters とは

MCP(Model Context Protocol)は Anthropic が開発した AI とツールの接続標準で、2026年現在 Linux Foundation 傘下の AAIF で管理されています。GitHub・Filesystem・ブラウザ操作など 1 万以上の MCP サーバー が公開されており、Claude Code や Cursor などが標準対応しています。

一方、LangChain/LangGraph は Python/TypeScript の AI エージェントフレームワークとして広く使われていますが、MCP サーバーを直接 LangChain ツールとして扱う仕組み がありませんでした。

LangChain MCP Adapters はこのギャップを埋めるライブラリです。MCP サーバーを LangChain 互換のツールに変換し、既存の LangGraph ワークフローにそのまま組み込めます。

MCP サーバー群                      LangChain/LangGraph
────────────────────                ─────────────────────────────────
  [math_server.py]  ─── Stdio ──┐
  [weather_server]  ─── HTTP ───┼─── MultiServerMCPClient ─── ToolNode
  [github MCP]      ─── SSE ────┘              ↓
                                           StateGraph (LangGraph)

6月10日にリリースされた v0.3.0 では:

  • エラー自動処理(handle_tool_errors=True)でエージェントの自己修正能力が向上
  • Streamable HTTP クライアントの最新仕様対応
  • セキュリティ修正が含まれます

セットアップ

前提条件

  • Python 3.10 以上
  • OpenAI API キー(または Anthropic API キー)

インストール

pip install langchain-mcp-adapters langgraph "langchain[openai]"

環境変数の設定:

export OPENAI_API_KEY="sk-..."

ステップ 1: MCP サーバーを作る

まず、テスト用のシンプルな MCP サーバーを 2 つ用意します。FastMCP を使うと数行で書けます。

pip install "mcp[cli]"

math_server.py — 四則演算サーバー(Stdio 接続)

from mcp.server.fastmcp import FastMCP

mcp = FastMCP("Math")

@mcp.tool()
def add(a: int, b: int) -> int:
    """2つの整数を加算する"""
    return a + b

@mcp.tool()
def multiply(a: int, b: int) -> int:
    """2つの整数を乗算する"""
    return a * b

if __name__ == "__main__":
    mcp.run(transport="stdio")

weather_server.py — ダミー天気サーバー(HTTP 接続)

from mcp.server.fastmcp import FastMCP

mcp = FastMCP("Weather")

@mcp.tool()
def get_weather(city: str) -> str:
    """指定都市の天気を返す(デモ用ダミーデータ)"""
    weather_data = {
        "tokyo": "晴れ、気温 28°C",
        "osaka": "曇り、気温 25°C",
        "sapporo": "雨、気温 18°C",
    }
    return weather_data.get(city.lower(), f"{city} のデータなし")

if __name__ == "__main__":
    mcp.run(transport="streamable-http", host="localhost", port=8000)

weather サーバーを起動しておきます:

python weather_server.py

ステップ 2: MultiServerMCPClient で複数サーバーに接続

MultiServerMCPClient は複数の MCP サーバーを辞書形式で管理します。

from langchain_mcp_adapters.client import MultiServerMCPClient

client = MultiServerMCPClient({
    "math": {
        "command": "python",
        "args": ["./math_server.py"],
        "transport": "stdio",
    },
    "weather": {
        "url": "http://localhost:8000/mcp",
        "transport": "streamable_http",
    },
})

# 全サーバーのツールを取得
tools = await client.get_tools()
print([t.name for t in tools])
# → ['add', 'multiply', 'get_weather']

ツール名の衝突を防ぐ

複数サーバーに同名のツールがある場合は tool_name_prefix=True を指定します:

client = MultiServerMCPClient(
    {...},
    tool_name_prefix=True,  # "math_add", "weather_get_weather" のように prefix が付く
)

ステップ 3: LangGraph エージェントに統合

StateGraph + ToolNode を使って、ツールを呼び出せるエージェントを構築します。

import asyncio
from langchain_mcp_adapters.client import MultiServerMCPClient
from langgraph.graph import StateGraph, MessagesState, START
from langgraph.prebuilt import ToolNode, tools_condition
from langchain.chat_models import init_chat_model

async def main():
    model = init_chat_model("openai:gpt-4o-mini")

    client = MultiServerMCPClient({
        "math": {
            "command": "python",
            "args": ["./math_server.py"],
            "transport": "stdio",
        },
        "weather": {
            "url": "http://localhost:8000/mcp",
            "transport": "streamable_http",
        },
    })

    tools = await client.get_tools()

    def call_model(state: MessagesState):
        response = model.bind_tools(tools).invoke(state["messages"])
        return {"messages": response}

    builder = StateGraph(MessagesState)
    builder.add_node("call_model", call_model)
    builder.add_node("tools", ToolNode(tools))
    builder.add_edge(START, "call_model")
    builder.add_conditional_edges("call_model", tools_condition)
    builder.add_edge("tools", "call_model")

    graph = builder.compile()

    # 複数ツールを組み合わせた質問
    result = await graph.ainvoke({
        "messages": [
            ("human", "(3 + 5) × 12 の計算と、東京の天気を教えて")
        ]
    })

    print(result["messages"][-1].content)

asyncio.run(main())

実行例:

(3 + 5) × 12 = 96 です。
東京の天気は「晴れ、気温 28°C」です。

add(3, 5) → 8multiply(8, 12) → 96get_weather("tokyo") → "晴れ..." の順でツールが呼ばれます。


v0.3.0 の新機能: エラー自動処理

MCP サーバーがエラー(isError=true)を返した場合、v0.3.0 以前はそのまま例外になってエージェントが停止していました。v0.3.0 からは handle_tool_errors=True(デフォルト)で自動的に ToolMessage(status="error") に変換されます。

client = MultiServerMCPClient(
    {...},
    handle_tool_errors=True,  # デフォルト。エラーをエージェントが自己修正できる
)

動作の違い:

バージョン MCPエラー発生時の挙動
v0.2.x 以前 ToolException が発生し、エージェントが停止
v0.3.0 ToolMessage(status="error", content=エラー内容) として返され、エージェントが再試行可能

これにより、エージェントが「このツールは失敗した、別の方法を試そう」と自律的にリカバリーできます。


特定サーバーのみを使う

session() コンテキストマネージャーで特定のサーバーにだけ接続することもできます:

from langchain_mcp_adapters.tools import load_mcp_tools

async with client.session("math") as session:
    math_tools = await load_mcp_tools(session)
    # math サーバーのツールのみ使用

まとめ

機能 内容
インストール pip install langchain-mcp-adapters langgraph
接続方式 Stdio・HTTP・Streamable HTTP・SSE に対応
複数サーバー MultiServerMCPClient で辞書形式に一括管理
ツール名衝突 tool_name_prefix=True でサーバー名プレフィックスを付与
エラー処理 v0.3.0 から handle_tool_errors=True でエージェント自己修正に対応

LangChain MCP Adapters を使えば、既存の LangGraph エージェントに MCP エコシステムの 1 万以上のサーバーを組み込めます。GitHub MCP・Filesystem MCP などの公式サーバーと組み合わせることで、ファイル操作・コード検索・Web 検索などを 1 つのエージェントループで実現できます。

参考リンク

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?