Das Model Context Protocol (MCP) zielt darauf ab, die Interaktion von KI-Modellen mit externen Tools und Diensten zu standardisieren. Es definiert eine gemeinsame Schnittstelle, die es verschiedenen Modellen und Tool-Anbietern ermöglicht, effektiv zu kommunizieren. Die direkte Integration dieser MCP-konformen Tools in bestehende KI-Frameworks wie LangChain erfordert jedoch Anpassungen.
Hier kommt die Bibliothek langchain-mcp-adapters
ins Spiel. Sie fungiert als entscheidende Brücke und übersetzt MCP-Tools nahtlos in ein Format, das LangChain und sein leistungsstarkes Agent-Framework, LangGraph, verstehen und nutzen können. Diese Bibliothek bietet einen schlanken Wrapper, der es Entwicklern ermöglicht, das wachsende Ökosystem von MCP-Tools innerhalb ihrer LangChain-Anwendungen zu nutzen.
Zu den wichtigsten Funktionen gehören:
- MCP Tool Conversion: Konvertiert MCP-Tools automatisch in LangChain-kompatible
BaseTool
-Objekte. - Multi-Server Client: Bietet einen robusten Client (
MultiServerMCPClient
), der in der Lage ist, sich gleichzeitig mit mehreren MCP-Servern zu verbinden und Tools aus verschiedenen Quellen zu aggregieren. - Transport Flexibility: Unterstützt gängige MCP-Kommunikationstransporte wie Standard-Ein-/Ausgabe (
stdio
) und Server-Sent Events (sse
).
Dieses Tutorial führt Sie durch das Einrichten von MCP-Servern, das Herstellen einer Verbindung zu diesen mithilfe der Adapterbibliothek und das Integrieren der geladenen Tools in einen LangGraph-Agenten.
Benötigen Sie eine integrierte All-in-One-Plattform für Ihr Entwicklerteam, um mit maximaler Produktivität zusammenzuarbeiten?
Apidog liefert alle Ihre Anforderungen und ersetzt Postman zu einem viel günstigeren Preis!

