Wird geladen

Tools mit MCP definieren

Lektion 5210 Min.

Das Erstellen eines MCP-Servers wird viel einfacher, wenn du das offizielle Python-SDK verwendest. Anstatt komplexe JSON-Schemas von Hand zu schreiben, kannst du Tools mit Decorators definieren und das SDK die Schwerstarbeit übernehmen lassen.

Die Lese- und Aktualisierungs-Tools unseres MCP-Servers, verbunden mit vier Dateien: document.pdf, spreadsheet.xlsx, report.txt und spec.md.

In diesem Beispiel erstellen wir einen Dokumentenverwaltungsserver mit zwei Kern-Tools: eines zum Lesen von Dokumenten und ein weiteres zum Aktualisieren. Alle Dokumente existieren im Speicher als einfaches Dictionary, bei dem die Schlüssel Dokument-IDs und die Werte der Inhalt sind.

Einrichten des MCP-Servers

Das Python-MCP-SDK macht die Servererstellung unkompliziert. Du kannst einen Server mit nur einer Zeile initialisieren:

python
from mcp.server.fastmcp import FastMCP
from pydantic import Field

mcp = FastMCP("DocumentMCP", log_level="ERROR")

Dies erstellt einen voll funktionsfähigen MCP-Server, der Tool-Definitionen, Client-Verbindungen und Nachrichten-Routing verarbeiten kann.

Tool-Definition mit Decorators

Die Lese- und Aktualisierungs-Tools unseres MCP-Servers, verbunden mit vier Dateien: document.pdf, spreadsheet.xlsx, report.txt und spec.md.

Der Decorator-Ansatz des SDK macht das manuelle Schreiben von JSON-Schemas überflüssig. So definierst du ein einfaches Tool:

python
@mcp.tool(
    name="add_ints",
    description="Add two integers together",
)
def tool_fn(
    a=Field(description="First number to add"),
    b=Field(description="Second number to add"),
) -> int:
    return a + b

Im Hintergrund generiert MCP das vollständige Tool-Schema, das Claude verstehen muss, um zu wissen, wann und wie dein Tool zu verwenden ist.

Aufbau des Dokumenten-Lesetools

Das erste Tool liest Dokumentinhalte anhand der ID. Es nimmt eine Dokumentkennung entgegen und gibt den entsprechenden Inhalt aus unserem speicherinternen Dictionary zurück:

python
@mcp.tool(
    name="read_doc_contents",
    description="Read the contents of a document and return it as a string."
)
def read_document(
    doc_id: str = Field(description="Id of the document to read")
):
    if doc_id not in docs:
        raise ValueError(f"Doc with id {doc_id} not found")
    
    return docs[doc_id]

Die Funktion enthält eine grundlegende Fehlerbehandlung, um Anfragen für nicht existierende Dokumente abzufangen. Wenn Claude dieses Tool mit einer gültigen Dokument-ID aufruft, erhält es den vollständigen Dokumentinhalt als String.

Erstellen des Dokumenten-Editor-Tools

Das zweite Tool führt einfache Suchen-und-Ersetzen-Operationen an Dokumenten durch. Es benötigt drei Parameter: die Dokument-ID, den zu suchenden Text und den Ersatztext:

python
@mcp.tool(
    name="edit_document",
    description="Edit a document by replacing a string in the documents content with a new string."
)
def edit_document(
    doc_id: str = Field(description="Id of the document that will be edited"),
    old_str: str = Field(description="The text to replace. Must match exactly, including white space."),
    new_str: str = Field(description="The new text to insert in place of the old text.")
):
    if doc_id not in docs:
        raise ValueError(f"Doc with id {doc_id} not found")
    
    docs[doc_id] = docs[doc_id].replace(old_str, new_str)

Diese Implementierung verwendet Pythons integrierte String-Replace-Methode, die exakte Übereinstimmungen einschließlich Leerzeichen erfordert. Das Tool ändert das Dokument direkt in unserem Dictionary.

Wichtige Vorteile des SDK-Ansatzes

  • Kein manuelles Schreiben von JSON-Schemas erforderlich
  • Typ-Hinweise ermöglichen automatische Parametervalidierung
  • Feldbeschreibungen helfen Claude, die Tool-Nutzung zu verstehen
  • Fehlerbehandlung integriert sich natürlich mit Python-Exceptions
  • Tool-Registrierung erfolgt automatisch durch Decorators

Das MCP-Python-SDK verwandelt die Tool-Erstellung von einer komplexen Schema-Schreibübung in unkomplizierte Python-Funktionsdefinitionen. Deine Tools werden wartbarer und leichter zu testen, während Claude alle Metadaten erhält, die es braucht, um sie effektiv zu nutzen.