Das Model Context Protocol (MCP) ist ein offener Standard für die Verbindung von KI-Agenten mit externen Tools und Datenquellen. Mit MCP kann Ihr Agent Datenbanken abfragen, sich mit APIs wie Slack und GitHub integrieren und sich mit anderen Diensten verbinden, ohne benutzerdefinierte Tool-Implementierungen zu schreiben.
MCP-Server können als lokale Prozesse ausgeführt werden, sich über HTTP verbinden oder direkt in Ihrer SDK-Anwendung ausgeführt werden.
Dieses Beispiel verbindet sich mit dem Claude Code-Dokumentations-MCP-Server unter Verwendung von HTTP-Transport und verwendet allowedTools mit einem Platzhalter, um alle Tools vom Server zuzulassen.
import { query } from "@anthropic-ai/claude-agent-sdk";
for await (const message of query({
prompt: "Use the docs MCP server to explain what hooks are in Claude Code",
options: {
mcpServers: {
"claude-code-docs": {
type: "http",
url: "https://code.claude.com/docs/mcp"
}
},
allowedTools: ["mcp__claude-code-docs__*"]
}
})) {
if (message.type === "result" && message.subtype === "success") {
console.log(message.result);
}
}Der Agent verbindet sich mit dem Dokumentationsserver, sucht nach Informationen über Hooks und gibt die Ergebnisse zurück.
Sie können MCP-Server im Code beim Aufrufen von query() konfigurieren oder in einer .mcp.json-Datei, die das SDK automatisch lädt.
Übergeben Sie MCP-Server direkt in der mcpServers-Option:
import { query } from "@anthropic-ai/claude-agent-sdk";
for await (const message of query({
prompt: "List files in my project",
options: {
mcpServers: {
"filesystem": {
command: "npx",
args: ["-y", "@modelcontextprotocol/server-filesystem", "/Users/me/projects"]
}
},
allowedTools: ["mcp__filesystem__*"]
}
})) {
if (message.type === "result" && message.subtype === "success") {
console.log(message.result);
}
}Erstellen Sie eine .mcp.json-Datei im Stammverzeichnis Ihres Projekts. Das SDK lädt diese automatisch:
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/Users/me/projects"]
}
}
}MCP-Tools erfordern explizite Berechtigung, bevor Claude sie verwenden kann. Ohne Berechtigung sieht Claude, dass Tools verfügbar sind, kann sie aber nicht aufrufen.
MCP-Tools folgen dem Benennungsmuster mcp__<server-name>__<tool-name>. Beispielsweise wird ein GitHub-Server namens "github" mit einem list_issues-Tool zu mcp__github__list_issues.
Verwenden Sie allowedTools, um anzugeben, welche MCP-Tools Claude verwenden kann:
options: {
mcpServers: { /* your servers */ },
allowedTools: [
"mcp__github__*", // All tools from the github server
"mcp__db__query", // Only the query tool from db server
"mcp__slack__send_message" // Only send_message from slack server
]
}Platzhalter (*) ermöglichen es Ihnen, alle Tools von einem Server zuzulassen, ohne jedes einzelne aufzulisten.
Anstatt zulässige Tools aufzulisten, können Sie den Berechtigungsmodus ändern, um umfassenderen Zugriff zu gewähren:
permissionMode: "acceptEdits": Genehmigt die Tool-Nutzung automatisch (fordert dennoch für destruktive Operationen auf)permissionMode: "bypassPermissions": Überspringt alle Sicherheitsaufforderungen, einschließlich destruktiver Operationen wie Dateilöschung oder Ausführung von Shell-Befehlen. Mit Vorsicht verwenden, besonders in der Produktion. Dieser Modus wird an Subagenten weitergegeben, die vom Task-Tool erzeugt werden.options: {
mcpServers: { /* your servers */ },
permissionMode: "acceptEdits" // No need for allowedTools
}Weitere Details zu Berechtigungsmodi finden Sie unter Berechtigungen.
Um zu sehen, welche Tools ein MCP-Server bereitstellt, überprüfen Sie die Dokumentation des Servers oder verbinden Sie sich mit dem Server und überprüfen Sie die system-Init-Nachricht:
for await (const message of query({ prompt: "...", options })) {
if (message.type === "system" && message.subtype === "init") {
console.log("Available MCP tools:", message.mcp_servers);
}
}MCP-Server kommunizieren mit Ihrem Agenten über verschiedene Transportprotokolle. Überprüfen Sie die Dokumentation des Servers, um zu sehen, welchen Transport er unterstützt:
npx @modelcontextprotocol/server-github), verwenden Sie stdioLokale Prozesse, die über stdin/stdout kommunizieren. Verwenden Sie dies für MCP-Server, die Sie auf demselben Computer ausführen:
Verwenden Sie HTTP oder SSE für Cloud-gehostete MCP-Server und Remote-APIs:
Für HTTP (nicht-Streaming) verwenden Sie stattdessen "type": "http".
Definieren Sie benutzerdefinierte Tools direkt in Ihrem Anwendungscode, anstatt einen separaten Server-Prozess auszuführen. Weitere Implementierungsdetails finden Sie im Leitfaden für benutzerdefinierte Tools.
Wenn Sie viele MCP-Tools konfiguriert haben, können Tool-Definitionen einen erheblichen Teil Ihres Kontextfensters verbrauchen. Die MCP-Tool-Suche löst dies, indem Tools bei Bedarf dynamisch geladen werden, anstatt alle vorab zu laden.
Die Tool-Suche läuft standardmäßig im Auto-Modus. Sie wird aktiviert, wenn Ihre MCP-Tool-Beschreibungen mehr als 10% des Kontextfensters verbrauchen würden. Wenn ausgelöst:
defer_loading: true markiert, anstatt vorab in den Kontext geladen zu werdenDie Tool-Suche erfordert Modelle, die tool_reference-Blöcke unterstützen: Sonnet 4 und später oder Opus 4 und später. Haiku-Modelle unterstützen die Tool-Suche nicht.
Steuern Sie das Verhalten der Tool-Suche mit der Umgebungsvariablen ENABLE_TOOL_SEARCH:
| Wert | Verhalten |
|---|---|
auto | Wird aktiviert, wenn MCP-Tools 10% des Kontexts überschreiten (Standard) |
auto:5 | Wird bei 5%-Schwelle aktiviert (Prozentsatz anpassen) |
true | Immer aktiviert |
false | Deaktiviert, alle MCP-Tools werden vorab geladen |
Legen Sie den Wert in der env-Option fest:
const options = {
mcpServers: { /* your MCP servers */ },
env: {
ENABLE_TOOL_SEARCH: "auto:5" // Enable at 5% threshold
}
};Die meisten MCP-Server erfordern Authentifizierung, um auf externe Dienste zuzugreifen. Übergeben Sie Anmeldedaten über Umgebungsvariablen in der Server-Konfiguration.
Verwenden Sie das env-Feld, um API-Schlüssel, Token und andere Anmeldedaten an den MCP-Server zu übergeben:
Siehe Probleme aus einem Repository auflisten für ein vollständiges funktionierendes Beispiel mit Debug-Protokollierung.
Für HTTP- und SSE-Server übergeben Sie Authentifizierungs-Header direkt in der Server-Konfiguration:
Die MCP-Spezifikation unterstützt OAuth 2.1 für Autorisierung. Das SDK verarbeitet OAuth-Flows nicht automatisch, aber Sie können Zugriffs-Token über Header übergeben, nachdem Sie den OAuth-Flow in Ihrer Anwendung abgeschlossen haben:
// After completing OAuth flow in your app
const accessToken = await getAccessTokenFromOAuthFlow();
const options = {
mcpServers: {
"oauth-api": {
type: "http",
url: "https://api.example.com/mcp",
headers: {
Authorization: `Bearer ${accessToken}`
}
}
},
allowedTools: ["mcp__oauth-api__*"]
};Dieses Beispiel verbindet sich mit dem GitHub-MCP-Server, um aktuelle Probleme aufzulisten. Das Beispiel enthält Debug-Protokollierung, um die MCP-Verbindung und Tool-Aufrufe zu überprüfen.
Erstellen Sie vor dem Ausführen ein GitHub-Personal-Access-Token mit repo-Bereich und legen Sie es als Umgebungsvariable fest:
export GITHUB_TOKEN=ghp_xxxxxxxxxxxxxxxxxxxximport { query } from "@anthropic-ai/claude-agent-sdk";
for await (const message of query({
prompt: "List the 3 most recent issues in anthropics/claude-code",
options: {
mcpServers: {
"github": {
command: "npx",
args: ["-y", "@modelcontextprotocol/server-github"],
env: {
GITHUB_TOKEN: process.env.GITHUB_TOKEN
}
}
},
allowedTools: ["mcp__github__list_issues"]
}
})) {
// Verify MCP server connected successfully
if (message.type === "system" && message.subtype === "init") {
console.log("MCP servers:", message.mcp_servers);
}
// Log when Claude calls an MCP tool
if (message.type === "assistant") {
for (const block of message.content) {
if (block.type === "tool_use" && block.name.startsWith("mcp__")) {
console.log("MCP tool called:", block.name);
}
}
}
// Print the final result
if (message.type === "result" && message.subtype === "success") {
console.log(message.result);
}
}Dieses Beispiel verwendet den Postgres-MCP-Server, um eine Datenbank abzufragen. Die Verbindungszeichenfolge wird als Argument an den Server übergeben. Der Agent entdeckt automatisch das Datenbankschema, schreibt die SQL-Abfrage und gibt die Ergebnisse zurück:
import { query } from "@anthropic-ai/claude-agent-sdk";
// Connection string from environment variable
const connectionString = process.env.DATABASE_URL;
for await (const message of query({
// Natural language query - Claude writes the SQL
prompt: "How many users signed up last week? Break it down by day.",
options: {
mcpServers: {
"postgres": {
command: "npx",
// Pass connection string as argument to the server
args: ["-y", "@modelcontextprotocol/server-postgres", connectionString]
}
},
// Allow only read queries, not writes
allowedTools: ["mcp__postgres__query"]
}
})) {
if (message.type === "result" && message.subtype === "success") {
console.log(message.result);
}
}MCP-Server können aus verschiedenen Gründen keine Verbindung herstellen: Der Server-Prozess ist möglicherweise nicht installiert, Anmeldedaten könnten ungültig sein, oder ein Remote-Server könnte unerreichbar sein.
Das SDK sendet eine system-Nachricht mit dem Subtyp init am Anfang jeder Abfrage. Diese Nachricht enthält den Verbindungsstatus für jeden MCP-Server. Überprüfen Sie das status-Feld, um Verbindungsfehler zu erkennen, bevor der Agent mit der Arbeit beginnt:
import { query } from "@anthropic-ai/claude-agent-sdk";
for await (const message of query({
prompt: "Process data",
options: {
mcpServers: {
"data-processor": dataServer
}
}
})) {
if (message.type === "system" && message.subtype === "init") {
const failedServers = message.mcp_servers.filter(
s => s.status !== "connected"
);
if (failedServers.length > 0) {
console.warn("Failed to connect:", failedServers);
}
}
if (message.type === "result" && message.subtype === "error_during_execution") {
console.error("Execution failed");
}
}Überprüfen Sie die init-Nachricht, um zu sehen, welche Server keine Verbindung herstellen konnten:
if (message.type === "system" && message.subtype === "init") {
for (const server of message.mcp_servers) {
if (server.status === "failed") {
console.error(`Server ${server.name} failed to connect`);
}
}
}Häufige Ursachen:
env-Feld dem entspricht, was der Server erwartet.npx-Befehle, dass das Paket existiert und Node.js in Ihrem PATH ist.Wenn Claude Tools sieht, sie aber nicht verwendet, überprüfen Sie, dass Sie die Berechtigung mit allowedTools gewährt haben oder durch Ändern des Berechtigungsmodus:
options: {
mcpServers: { /* your servers */ },
allowedTools: ["mcp__servername__*"] // Required for Claude to use the tools
}Das MCP-SDK hat ein Standard-Timeout von 60 Sekunden für Server-Verbindungen. Wenn Ihr Server länger zum Starten benötigt, schlägt die Verbindung fehl. Für Server, die mehr Startzeit benötigen, sollten Sie folgende Optionen in Betracht ziehen:
allowedTools und disallowedTools verwenden kannWas this page helpful?