Was ist ein MCP-Server? Wie funktioniert er?
Das Verständnis einiger Kernkonzepte ist unerlässlich, bevor Sie sich in die Beispiele stürzen:
MCP-Server:
- Ein MCP-Server stellt Tools (Funktionen) bereit, die ein KI-Modell aufrufen kann.
- Die
mcp
-Bibliothek (eine Abhängigkeit vonlangchain-mcp-adapters
) bietet Tools wieFastMCP
, um diese Server einfach in Python zu erstellen. - Tools werden mithilfe des Decorators
@mcp.tool()
definiert, der das Eingabeschema automatisch aus Typ-Hinweisen und Docstrings ableitet. - Server können auch Prompts mithilfe von
@mcp.prompt()
definieren und so strukturierte Gesprächsstarter oder Anweisungen bereitstellen. - Server werden mit einem Transportmechanismus (z. B.
mcp.run(transport="stdio")
odermcp.run(transport="sse")
) ausgeführt.stdio
führt den Server als Subprozess aus, der über die Standard-Ein-/Ausgabe kommuniziert, währendsse
typischerweise einen einfachen Webserver für die Kommunikation ausführt.
MCP-Client (langchain-mcp-adapters
):
- Die Rolle des Clients besteht darin, sich mit einem oder mehreren MCP-Servern zu verbinden.
- Er verarbeitet die Details des Kommunikationsprotokolls (stdio, sse).
- Er ruft die Liste der verfügbaren Tools und deren Definitionen (Name, Beschreibung, Eingabeschema) vom/von den Server(n) ab.
- Die Klasse
MultiServerMCPClient
ist die primäre Methode zur Verwaltung von Verbindungen, insbesondere bei der Arbeit mit mehreren Tool-Servern.
Tool Conversion:
- MCP-Tools haben ihr eigenes Definitionsformat. LangChain verwendet seine
BaseTool
-Klassenstruktur. - Die Bibliothek
langchain-mcp-adapters
stellt Funktionen wieload_mcp_tools
(inlangchain_mcp_adapters.tools
) bereit, die sich über eine aktiveClientSession
mit einem Server verbinden, die MCP-Tools auflisten und jedes in ein LangChainStructuredTool
verpacken. - Dieser Wrapper verarbeitet das Aufrufen des eigentlichen MCP-Tool-Aufrufs (
session.call_tool
), wenn der LangChain-Agent sich entscheidet, das Tool zu verwenden, und formatiert die Antwort korrekt.
Prompt Conversion:
- Ähnlich wie bei Tools können MCP-Prompts mithilfe von
load_mcp_prompt
(auslangchain_mcp_adapters.prompts
) abgerufen werden. - Diese Funktion ruft die Prompt-Struktur vom MCP-Server ab und konvertiert sie in eine Liste von LangChain
HumanMessage
- oderAIMessage
-Objekten, die sich zum Initialisieren oder Leiten einer Unterhaltung eignen.
Installieren Sie Langchain-mcp-adapter
Installieren Sie zuerst die erforderlichen Pakete:
pip install langchain-mcp-adapters langgraph langchain-openai # Oder Ihre bevorzugte LangChain LLM-Integration
Sie müssen auch API-Schlüssel für Ihren bevorzugten Sprachmodell-Anbieter konfigurieren, typischerweise durch Festlegen von Umgebungsvariablen:
export OPENAI_API_KEY=<your_openai_api_key>
# or export ANTHROPIC_API_KEY=<...> etc.
Erstellen Sie einen schnellen einzelnen MCP-Server mit langchain-mcp-adapters
Erstellen wir ein einfaches Beispiel: einen MCP-Server, der mathematische Funktionen bereitstellt, und einen LangGraph-Agenten, der diese Funktionen verwendet.
Schritt 1: Erstellen Sie den MCP-Server (math_server.py
)
# math_server.py
from mcp.server.fastmcp import FastMCP
# Initialisieren Sie den MCP-Server mit einem Namen
mcp = FastMCP("Math")
@mcp.tool()
def add(a: int, b: int) -> int:
"""Addiere zwei Zahlen"""
print(f"Executing add({a}, {b})") # Server-seitiges Protokoll
return a + b
@mcp.tool()
def multiply(a: int, b: int) -> int:
"""Multipliziere zwei Zahlen"""
print(f"Executing multiply({a}, {b})") # Server-seitiges Protokoll
return a * b
# Beispiel für die Prompt-Definition
@mcp.prompt()
def configure_assistant(skills: str) -> list[dict]:
"""Konfiguriert den Assistenten mit angegebenen Fähigkeiten."""
return [
{
"role": "assistant", # Entspricht AIMessage
"content": f"Sie sind ein hilfreicher Assistent. Sie haben die folgenden Fähigkeiten: {skills}. Verwenden Sie immer nur ein Tool gleichzeitig.",
}
]
if __name__ == "__main__":
# Führen Sie den Server mit stdio-Transport aus
print("Starte Math MCP-Server über stdio...")
mcp.run(transport="stdio")
Speichern Sie diesen Code als math_server.py
.
Schritt 2: Erstellen Sie den Client und Agenten (client_app.py
)
import asyncio
import os
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
from langchain_mcp_adapters.tools import load_mcp_tools
from langgraph.prebuilt import create_react_agent
from langchain_openai import ChatOpenAI
# --- WICHTIG: Aktualisieren Sie diesen Pfad ---
# Holen Sie sich den absoluten Pfad zur Datei math_server.py
current_dir = os.path.dirname(os.path.abspath(__file__))
math_server_script_path = os.path.join(current_dir, "math_server.py")
# ---
async def main():
model = ChatOpenAI(model="gpt-4o") # Oder Ihr bevorzugtes Modell
# Konfigurieren Sie die Parameter, um das Skript math_server.py auszuführen
server_params = StdioServerParameters(
command="python", # Der auszuführende Befehl
args=[math_server_script_path], # Argumente (der Skriptpfad)
# cwd=..., env=... # Optionales Arbeitsverzeichnis und Umgebungsvariablen
)
print("Verbinden mit dem MCP-Server...")
# Stellen Sie eine Verbindung mithilfe des stdio_client-Kontextmanagers her
async with stdio_client(server_params) as (read, write):
# Erstellen Sie eine ClientSession mithilfe der Lese-/Schreib-Streams
async with ClientSession(read, write) as session:
print("Initialisiere Sitzung...")
# Handshake mit dem Server
await session.initialize()
print("Sitzung initialisiert.")
print("Lade MCP-Tools...")
# Rufen Sie MCP-Tools ab und konvertieren Sie sie in LangChain-Tools
tools = await load_mcp_tools(session)
print(f"Geladene Tools: {[tool.name for tool in tools]}")
# Erstellen Sie einen LangGraph ReAct-Agenten mithilfe des Modells und der geladenen Tools
agent = create_react_agent(model, tools)
print("Agenten aufrufen...")
# Führen Sie den Agenten aus
inputs = {"messages": [("human", "was ist (3 + 5) * 12?")]}
async for event in agent.astream_events(inputs, version="v1"):
print(event) # Stream-Ereignisse zur Beobachtbarkeit
# Oder erhalten Sie die endgültige Antwort direkt
# final_response = await agent.ainvoke(inputs)
# print("Agentenantwort:", final_response['messages'][-1].content)
if __name__ == "__main__":
asyncio.run(main())
Speichern Sie dies als client_app.py
im selben Verzeichnis wie math_server.py
.
Zum Ausführen:
Führen Sie das Client-Skript aus:
python client_app.py
Das Client-Skript startet automatisch math_server.py
als Subprozess, stellt eine Verbindung her, lädt die Tools add
und multiply
und verwendet den LangGraph-Agenten, um das mathematische Problem zu lösen, indem es diese Tools über den MCP-Server aufruft. Sie sehen Protokolle sowohl vom Client als auch vom Server.
Verbinden mit mehreren MCP-Servern
Oft möchten Sie Tools von verschiedenen spezialisierten Servern kombinieren. MultiServerMCPClient
macht dies unkompliziert.
Schritt 1: Erstellen Sie einen weiteren Server (weather_server.py
)
Erstellen wir einen Wetterserver, der den SSE-Transport verwendet.
# weather_server.py
from mcp.server.fastmcp import FastMCP
import uvicorn # Benötigt: pip install uvicorn
mcp = FastMCP("Weather")
@mcp.tool()
async def get_weather(location: str) -> str:
"""Holen Sie sich das Wetter für den Standort."""
print(f"Executing get_weather({location})")
# In einem realen Szenario würde dies eine Wetter-API aufrufen
return f"Es ist immer sonnig in {location}"
if __name__ == "__main__":
# Führen Sie den Server mit SSE-Transport aus (erfordert einen ASGI-Server wie uvicorn)
# Die mcp-Bibliothek erstellt implizit eine FastAPI-App für SSE.
# Standardmäßig wird sie an Port 8000 am /sse-Endpunkt ausgeführt.
print("Starte Weather MCP-Server über SSE an Port 8000...")
# uvicorn.run(mcp.app, host="0.0.0.0", port=8000) # Sie können manuell ausführen
mcp.run(transport="sse", host="0.0.0.0", port=8000) # Oder verwenden Sie die mcp.run-Annehmlichkeit
Speichern Sie dies als weather_server.py
.
Schritt 2: Aktualisieren Sie den Client zur Verwendung von MultiServerMCPClient
(multi_client_app.py
)
import asyncio
import os
from langchain_mcp_adapters.client import MultiServerMCPClient
from langgraph.prebuilt import create_react_agent
from langchain_openai import ChatOpenAI
# --- WICHTIG: Pfade aktualisieren ---
current_dir = os.path.dirname(os.path.abspath(__file__))
math_server_script_path = os.path.join(current_dir, "math_server.py")
# Der Wetterserver wird separat ausgeführt, Verbindung über URL
# ---
async def main():
model = ChatOpenAI(model="gpt-4o")
# Definieren Sie Verbindungen für mehrere Server
server_connections = {
"math_service": { # Eindeutiger Name für diese Verbindung
"transport": "stdio",
"command": "python",
"args": [math_server_script_path],
# Fügen Sie bei Bedarf andere StdioConnection-Parameter hinzu (env, cwd usw.)
},
"weather_service": { # Eindeutiger Name für diese Verbindung
"transport": "sse",
"url": "http://localhost:8000/sse", # URL, unter der weather_server ausgeführt wird
# Fügen Sie bei Bedarf andere SSEConnection-Parameter hinzu (Headers, Timeout usw.)
}
}
print("Verbinden mit mehreren MCP-Servern...")
# Verwenden Sie den MultiServerMCPClient-Kontextmanager
async with MultiServerMCPClient(server_connections) as client:
print("Verbindungen hergestellt.")
# Holen Sie sich *alle* Tools von *allen* verbundenen Servern
all_tools = client.get_tools()
print(f"Geladene Tools: {[tool.name for tool in all_tools]}")
# Erstellen Sie einen Agenten mit der kombinierten Toolliste
agent = create_react_agent(model, all_tools)
# --- Interagieren Sie mit dem Agenten ---
print("\nAufrufen des Agenten für eine mathematische Abfrage...")
math_inputs = {"messages": [("human", "was ist (3 + 5) * 12?")]}
math_response = await agent.ainvoke(math_inputs)
print("Mathematische Antwort:", math_response['messages'][-1].content)
print("\nAufrufen des Agenten für eine Wetterabfrage...")
weather_inputs = {"messages": [("human", "wie ist das Wetter in New York?")]}
weather_response = await agent.ainvoke(weather_inputs)
print("Wetterantwort:", weather_response['messages'][-1].content)
# --- Beispiel: Abrufen eines Prompts ---
# print("\nAbrufen des Math-Server-Prompts...")
# prompt_messages = await client.get_prompt(
# server_name="math_service", # Verwenden Sie den in den Verbindungen definierten Namen
# prompt_name="configure_assistant",
# arguments={"skills": "Grundrechenarten"}
# )
# print("Prompt:", prompt_messages)
if __name__ == "__main__":
# Starten Sie zuerst den Wetterserver in einem separaten Terminal:
# python weather_server.py
# Führen Sie dann dieses Client-Skript aus:
asyncio.run(main())
Speichern Sie dies als multi_client_app.py
.
Zum Ausführen:
- Starten Sie den Wetterserver in einem Terminal:
python weather_server.py
- Führen Sie die Multi-Client-App in einem anderen Terminal aus:
python multi_client_app.py
Der MultiServerMCPClient
startet den Subprozess math_server.py
(stdio) und stellt eine Verbindung zum laufenden weather_server.py
(sse) her. Er aggregiert Tools (add
, multiply
, get_weather
), die dann dem LangGraph-Agenten zur Verfügung stehen.
Integration mit LangGraph API Server
Sie können einen LangGraph-Agenten, der MCP-Tools verwendet, als persistenten API-Dienst mithilfe von langgraph deploy
bereitstellen. Der Schlüssel ist die korrekte Verwaltung des MultiServerMCPClient
-Lebenszyklus innerhalb des LangGraph-Anwendungskontexts.
Erstellen Sie eine Datei graph.py
:
# graph.py
from contextlib import asynccontextmanager
import os
from langchain_mcp_adapters.client import MultiServerMCPClient
from langgraph.prebuilt import create_react_agent
from langchain_openai import ChatOpenAI # Oder Anthropic usw.
# --- WICHTIG: Pfade aktualisieren ---
# Unter der Annahme, dass die Server relativ zu dem Ort sind, an dem der LangGraph-Server ausgeführt wird
math_server_script_path = os.path.abspath("math_server.py")
# ---
# Definieren Sie Verbindungen (stellen Sie sicher, dass die Pfade/URLs für die Serverumgebung korrekt sind)
server_connections = {
"math_service": {
"transport": "stdio",
"command": "python",
"args": [math_server_script_path],
},
"weather_service": {
"transport": "sse",
"url": "http://localhost:8000/sse", # Der Wetterserver muss unabhängig ausgeführt werden
}
}
model = ChatOpenAI(model="gpt-4o")
# Verwenden Sie einen asynchronen Kontextmanager, um die Client-Einrichtung/-Aufräumung zu verarbeiten
@asynccontextmanager
async def lifespan(_app): # LangGraph erwartet diese Struktur für die Lebenszyklusverwaltung
async with MultiServerMCPClient(server_connections) as client:
print("MCP-Client innerhalb der Lebensdauer initialisiert.")
# Erstellen Sie den Agenten *innerhalb* des Kontexts, in dem der Client aktiv ist
agent = create_react_agent(model, client.get_tools())
yield {"agent": agent} # Stellen Sie den Agenten zur Verfügung
# Keine Notwendigkeit für eine separate Hauptgraph-Definition, wenn die Lebensdauer sie ergibt
Konfigurieren Sie Ihre langgraph.json
(oder pyproject.toml
unter [tool.langgraph]
), um diese Graphdefinition mit dem Lebenszyklusmanager zu verwenden:
// langgraph.json (Beispiel)
{
"dependencies": ["."], // Oder geben Sie die erforderlichen Pakete an
"graphs": {
"my_mcp_agent": {
"entrypoint": "graph:agent", // Bezieht sich auf den Schlüssel, der von der Lebensdauer erzeugt wird
"lifespan": "graph:lifespan"
}
}
}
Wenn Sie jetzt langgraph up
ausführen, wird die Funktion lifespan
ausgeführt, wodurch der MultiServerMCPClient
(und der stdio-Math-Server) gestartet wird. Der in diesem Kontext erstellte Agent wird von LangGraph bedient. Denken Sie daran, dass der SSE-Wetterserver weiterhin separat ausgeführt werden muss.
Server-Transports (stdio vs. SSE)
stdio
:
- Kommunikation: Über die Standard-Ein- und Ausgabestreams des Serverprozesses.
- Vorteile: Einfache Einrichtung für die lokale Entwicklung; der Client verwaltet den Server-Lebenszyklus. Keine Netzwerkaktivitäten beteiligt.
- Nachteile: Eng gekoppelt; weniger geeignet für verteilte Systeme oder Nicht-Python-Server. Erfordert die Konfiguration von
command
undargs
.
sse
(Server-Sent Events):
- Kommunikation: Über HTTP mithilfe des SSE-Protokolls. Der Server wird als Webdienst ausgeführt (oft implizit mit FastAPI/Uvicorn).
- Vorteile: Standard-Webprotokoll; geeignet für vernetzte/Remote-Server, potenziell in verschiedenen Sprachen implementiert. Der Server wird unabhängig ausgeführt.
- Nachteile: Erfordert, dass der Server separat ausgeführt wird. Benötigt die Konfiguration von
url
.
Wählen Sie den Transport basierend auf Ihren Bereitstellungsanforderungen.
Erweiterte Client-Konfiguration für das langchain-mcp-adapters-Setup
Die StdioConnection
- und SSEConnection
-Wörterbücher innerhalb von MultiServerMCPClient
akzeptieren zusätzliche optionale Parameter für eine feinere Steuerung:
- Stdio:
env
(benutzerdefinierte Umgebungsvariablen für den Subprozess),cwd
(Arbeitsverzeichnis),encoding
,encoding_error_handler
,session_kwargs
(übergeben anmcp.ClientSession
). - SSE:
headers
(benutzerdefinierte HTTP-Header),timeout
(HTTP-Verbindungs-Timeout),sse_read_timeout
,session_kwargs
.
Lesen Sie die Definition von MultiServerMCPClient
in langchain_mcp_adapters/client.py
für Details.
Fazit (100 Wörter)
Die Bibliothek langchain-mcp-adapters
überbrückt effektiv die Lücke zwischen dem standardisierten Model Context Protocol und dem flexiblen LangChain-Ökosystem. Durch die Bereitstellung des MultiServerMCPClient
und der automatischen Tool-Konvertierung können Entwickler auf einfache Weise vielfältige, MCP-konforme Tools in ihre LangChain-Agenten und LangGraph-Anwendungen integrieren.
Der Kern-Workflow umfasst:
- Definieren von Tools (und optional Prompts) in einem MCP-Server mithilfe von
@mcp.tool()
. - Konfigurieren des
MultiServerMCPClient
mit Verbindungsdetails (stdio oder sse) für jeden Server. - Verwenden des Client-Kontextmanagers (
async with ...
), um eine Verbindung herzustellen und Tools überclient.get_tools()
abzurufen. - Übergeben der abgerufenen LangChain-kompatiblen Tools an Ihren Agenten (
create_react_agent
oder benutzerdefinierte Agenten).
Dies ermöglicht das Erstellen leistungsstarker, modularer KI-Anwendungen, die spezialisierte, externe Tools über ein standardisiertes Protokoll nutzen. Erkunden Sie die Beispiele und Tests im Repository für weitere Einblicke.