Zum Hauptinhalt springen
Benutzerdefinierte Tools erweitern das Agent SDK, indem Sie Ihre eigenen Funktionen definieren können, die Claude während einer Konversation aufrufen kann. Mit dem In-Process-MCP-Server des SDK können Sie Claude Zugriff auf Datenbanken, externe APIs, domänenspezifische Logik oder jede andere Funktionalität geben, die Ihre Anwendung benötigt. Dieser Leitfaden behandelt, wie Sie Tools mit Eingabeschemas und Handlern definieren, sie in einen MCP-Server bündeln, sie an 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 definierenVerwenden 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 registrierenWickeln 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 genehmigenFü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 aufrufenSetzen Sie readOnlyHint: true auf Tools ohne Nebenwirkungen. Siehe Fügen Sie Tool-Annotationen hinzu.
Fehler behandeln, ohne die Schleife zu stoppenGeben Sie isError: true zurück, anstatt zu werfen. Siehe Fehler behandeln.
Geben Sie Bilder oder Dateien zurückVerwenden Sie image- oder resource-Blöcke im Content-Array. Siehe Geben Sie Bilder und Ressourcen zurück.
Geben Sie ein maschinenlesbares JSON-Ergebnis zurückSetzen Sie structuredContent auf das Ergebnis. Siehe Geben Sie strukturierte Daten zurück.
Skalieren Sie auf viele ToolsVerwenden 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 den tool()-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 args des 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 einem type von "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 mit content zurückgegeben wird. Siehe Geben Sie strukturierte Daten zurück.
    • isError (optional): setzen Sie auf true, um einen Tool-Fehler zu signalisieren, damit Claude darauf reagieren kann. Siehe Fehler behandeln.
Nach dem Definieren eines Tools wickeln Sie es mit 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 ein get_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.
from typing import Any
import httpx
from claude_agent_sdk import tool, create_sdk_mcp_server


# Define a tool: name, description, input schema, handler
@tool(
    "get_temperature",
    "Get the current temperature at a location",
    {"latitude": float, "longitude": float},
)
async def get_temperature(args: dict[str, Any]) -> dict[str, Any]:
    async with httpx.AsyncClient() as client:
        response = await client.get(
            "https://api.open-meteo.com/v1/forecast",
            params={
                "latitude": args["latitude"],
                "longitude": args["longitude"],
                "current": "temperature_2m",
                "temperature_unit": "fahrenheit",
            },
        )
        data = response.json()

    # Return a content array - Claude sees this as the tool result
    return {
        "content": [
            {
                "type": "text",
                "text": f"Temperature: {data['current']['temperature_2m']}°F",
            }
        ]
    }


# Wrap the tool in an in-process MCP server
weather_server = create_sdk_mcp_server(
    name="weather",
    version="1.0.0",
    tools=[get_temperature],
)
Siehe die tool()-TypeScript-Referenz oder die @tool-Python-Referenz für vollständige Parameterdetails, einschließlich JSON-Schema-Eingabeformate und Rückgabewertstruktur.
Um einen Parameter optional zu machen: Fügen Sie in TypeScript .default() zum Zod-Feld hinzu. In Python behandelt das Dict-Schema jeden Schlüssel als erforderlich, also lassen Sie den Parameter aus dem Schema weg, erwähnen Sie ihn in der Beschreibungszeichenkette und lesen Sie ihn mit args.get() im Handler. Das get_precipitation_chance-Tool unten zeigt beide Muster.

Rufen Sie ein benutzerdefiniertes Tool auf

Übergeben Sie den MCP-Server, den Sie erstellt haben, an query ü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.
import asyncio
from claude_agent_sdk import query, ClaudeAgentOptions, ResultMessage


