MCP & Verbindung zu Tools
Das Model Context Protocol (MCP) ist der offene Standard, um KI mit externen Tools und Daten zu verbinden. In der API musst du gar keinen MCP-Client selbst betreiben: Der MCP-Connector lässt dich in deinem Request einen Remote-Server nennen, und Claude ruft dessen Tools innerhalb des normalen Agent-Loops auf. Zwei Request-Felder ersetzen eine ganze Integrationsschicht.
- Wann der MCP-Connector hand-definierte Tools schlägt — und wann nicht
- Die exakte Request-Form: mcp_servers für die Verbindung, mcp_toolset für die Policy
- Allowlist, Denylist und Per-Tool-Config — und wie sich die drei Config-Schichten mischen
- Die Response-Blöcke, die du behandeln musst: mcp_tool_use und mcp_tool_result
- Die echten Grenzen: nur HTTPS, nur Tools, Plattformlücken und keine ZDR-Abdeckung
MCP vs. hand-definierte Tools
| Tool Use (custom) | MCP-Connector | |
|---|---|---|
| Du definierst | Das Schema jedes Tools, und du führst es aus | Eine Verbindung zu einem Server, der Tools publiziert |
| Wer führt das Tool aus | Dein Code, in deinem Loop | Anthropics Seite ruft den Remote-Server auf |
| Am besten für | Ein paar bespoke Funktionen in deiner App | Wiederverwendung bestehender Integrationen (GitHub, DBs, Browser, SaaS) |
| Auth | Dein Code | Ein OAuth-Bearer-Token, das du pro Server lieferst |
Sie koexistieren. Definiere deine app-spezifischen Tools direkt und zieh vorgefertigte Fähigkeit über MCP dazu.
Die Request-Form
Zwei Teile, und sie sind bewusst getrennt: mcp_servers sagt, wo der Server ist und wie authentifiziert wird; der mcp_toolset-Eintrag im tools-Array sagt, welche seiner Tools du bereit bist freizugeben und wie.
- anthropic-beta: mcp-client-2025-11-20 — ohne ihn wird das mcp_servers-Feld nicht akzeptiert. In den SDKs ist das die betas-Liste in einem beta.messages.create-Call.
- Gib ihm type url, eine https url und einen eindeutigen name. Füge authorization_token hinzu, wenn der Server OAuth verlangt — den OAuth-Flow führst du selbst, du übergibst das resultierende Access-Token.
- Setze mcp_server_name auf den soeben genutzten Namen. Ohne weitere Config ist jedes Tool auf dem Server mit Defaults aktiviert.
- Claudes Antwort kann mcp_tool_use- und mcp_tool_result-Content-Blöcke enthalten. Rendere oder logge sie wie Tool-Blöcke — nimm nicht an, die Antwort sei reiner Text.
Minimaler MCP-Connector-Call (cURL)
curl https://api.anthropic.com/v1/messages \
-H "Content-Type: application/json" \
-H "X-API-Key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: mcp-client-2025-11-20" \
-d '{
"model": "MODEL_ID",
"max_tokens": 1000,
"messages": [{"role": "user", "content": "What tools do you have available?"}],
"mcp_servers": [
{"type": "url", "url": "https://example.com/sse", "name": "example-mcp", "authorization_token": "YOUR_TOKEN"}
],
"tools": [
{"type": "mcp_toolset", "mcp_server_name": "example-mcp"}
]
}':::tip Modell niemals hart codieren
MODEL_ID oben ist bewusst ein Platzhalter. Lies die aktuelle ID aus Aktuelle Modelle & Preise und halte sie in der Config, damit ein Modell-Upgrade eine Ein-Zeilen-Änderung ist.
:::
Die API erzwingt strikte Paarung: Jeder Server in mcp_servers muss von genau einem Toolset referenziert werden, und jedes Toolset-mcp_server_name muss zu einem deklarierten Server passen. Mismatches sind Validierungsfehler, keine stillen No-Ops.
Wähle, was Claude tatsächlich darf
Diesen Teil bekommen die meisten Integrationen falsch hin. Ein Toolset nimmt ein default_config, das auf jedes Tool angewandt wird, plus configs mit Per-Tool-Overrides. Priorität, höchste zuerst: Per-Tool configs → set-weites default_config → System-Defaults.
Denylist — alles aktivieren, dann die gefährlichen abschalten. Sinnvoll, wenn du Breite willst, aber keine zerstörerischen Writes:
{
"type": "mcp_toolset",
"mcp_server_name": "calendar-mcp",
"configs": {
"delete_all_events": { "enabled": false },
"share_calendar_publicly": { "enabled": false }
}
}
Allowlist — per Default deaktivieren, dann die Überlebenden namentlich nennen. Das ist die Least-Privilege-Haltung — und die, zu der man per Default greift:
{
"type": "mcp_toolset",
"mcp_server_name": "calendar-mcp",
"default_config": { "enabled": false },
"configs": {
"search_events": { "enabled": true },
"create_event": { "enabled": true }
}
}
:::warning Eine Denylist blockiert nur das, an das du gedacht hast
Server können Tools ergänzen. Eine Denylist gewährt still jedes Tool, das nach ihrem Schreiben ausgeliefert wurde; eine Allowlist ignoriert sie still. Für alles, was Kundendaten oder Geld berührt, allowliste. Beachte auch: Ein Tool in configs zu nennen, das es auf dem Server nicht gibt, loggt eine Backend-Warnung, wirft aber keinen Fehler — ein Tippfehler in einer Allowlist deaktiviert also still das Tool, das du eigentlich freischalten wolltest. Verifiziere gegen die Live-Toolliste des Servers.
:::
Halte die Schemata aus deinem Kontext raus
Die Beschreibung jedes aktivierten Tools wird mit dem Request geschickt, ein fetter Katalog belastet also jeden Turn. Die Antwort des Connectors ist defer_loading: true: Die Beschreibung bleibt aus dem initialen Kontext und Claude zieht sie bei Bedarf via Tool Search Tool nach.
{
"type": "mcp_toolset",
"mcp_server_name": "calendar-mcp",
"default_config": { "defer_loading": true },
"configs": {
"search_events": { "defer_loading": false }
}
}
Lies das so: alles deferren außer dem einen Tool, mit dem diese Aufgabe startet. Ein Toolset akzeptiert auch cache_control, sodass ein stabiler Katalog hinter einem Prompt-Caching-Breakpoint sitzen kann, statt jeden Turn neu abgerechnet zu werden. Für die Zahlen dahinter — und warum das Deferren von Tools die Selection-Accuracy erhöht statt sie zu senken — siehe Die MCP-Token-Steuer. Wenn nicht die Definitionen, sondern die Ergebnisse deinen Kontext fluten, greife stattdessen zu Programmatic Tool Calling.
Was zurückkommt
Zwei Content-Block-Typen, die du behandeln musst:
{ "type": "mcp_tool_use", "id": "mcptoolu_...", "name": "echo",
"server_name": "example-mcp", "input": { "param1": "value1" } }
{ "type": "mcp_tool_result", "tool_use_id": "mcptoolu_...", "is_error": false,
"content": [ { "type": "text", "text": "Hello" } ] }
Beachte server_name am Use-Block: Mit mehreren angebundenen Servern ist das der Weg, einen Call zuzuordnen — essenziell für Logging und um zu debuggen, welche Integration schiefging. Und is_error ist ein Feld, keine Exception: Ein fehlgeschlagenes MCP-Tool kommt als Result zurück, dein Loop muss es also prüfen, statt Erfolg anzunehmen.
Die Grenzen, die beißen
- Nur Tools. Von der MCP-Spec unterstützt der Connector derzeit Tool-Calls — nicht Prompts oder Resources. Brauchst du die? Betreibe einen eigenen Client und nutze die SDK-MCP-Helper.
- Nur remote HTTPS. Der Server muss öffentlich über HTTP erreichbar sein (Streamable HTTP oder SSE Transports). Ein lokaler stdio-Server kann so nicht angebunden werden — das ist, was Claude Code und die Desktop-Apps tun.
- Plattformlücken. Verfügbar auf der Claude API, Claude Platform on AWS und Microsoft Foundry (Hosted-on-Anthropic-Deployments). Derzeit nicht auf Amazon Bedrock oder Google Cloud.
- Kein Zero-Data-Retention. Mit MCP-Servern ausgetauschte Daten — Tool-Definitionen und Ausführungsergebnisse — fallen unter die Standard-Retention, nicht unter ZDR.
- Du besitzt das OAuth. Die API nimmt ein authorization_token; es zu beschaffen und vor Ablauf zu refreshen ist deine Aufgabe.
Derselbe Standard, drei Oberflächen
- API (diese Seite) — Remote-Server per URL, via Connector.
- Claude Code — lokale und remote Server in deinen Dev-Sessions.
- Die Apps — MCP treibt Connectors.
Lerne das Protokoll einmal; es überträgt sich. Nur die Verdrahtung unterscheidet sich.
Vertrauen
:::warning Ein MCP-Server ist Code plus Zugriff Binde nur Server an, denen du vertraust, halte sie mit einer Allowlist auf Least Privilege und denk daran: Inhalte, die ein Server zurückgibt, sind untrusted Input und können Prompt Injection tragen. Prüfe Drittanbieter-Server, bevor du sie verdrahtest — Drittanbieter-Code prüfen und MCP-Server absichern. :::
Prüfe dich selbst
0/4- Der Connector ersetzt einen MCP-Client mit zwei Request-Feldern — aber nur für Remote-HTTPS-Server und nur für Tool-Calls.
- mcp_servers ist die Verbindung; das mcp_toolset in tools ist die Policy. Jeder Server muss mit genau einem Toolset paaren.
- Allowlist (default_config.enabled false plus explizite configs) schlägt Denylist: Später zum Server hinzugefügte Tools werden ignoriert, nicht gewährt.
- defer_loading und cache_control sind deine Hebel, wenn Tool-Schemata das Kontextfenster zu fressen beginnen.
- mcp_tool_use- und mcp_tool_result-Blöcke behandeln — inklusive is_error, das ein Feld ist, keine Exception.
- Prüfe den Beta-Header vor dem Ausliefern: mcp-client-2025-11-20 ist aktuell, mcp-client-2025-04-04 ist deprecated.
Quellen & weiterführend
- MCP-Connector — Anthropic-Doku — die maßgebliche Feldreferenz und Migrations-Guide.
- Model Context Protocol Specification — der offene Standard selbst, inklusive Authorization.