Das Erstellen eines MCP-Servers wird viel einfacher, wenn du das offizielle Python-SDK verwendest. Anstatt komplexe JSON-Schemas für Tools manuell zu schreiben, übernimmt das SDK diese ganze Komplexität für dich mit Decorators und Type Hints.

In diesem Beispiel erstellen wir einen MCP-Server, der Dokumente verwaltet, die im Speicher abgelegt sind. Der Server stellt zwei wesentliche Tools bereit: eines zum Lesen von Dokumentinhalten und ein weiteres zum Aktualisieren dieser Inhalte durch Suchen-und-Ersetzen-Operationen.
Einrichten des MCP-Servers
Das Python-MCP-SDK macht die Server-Erstellung unglaublich einfach. Du kannst einen vollständigen MCP-Server mit nur einer Zeile initialisieren:
from mcp.server.fastmcp import FastMCP
from pydantic import Field
mcp = FastMCP("DocumentMCP", log_level="ERROR")Für diese Implementierung werden Dokumente in einem einfachen Python-Dictionary gespeichert, bei dem die Schlüssel Dokument-IDs sind und die Werte den Dokumentinhalt enthalten:
docs = {
"deposition.md": "This deposition covers the testimony of Angela Smith, P.E.",
"report.pdf": "The report details the state of a 20m condenser tower.",
"financials.docx": "These financials outline the project's budget and expenditure",
"outlook.pdf": "This document presents the projected future performance of the",
"plan.md": "The plan outlines the steps for the project's implementation.",
"spec.txt": "These specifications define the technical requirements for the equipment"
}Tool-Definition mit Decorators

Das SDK verwandelt die Tool-Erstellung von einem umständlichen Prozess in etwas Sauberes und Lesbares. Anstatt lange JSON-Schemas zu schreiben, verwendest du Python-Decorators und Type Hints.
Erstellen des Dokument-Lese-Tools
Das erste Tool ermöglicht es Claude, jedes Dokument anhand seiner ID zu lesen. Hier ist die vollständige Implementierung:
@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]Der @mcp.tool-Decorator generiert automatisch das JSON-Schema, das Claude benötigt. Die Field-Klasse von Pydantic liefert Parameterbeschreibungen, die Claude helfen zu verstehen, was jedes Argument erwartet.
Erstellen des Dokument-Editor-Tools
Das zweite Tool führt einfache Suchen-und-Ersetzen-Operationen an Dokumenten durch:
@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 whitespace."),
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)Dieses Tool nimmt drei Parameter entgegen: die Dokument-ID, den zu suchenden Text und den Ersatztext. Die Implementierung verwendet der Einfachheit halber die eingebaute String-Methode replace() von Python.
Fehlerbehandlung
Beide Tools enthalten eine grundlegende Fehlerbehandlung für Fälle, in denen Claude ein Dokument anfordert, das nicht existiert. Wenn eine ungültige Dokument-ID angegeben wird, lösen die Tools einen ValueError mit einer aussagekräftigen Meldung aus, die Claude verstehen und gegebenenfalls darauf reagieren kann.
Wesentliche Vorteile des SDK-Ansatzes
- Automatische JSON-Schema-Generierung aus Python-Type-Hints
- Sauberer, lesbarer Code, der leicht zu warten ist
- Eingebaute Parametervalidierung durch Pydantic
- Reduzierter Boilerplate-Code im Vergleich zum manuellen Schreiben von Schemas
- Typsicherheit und IDE-Unterstützung für die Entwicklung
Das MCP-Python-SDK verwandelt das, was früher ein komplexer Prozess des Schreibens von Tool-Definitionen war, in etwas, das sich für Python-Entwickler natürlich anfühlt. Du konzentrierst dich auf die Geschäftslogik, während das SDK die Protokolldetails übernimmt.