query übergeben und kontrollieren, auf welche Tools Claude zugreifen kann. Er behandelt auch Fehlerbehandlung, Tool-Annotationen und die Rückgabe von Nicht-Text-Inhalten wie Bildern.
Schnellreferenz
| Wenn Sie möchten… | Tun Sie dies |
|---|---|
| Ein Tool definieren | Verwenden Sie @tool (Python) oder tool() (TypeScript) mit einem Namen, einer Beschreibung, einem Schema und einem Handler. Siehe Erstellen Sie ein benutzerdefiniertes Tool. |
| Ein Tool bei Claude registrieren | Wickeln Sie in create_sdk_mcp_server / createSdkMcpServer ein und übergeben Sie es an mcpServers in query(). Siehe Rufen Sie ein benutzerdefiniertes Tool auf. |
| Ein Tool vorab genehmigen | Fügen Sie es zu Ihren zulässigen Tools hinzu. Siehe Konfigurieren Sie zulässige Tools. |
| Entfernen Sie ein integriertes Tool aus Claudes Kontext | Übergeben Sie ein tools-Array, das nur die gewünschten integrierten Tools auflistet. Siehe Konfigurieren Sie zulässige Tools. |
| Lassen Sie Claude Tools parallel aufrufen | Setzen Sie readOnlyHint: true auf Tools ohne Nebenwirkungen. Siehe Fügen Sie Tool-Annotationen hinzu. |
| Fehler behandeln, ohne die Schleife zu stoppen | Geben Sie isError: true zurück, anstatt zu werfen. Siehe Fehler behandeln. |
| Geben Sie Bilder oder Dateien zurück | Verwenden Sie image- oder resource-Blöcke im Content-Array. Siehe Geben Sie Bilder und Ressourcen zurück. |
| Geben Sie ein maschinenlesbares JSON-Ergebnis zurück | Setzen Sie structuredContent auf das Ergebnis. Siehe Geben Sie strukturierte Daten zurück. |
| Skalieren Sie auf viele Tools | Verwenden Sie Tool-Suche, um Tools bei Bedarf zu laden. |
Erstellen Sie ein benutzerdefiniertes Tool
Ein Tool wird durch vier Teile definiert, die als Argumente an dentool()-Helper in TypeScript oder den @tool-Dekorator in Python übergeben werden:
- Name: ein eindeutiger Bezeichner, den Claude verwendet, um das Tool aufzurufen.
- Beschreibung: was das Tool tut. Claude liest dies, um zu entscheiden, wann es aufgerufen werden soll.
- Eingabeschema: die Argumente, die Claude bereitstellen muss. In TypeScript ist dies immer ein Zod-Schema, und die
argsdes Handlers werden automatisch davon typisiert. In Python ist dies ein Dict, das Namen auf Typen abbildet, wie{"latitude": float}, das das SDK für Sie in JSON Schema konvertiert. Der Python-Dekorator akzeptiert auch direkt ein vollständiges JSON Schema-Dict, wenn Sie Enums, Bereiche, optionale Felder oder verschachtelte Objekte benötigen. - Handler: die asynchrone Funktion, die ausgeführt wird, wenn Claude das Tool aufruft. Sie empfängt die validierten Argumente und muss ein Objekt mit folgenden Eigenschaften zurückgeben:
content(erforderlich): ein Array von Ergebnisblöcken, jeder mit einemtypevon"text","image"oder"resource". Siehe Geben Sie Bilder und Ressourcen zurück für Nicht-Text-Blöcke.structuredContent(optional): ein JSON-Objekt, das das Ergebnis als maschinenlesbare Daten enthält, das zusammen mitcontentzurückgegeben wird. Siehe Geben Sie strukturierte Daten zurück.isError(optional): setzen Sie auftrue, um einen Tool-Fehler zu signalisieren, damit Claude darauf reagieren kann. Siehe Fehler behandeln.
createSdkMcpServer (TypeScript) oder create_sdk_mcp_server (Python) in einen Server ein. Der Server läuft im Prozess in Ihrer Anwendung, nicht als separater Prozess.
Beispiel für ein Wetter-Tool
Dieses Beispiel definiert einget_temperature-Tool und wickelt es in einen MCP-Server ein. Es richtet nur das Tool ein; um es an query zu übergeben und auszuführen, siehe Rufen Sie ein benutzerdefiniertes Tool auf unten.
tool()-TypeScript-Referenz oder die @tool-Python-Referenz für vollständige Parameterdetails, einschließlich JSON-Schema-Eingabeformate und Rückgabewertstruktur.
Rufen Sie ein benutzerdefiniertes Tool auf
Übergeben Sie den MCP-Server, den Sie erstellt haben, anquery über die mcpServers-Option. Der Schlüssel in mcpServers wird zum {server_name}-Segment im vollständig qualifizierten Namen jedes Tools: mcp__{server_name}__{tool_name}. Listen Sie diesen Namen in allowedTools auf, damit das Tool ohne Genehmigungsaufforderung ausgeführt wird.
Diese Snippets verwenden den weatherServer aus dem Beispiel oben wieder, um Claude zu fragen, wie das Wetter an einem bestimmten Ort ist.
Fügen Sie weitere Tools hinzu
Ein Server enthält so viele Tools, wie Sie in seinemtools-Array auflisten. Mit mehr als einem Tool auf einem Server können Sie jedes einzelne in allowedTools auflisten oder das Wildcard mcp__weather__* verwenden, um alle Tools abzudecken, die der Server verfügbar macht.
Das Beispiel unten fügt ein zweites Tool, get_precipitation_chance, zum weatherServer aus dem Wetter-Tool-Beispiel hinzu und erstellt ihn mit beiden Tools im Array neu.
Fügen Sie Tool-Annotationen hinzu
Tool-Annotationen sind optionale Metadaten, die beschreiben, wie sich ein Tool verhält. Übergeben Sie sie als fünftes Argument an dentool()-Helper in TypeScript oder über das annotations-Schlüsselwortargument für den @tool-Dekorator in Python. Alle Hint-Felder sind Boolesche Werte.
| Feld | Standard | Bedeutung |
|---|---|---|
readOnlyHint | false | Tool ändert seine Umgebung nicht. Steuert, ob das Tool parallel mit anderen schreibgeschützten Tools aufgerufen werden kann. |
destructiveHint | true | Tool kann destruktive Updates durchführen. Nur informativ. |
idempotentHint | false | Wiederholte Aufrufe mit denselben Argumenten haben keine zusätzliche Auswirkung. Nur informativ. |
openWorldHint | true | Tool erreicht Systeme außerhalb Ihres Prozesses. Nur informativ. |
readOnlyHint: true markiert ist, kann immer noch auf die Festplatte schreiben, wenn das der Handler tut. Halten Sie die Annotation genau zum Handler.
Dieses Beispiel fügt readOnlyHint zum get_temperature-Tool aus dem Wetter-Tool-Beispiel hinzu.
ToolAnnotations in der TypeScript- oder Python-Referenz.
Tool-Zugriff kontrollieren
Das Wetter-Tool-Beispiel registrierte einen Server und listete Tools inallowedTools auf. Dieser Abschnitt behandelt, wie Tool-Namen konstruiert werden und wie Sie den Zugriff scoped, wenn Sie mehrere Tools haben oder integrierte Tools einschränken möchten.
Tool-Namensformat
Wenn MCP-Tools Claude verfügbar gemacht werden, folgen ihre Namen einem bestimmten Format:- Muster:
mcp__{server_name}__{tool_name} - Beispiel: Ein Tool namens
get_temperatureim Serverweatherwird zumcp__weather__get_temperature
Zulässige Tools konfigurieren
Dietools-Option und die zulässigen/nicht zulässigen Listen beeinflussen zwei Ebenen: Verfügbarkeit, die steuert, ob ein Tool in Claudes Kontext angezeigt wird, und Berechtigung, die steuert, ob ein Aufruf genehmigt wird, sobald Claude ihn versucht. tools und einfache disallowedTools-Einträge ändern die Verfügbarkeit. allowedTools und scoped disallowedTools-Regeln ändern nur die Berechtigung.
| Option | Ebene | Auswirkung |
|---|---|---|
tools: ["Read", "Grep"] | Verfügbarkeit | Nur die aufgelisteten integrierten Tools sind in Claudes Kontext. Nicht aufgelistete integrierte Tools werden entfernt. MCP-Tools sind nicht betroffen. |
tools: [] | Verfügbarkeit | Alle integrierten Tools werden entfernt. Claude kann nur Ihre MCP-Tools verwenden. |
| zulässige Tools | Berechtigung | Aufgelistete Tools werden ohne Genehmigungsaufforderung ausgeführt. Nicht aufgelistete Tools bleiben verfügbar; Aufrufe gehen durch den Genehmigungsfluss. |
| nicht zulässige Tools | Beide | Ein einfacher Tool-Name wie "Bash" entfernt das Tool aus Claudes Kontext, genauso wie das Weglassen aus tools. Eine scoped-Regel wie "Bash(rm *)" lässt das Tool im Kontext und lehnt nur übereinstimmende Aufrufe ab. |
tools weg oder listen Sie seinen einfachen Namen in disallowedTools (Python: disallowed_tools) auf; beide halten das Tool aus dem Kontext, damit Claude es nie versucht. Eine scoped disallowedTools-Regel blockiert übereinstimmende Aufrufe, lässt das Tool aber sichtbar, daher kann Claude möglicherweise einen Durchgang damit verschwenden. Siehe Berechtigungen konfigurieren für die vollständige Evaluierungsreihenfolge.
Fehler behandeln
Wie Ihr Handler Fehler meldet, bestimmt, ob die Agent-Schleife fortgesetzt oder gestoppt wird:| Was passiert | Ergebnis |
|---|---|
| Handler wirft eine nicht abgefangene Ausnahme | Agent-Schleife stoppt. Claude sieht den Fehler nie, und der query-Aufruf schlägt fehl. |
Handler fängt den Fehler ab und gibt isError: true (TS) / "is_error": True (Python) zurück | Agent-Schleife setzt sich fort. Claude sieht den Fehler als Daten und kann erneut versuchen, ein anderes Tool versuchen oder den Fehler erklären. |
try/except (Python) oder try/catch (TypeScript) abgefangen und auch als Fehler-Ergebnis zurückgegeben. In beiden Fällen gibt der Handler normal zurück und die Agent-Schleife setzt sich fort.
Geben Sie Bilder und Ressourcen zurück
Dascontent-Array in einem Tool-Ergebnis akzeptiert text-, image- und resource-Blöcke. Sie können sie in derselben Antwort mischen.
Bilder
Ein Bildblock trägt die Bildbytes inline, kodiert als Base64. Es gibt kein URL-Feld. Um ein Bild zurückzugeben, das sich unter einer URL befindet, rufen Sie es im Handler ab, lesen Sie die Antwortbytes und kodieren Sie sie Base64, bevor Sie sie zurückgeben. Das Ergebnis wird als visueller Input verarbeitet.| Feld | Typ | Notizen |
|---|---|---|
type | "image" | |
data | string | Base64-kodierte Bytes. Nur rohes Base64, kein data:image/...;base64,-Präfix |
mimeType | string | Erforderlich. Zum Beispiel image/png, image/jpeg, image/webp, image/gif |
Ressourcen
Ein Ressourcenblock bettet ein Stück Inhalt ein, das durch einen URI identifiziert wird. Der URI ist ein Label für Claude, um darauf zu verweisen; der tatsächliche Inhalt befindet sich imtext- oder blob-Feld des Blocks. Verwenden Sie dies, wenn Ihr Tool etwas produziert, das sinnvoll ist, um später nach Name adressiert zu werden, wie eine generierte Datei oder ein Datensatz aus einem externen System.
| Feld | Typ | Notizen |
|---|---|---|
type | "resource" | |
resource.uri | string | Bezeichner für den Inhalt. Beliebiges URI-Schema |
resource.text | string | Der Inhalt, wenn er Text ist. Geben Sie dies oder blob an, nicht beide |
resource.blob | string | Der Inhalt Base64-kodiert, wenn er binär ist |
resource.mimeType | string | Optional |
file:///tmp/report.md ist ein Label, das Claude später referenzieren kann; das SDK liest nicht aus diesem Pfad.
CallToolResult-Typ. Siehe die MCP-Spezifikation für die vollständige Definition.
Geben Sie strukturierte Daten zurück
structuredContent ist ein optionales JSON-Objekt auf dem Ergebnis, getrennt vom content-Array. Verwenden Sie es, um Rohwerte zurückzugeben, die Claude als exakte Felder lesen kann, anstatt sie aus einer Textzeichenkette oder einem Bild zu analysieren.
Wenn structuredContent gesetzt ist, empfängt Claude das JSON plus alle Bild- oder Ressourcenblöcke aus content. Textblöcke in content werden nicht weitergeleitet, da angenommen wird, dass sie die strukturierten Daten duplizieren. Das Beispiel unten rendert ein Diagramm als Bildblock und gibt die Datenpunkte dahinter in structuredContent vom selben Handler zurück.
TypeScript
Der Python-
@tool-Dekorator leitet nur content und is_error aus dem Rückgabe-Dict des Handlers weiter. Um structuredContent von Python zurückzugeben, führen Sie stattdessen einen eigenständigen MCP-Server aus.Beispiel: Einheitenkonverter
Dieses Tool konvertiert Werte zwischen Einheiten der Länge, Temperatur und des Gewichts. Ein Benutzer kann fragen „100 Kilometer in Meilen konvertieren” oder „Was ist 72°F in Celsius”, und Claude wählt den richtigen Einheitstyp und die Einheiten aus der Anfrage. Es demonstriert zwei Muster:- Enum-Schemas:
unit_typeist auf einen festen Satz von Werten beschränkt. In TypeScript verwenden Siez.enum(). In Python unterstützt das Dict-Schema keine Enums, daher ist das vollständige JSON-Schema-Dict erforderlich. - Behandlung nicht unterstützter Eingaben: Wenn ein Konvertierungspaar nicht gefunden wird, gibt der Handler
isError: truezurück, damit Claude dem Benutzer sagen kann, was schief gelaufen ist, anstatt einen Fehler als normales Ergebnis zu behandeln.
query auf die gleiche Weise wie das Wetter-Beispiel. Dieses Beispiel sendet drei verschiedene Prompts in einer Schleife, um zu zeigen, wie dasselbe Tool verschiedene Einheitstypen handhabt. Für jede Antwort inspiziert es AssistantMessage-Objekte (die die Tool-Aufrufe enthalten, die Claude während dieses Durchgangs gemacht hat) und gibt jeden ToolUseBlock aus, bevor es den endgültigen ResultMessage-Text ausgibt. Dies lässt Sie sehen, wann Claude das Tool verwendet, im Gegensatz zu Antworten aus seinem eigenen Wissen.
Nächste Schritte
Benutzerdefinierte Tools wickeln asynchrone Funktionen in einer Standardschnittstelle ein. Sie können die Muster auf dieser Seite im selben Server mischen: Ein einzelner Server kann ein Datenbank-Tool, ein API-Gateway-Tool und einen Bild-Renderer nebeneinander halten. Von hier aus:- Wenn Ihr Server auf Dutzende von Tools wächst, siehe Tool-Suche, um das Laden zu verschieben, bis Claude sie benötigt.
- Um sich mit externen MCP-Servern (Dateisystem, GitHub, Slack) zu verbinden, anstatt Ihre eigenen zu erstellen, siehe Verbinden Sie MCP-Server.
- Um zu kontrollieren, welche Tools automatisch ausgeführt werden, im Gegensatz zu denen, die Genehmigung erfordern, siehe Konfigurieren Sie Berechtigungen.