async def main():
    options = ClaudeAgentOptions(
        mcp_servers={"weather": weather_server},
        allowed_tools=["mcp__weather__get_temperature"],
    )

    async for message in query(
        prompt="What's the temperature in San Francisco?",
        options=options,
    ):
        # ResultMessage is the final message after all tool calls complete
        if isinstance(message, ResultMessage) and message.subtype == "success":
            print(message.result)


asyncio.run(main())

Fügen Sie weitere Tools hinzu

Ein Server enthält so viele Tools, wie Sie in seinem tools-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.
# Define a second tool for the same server
@tool(
    "get_precipitation_chance",
    "Get the hourly precipitation probability for a location. "
    "Optionally pass 'hours' (1-24) to control how many hours to return.",
    {"latitude": float, "longitude": float},
)
async def get_precipitation_chance(args: dict[str, Any]) -> dict[str, Any]:
    # 'hours' isn't in the schema - read it with .get() to make it optional
    hours = args.get("hours", 12)
    async with httpx.AsyncClient() as client:
        response = await client.get(
            "https://api.open-meteo.com/v1/forecast",
            params={
                "latitude": args["latitude"],
                "longitude": args["longitude"],
                "hourly": "precipitation_probability",
                "forecast_days": 1,
            },
        )
        data = response.json()
    chances = data["hourly"]["precipitation_probability"][:hours]

    return {
        "content": [
            {
                "type": "text",
                "text": f"Next {hours} hours: {'%, '.join(map(str, chances))}%",
            }
        ]
    }


# Rebuild the server with both tools in the array
weather_server = create_sdk_mcp_server(
    name="weather",
    version="1.0.0",
    tools=[get_temperature, get_precipitation_chance],
)
Jedes Tool in diesem Array verbraucht Kontextfensterplatz bei jedem Durchgang. Wenn Sie Dutzende von Tools definieren, siehe Tool-Suche, um sie stattdessen bei Bedarf zu laden.

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 den tool()-Helper in TypeScript oder über das annotations-Schlüsselwortargument für den @tool-Dekorator in Python. Alle Hint-Felder sind Boolesche Werte.
FeldStandardBedeutung
readOnlyHintfalseTool ändert seine Umgebung nicht. Steuert, ob das Tool parallel mit anderen schreibgeschützten Tools aufgerufen werden kann.
destructiveHinttrueTool kann destruktive Updates durchführen. Nur informativ.
idempotentHintfalseWiederholte Aufrufe mit denselben Argumenten haben keine zusätzliche Auswirkung. Nur informativ.
openWorldHinttrueTool erreicht Systeme außerhalb Ihres Prozesses. Nur informativ.
Annotationen sind Metadaten, keine Durchsetzung. Ein Tool, das mit 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.
from claude_agent_sdk import tool, ToolAnnotations


@tool(
    "get_temperature",
    "Get the current temperature at a location",
    {"latitude": float, "longitude": float},
    annotations=ToolAnnotations(
        readOnlyHint=True
    ),  # Lets Claude batch this with other read-only calls
)
async def get_temperature(args):
    return {"content": [{"type": "text", "text": "..."}]}
Siehe ToolAnnotations in der TypeScript- oder Python-Referenz.

Tool-Zugriff kontrollieren

Das Wetter-Tool-Beispiel registrierte einen Server und listete Tools in allowedTools 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_temperature im Server weather wird zu mcp__weather__get_temperature

Zulässige Tools konfigurieren

Die tools-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.
OptionEbeneAuswirkung
tools: ["Read", "Grep"]VerfügbarkeitNur die aufgelisteten integrierten Tools sind in Claudes Kontext. Nicht aufgelistete integrierte Tools werden entfernt. MCP-Tools sind nicht betroffen.
tools: []VerfügbarkeitAlle integrierten Tools werden entfernt. Claude kann nur Ihre MCP-Tools verwenden.
zulässige ToolsBerechtigungAufgelistete Tools werden ohne Genehmigungsaufforderung ausgeführt. Nicht aufgelistete Tools bleiben verfügbar; Aufrufe gehen durch den Genehmigungsfluss.
nicht zulässige ToolsBeideEin 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.
Um ein integriertes Tool vollständig zu entfernen, lassen Sie es aus 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 passiertErgebnis
Handler wirft eine nicht abgefangene AusnahmeAgent-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ückAgent-Schleife setzt sich fort. Claude sieht den Fehler als Daten und kann erneut versuchen, ein anderes Tool versuchen oder den Fehler erklären.
Das Beispiel unten fängt zwei Arten von Fehlern im Handler ab, anstatt sie werfen zu lassen. Ein Nicht-200-HTTP-Status wird aus der Antwort abgefangen und als Fehler-Ergebnis zurückgegeben. Ein Netzwerkfehler oder ungültiges JSON wird durch das umgebende 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.
import json
import httpx
from typing import Any


@tool(
    "fetch_data",
    "Fetch data from an API",
    {"endpoint": str},  # Simple schema
)
async def fetch_data(args: dict[str, Any]) -> dict[str, Any]:
    try:
        async with httpx.AsyncClient() as client:
            response = await client.get(args["endpoint"])
            if response.status_code != 200:
                # Return the failure as a tool result so Claude can react to it.
                # is_error marks this as a failed call rather than odd-looking data.
                return {
                    "content": [
                        {
                            "type": "text",
                            "text": f"API error: {response.status_code} {response.reason_phrase}",
                        }
                    ],
                    "is_error": True,
                }

            data = response.json()
            return {"content": [{"type": "text", "text": json.dumps(data, indent=2)}]}
    except Exception as e:
        # Catching here keeps the agent loop alive. An uncaught exception
        # would end the whole query() call.
        return {
            "content": [{"type": "text", "text": f"Failed to fetch data: {str(e)}"}],
            "is_error": True,
        }

Geben Sie Bilder und Ressourcen zurück

Das content-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.
FeldTypNotizen
type"image"
datastringBase64-kodierte Bytes. Nur rohes Base64, kein data:image/...;base64,-Präfix
mimeTypestringErforderlich. Zum Beispiel image/png, image/jpeg, image/webp, image/gif
import base64
import httpx


# Define a tool that fetches an image from a URL and returns it to Claude
@tool("fetch_image", "Fetch an image from a URL and return it to Claude", {"url": str})
async def fetch_image(args):
    async with httpx.AsyncClient() as client:  # Fetch the image bytes
        response = await client.get(args["url"])

    return {
        "content": [
            {
                "type": "image",
                "data": base64.b64encode(response.content).decode(
                    "ascii"
                ),  # Base64-encode the raw bytes
                "mimeType": response.headers.get(
                    "content-type", "image/png"
                ),  # Read MIME type from the response
            }
        ]
    }

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 im text- 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.
FeldTypNotizen
type"resource"
resource.uristringBezeichner für den Inhalt. Beliebiges URI-Schema
resource.textstringDer Inhalt, wenn er Text ist. Geben Sie dies oder blob an, nicht beide
resource.blobstringDer Inhalt Base64-kodiert, wenn er binär ist
resource.mimeTypestringOptional
Dieses Beispiel zeigt einen Ressourcenblock, der von innen aus einem Tool-Handler zurückgegeben wird. Der URI file:///tmp/report.md ist ein Label, das Claude später referenzieren kann; das SDK liest nicht aus diesem Pfad.
return {
  content: [
    {
      type: "resource",
      resource: {
        uri: "file:///tmp/report.md", // Label for Claude to reference, not a path the SDK reads
        mimeType: "text/markdown",
        text: "# Report\n..." // The actual content, inline
      }
    }
  ]
};
Diese Block-Formen stammen aus dem MCP-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
return {
  content: [
    {
      type: "image",
      data: chartPngBuffer.toString("base64"),
      mimeType: "image/png"
    }
  ],
  structuredContent: {
    series: "temperature_2m",
    unit: "fahrenheit",
    points: [62.1, 63.4, 65.0, 64.2]
  }
};
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_type ist auf einen festen Satz von Werten beschränkt. In TypeScript verwenden Sie z.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: true zurück, damit Claude dem Benutzer sagen kann, was schief gelaufen ist, anstatt einen Fehler als normales Ergebnis zu behandeln.
from typing import Any
from claude_agent_sdk import tool, create_sdk_mcp_server


# z.enum() in TypeScript becomes an "enum" constraint in JSON Schema.
# The dict schema has no equivalent, so full JSON Schema is required.
@tool(
    "convert_units",
    "Convert a value from one unit to another",
    {
        "type": "object",
        "properties": {
            "unit_type": {
                "type": "string",
                "enum": ["length", "temperature", "weight"],
                "description": "Category of unit",
            },
            "from_unit": {
                "type": "string",
                "description": "Unit to convert from, e.g. kilometers, fahrenheit, pounds",
            },
            "to_unit": {"type": "string", "description": "Unit to convert to"},
            "value": {"type": "number", "description": "Value to convert"},
        },
        "required": ["unit_type", "from_unit", "to_unit", "value"],
    },
)
async def convert_units(args: dict[str, Any]) -> dict[str, Any]:
    conversions = {
        "length": {
            "kilometers_to_miles": lambda v: v * 0.621371,
            "miles_to_kilometers": lambda v: v * 1.60934,
            "meters_to_feet": lambda v: v * 3.28084,
            "feet_to_meters": lambda v: v * 0.3048,
        },
        "temperature": {
            "celsius_to_fahrenheit": lambda v: (v * 9) / 5 + 32,
            "fahrenheit_to_celsius": lambda v: (v - 32) * 5 / 9,
            "celsius_to_kelvin": lambda v: v + 273.15,
            "kelvin_to_celsius": lambda v: v - 273.15,
        },
        "weight": {
            "kilograms_to_pounds": lambda v: v * 2.20462,
            "pounds_to_kilograms": lambda v: v * 0.453592,
            "grams_to_ounces": lambda v: v * 0.035274,
            "ounces_to_grams": lambda v: v * 28.3495,
        },
    }

    key = f"{args['from_unit']}_to_{args['to_unit']}"
    fn = conversions.get(args["unit_type"], {}).get(key)

    if not fn:
        return {
            "content": [
                {
                    "type": "text",
                    "text": f"Unsupported conversion: {args['from_unit']} to {args['to_unit']}",
                }
            ],
            "is_error": True,
        }

    result = fn(args["value"])
    return {
        "content": [
            {
                "type": "text",
                "text": f"{args['value']} {args['from_unit']} = {result:.4f} {args['to_unit']}",
            }
        ]
    }


converter_server = create_sdk_mcp_server(
    name="converter",
    version="1.0.0",
    tools=[convert_units],
)
Sobald der Server definiert ist, übergeben Sie ihn an 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.
import asyncio
from claude_agent_sdk import (
    query,
    ClaudeAgentOptions,
    ResultMessage,
    AssistantMessage,
    ToolUseBlock,
)


async def main():
    options = ClaudeAgentOptions(
        mcp_servers={"converter": converter_server},
        allowed_tools=["mcp__converter__convert_units"],
    )

    prompts = [
        "Convert 100 kilometers to miles.",
        "What is 72°F in Celsius?",
        "How many pounds is 5 kilograms?",
    ]

    for prompt in prompts:
        async for message in query(prompt=prompt, options=options):
            if isinstance(message, AssistantMessage):
                for block in message.content:
                    if isinstance(block, ToolUseBlock):
                        print(f"[tool call] {block.name}({block.input})")
            elif isinstance(message, ResultMessage) and message.subtype == "success":
                print(f"Q: {prompt}\nA: {message.result}\n")


asyncio.run(main())

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.

Verwandte Dokumentation