Eigenen MCP-Server in Python schreiben: SDK-Tutorial mit MCPServer
Mit dem offiziellen Python-SDK und der Klasse MCPServer (früher FastMCP) lässt sich ein eigener MCP-Server mit wenigen Zeilen Code erstellen. Mithilfe von Decorators können Python-Funktionen als Tools, Resources und Prompts bereitgestellt werden. Der Paketmanager uv erleichtert die Einrichtung, während der MCP Inspector das Testen der Serverfunktionen ermöglicht. Anschließend lässt sich der Server in KI-Anwendungen wie Claude Desktop einbinden.
Was ist ein Python-MCP-Server?
Ein Python-MCP-Server ist eine Anwendung, die mit der Programmiersprache Python entwickelt wird und KI-Systemen über das Model Context Protocol (MCP) externe Daten, Funktionen und vordefinierte Prompts bereitstellt. Der Server verarbeitet Anfragen von MCP-Clients und ermöglicht Sprachmodellen, über ihre Host-Anwendung auf Python-Funktionen, APIs und weitere Datenquellen zuzugreifen.
Das Model Context Protocol (MCP) definiert dafür eine standardisierte Kommunikation zwischen KI-Anwendungen und angebundenen Servern. Ein MCP-Host wie Claude Desktop verwaltet die Verbindung zu einem oder mehreren MCP-Servern über entsprechende Clients. Diese können bereitgestellte Funktionen aufrufen, Ressourcen abrufen und Prompt-Vorlagen verwenden.
Für die Entwicklung eines MCP-Servers mit Python steht das offizielle Python-SDK des MCP-Projekts zur Verfügung. Es übernimmt wesentliche Aufgaben der Protokollkommunikation.
- 100 % DSGVO-konform und sicher in Deutschland gehostet
- Die leistungsstärksten KI-Modelle auf einer Plattform
- Kein Vendor Lock-in durch Open Source
Projekt-Setup: Wie richtet man einen MCP-Server mit Python ein?
Für die Entwicklung eines eigenen MCP-Servers auf Python-Basis werden die Programmiersprache, ein Paketmanager und das offizielle MCP-SDK benötigt. In diesem Tutorial kommt der Paketmanager uv zum Einsatz. Er übernimmt die Projektinitialisierung, die Verwaltung der Python-Abhängigkeiten und die Ausführung des Servers.
Schritt 1: Voraussetzungen
- Python: Version 3.10 oder neuer
- Paketmanager: uv, installiert und über das Terminal aufrufbar. Das Werkzeug übernimmt die Einrichtung des Python-Projekts und die Verwaltung der benötigten Bibliotheken. Alternativ kann auch der Python-Paketmanager pip verwendet werden.
- Entwicklungsumgebung: Terminal und Code-Editor zum Schreiben und Ausführen des Python-Codes.
- JavaScript-Laufzeitumgebung und Paketverwaltung: Node.js (ab Version 22.19.0) und der zugehörige Paketmanager npm werden für das Testwerkzeug MCP Inspector benötigt. Mit dem Kommandozeilenwerkzeug
npx, das zusammen mit npm bereitgestellt wird, lässt sich der Inspector direkt starten, ohne ihn vorher separat installieren zu müssen. - Umgebungsvariablen: Für das lokale Beispiel sind keine API-Schlüssel erforderlich. Bei der Anbindung externer Dienste können beispielsweise
API_KEYoderDATABASE_URLnotwendig werden.
Schritt 2: Python-Projekt initialisieren
Erstellen Sie zunächst ein neues Projekt mit uv:
uv init mcp-server-demo
cd mcp-server-demobashDer erste Befehl legt das Projektverzeichnis und die grundlegenden Projektdateien an. Anschließend wechseln Sie in das neue Verzeichnis.
Schritt 3: MCP-SDK installieren
Installieren Sie die MCP-Bibliothek mit dem folgenden Befehl:
uv add "mcp[cli]"bashDas Paket mcp enthält die Funktionen für die Entwicklung von MCP-Servern und -Clients. Mit der Erweiterung [cli] werden zusätzlich die Kommandozeilenwerkzeuge installiert, die später für das Testen und die Einbindung des Servers benötigt werden.
Wenn Sie ausschließlich das SDK benötigen, genügt auch folgendes Kommando:
uv add mcpbashFür dieses Tutorial empfiehlt sich die Variante mit [cli], da Sie den Server anschließend mit uv run mcp dev testen können.
Tools, Resources und Prompts mit MCPServer implementieren: Python-Codebeispiel
Die Serverklasse MCPServer des offiziellen Python-SDK vereinfacht die Entwicklung eines MCP-Servers. Mithilfe von Python Decorators lassen sich Funktionen als Tools, Resources oder Prompts registrieren. Die Klasse übernimmt dabei unter anderem die Bereitstellung über das MCP-Protokoll und die automatische Erstellung von Eingabeschemata anhand der Python-Typannotationen.
MCP unterscheidet drei zentrale serverseitige Bausteine (Server Primitives): Tools, Resources und Prompts. Sie erfüllen unterschiedliche Aufgaben, wie die folgende Tabelle zeigt.
| Baustein (Server Primitive) | Steuerung | Funktion | Typischer Use Case |
|---|---|---|---|
| Tools | Modellgesteuert | Führen Funktionen und Aktionen aus | Berechnungen, API-Abfragen, Datenbearbeitung |
| Resources | Anwendungsgesteuert | Stellen Daten und Kontext bereit | Dokumente, Konfigurationsdaten, Datenbankinhalte |
| Prompts | Nutzergesteuert | Liefern wiederverwendbare Prompt-Vorlagen | Slash-Commands, Menüeinträge, Zusammenfassungen |
Welche dieser Bausteine zum Einsatz kommen, hängt somit davon ab, ob das Sprachmodell, die Host-Anwendung oder die nutzende Person die Interaktion auslöst.
Schritt 1: MCP-Server mit MCPServer erstellen
Erstellen Sie im Projektverzeichnis eine Datei namens server.py. Das folgende Beispiel implementiert einen einfachen MCP-Server mit einem Berechnungstool, einer dynamischen Ressource und einer Prompt-Vorlage:
from mcp.server import MCPServer
# MCP-Server initialisieren
mcp = MCPServer("PythonDemo")
# Tool: Zwei Zahlen addieren
@mcp.tool()
def add(a: int, b: int) -> int:
"""Addiert zwei ganze Zahlen."""
return a + b
# Resource: Personalisierte Begrüßung bereitstellen
@mcp.resource("greeting://{name}")
def get_greeting(name: str) -> str:
"""Gibt eine personalisierte Begrüßung zurück."""
return f"Hallo, {name}!"
# Prompt: Vorlage für eine Zusammenfassung
@mcp.prompt()
def summarize_topic(topic: str) -> str:
"""Erstellt eine Prompt-Vorlage für ein Thema."""
return (
f"Fasse das Thema '{topic}' in fünf "
"verständlichen Sätzen zusammen."
)
# MCP-Server über stdio starten
if __name__ == "__main__":
mcp.run(transport="stdio")pythonIm offiziellen Python-SDK 1.x hieß die Serverklasse noch FastMCP und wurde über mcp.server.fastmcp importiert. In SDK 2.x wurde sie in MCPServer umbenannt. Der bisherige Import führt deshalb zu einem ModuleNotFoundError. Für bestehende Projekte mit SDK 1.x kann die Abhängigkeit auf mcp<2 begrenzt werden. Unabhängig davon existiert das eigenständige Framework fastmcp, das weiterhin über from fastmcp import FastMCP eingebunden wird.
Schritt 2: Tools registrieren
Mit dem Decorator @mcp.tool() wird eine Python-Funktion als MCP-Tool registriert:
@mcp.tool()
def add(a: int, b: int) -> int:
"""Addiert zwei ganze Zahlen."""
return a + bpythonMCPServer liest die Funktionssignatur und erstellt daraus die benötigten Metadaten. Die Parameter a und b sind als Ganzzahlen definiert. Der Rückgabewert ist ebenfalls eine Ganzzahl. Ein MCP-Client kann die Funktion über den Namen add aufrufen und zwei Werte übergeben. Bei den Argumenten a=5 und b=3 liefert die Funktion das Ergebnis 8.
Schritt 3: Resources bereitstellen
Mit @mcp.resource() können Sie Daten über einen URI zugänglich machen. Enthält der URI wie im folgenden Beispiel einen Platzhalter, registriert MCPServer ein sogenanntes Resource Template:
@mcp.resource("greeting://{name}")
def get_greeting(name: str) -> str:
"""Gibt eine personalisierte Begrüßung zurück."""
return f"Hallo, {name}!"pythonDer URI greeting://{name} enthält einen Platzhalter. Beim Abruf wird dieser durch einen konkreten Namen ersetzt. Beispielsweise liefert greeting://Anna die Antwort Hallo, Anna!. Nach demselben Prinzip können MCP-Server beispielsweise Konfigurationsdaten, Dokumenteninhalte oder Informationen aus angebundenen Systemen bereitstellen. Anders als bei einem Tool steht dabei die Bereitstellung von Kontext im Vordergrund.
Schritt 4: Prompts definieren
Mit dem Decorator @mcp.prompt() lässt sich eine wiederverwendbare Prompt-Vorlage registrieren:
@mcp.prompt()
def summarize_topic(topic: str) -> str:
"""Erstellt eine Prompt-Vorlage für ein Thema."""
return (
f"Fasse das Thema '{topic}' in fünf "
"verständlichen Sätzen zusammen."
)pythonWird der Prompt mit dem Argument topic="Python" abgerufen, entsteht die folgende Anweisung:
Fasse das Thema 'Python' in fünf verständlichen Sätzen zusammen.txtDie Funktion erzeugt lediglich die Prompt-Vorlage. Die eigentliche Zusammenfassung übernimmt das Sprachmodell in der angebundenen KI-Anwendung.
MCP-Server mit dem MCP Inspector testen und debuggen
Der MCP Inspector ist ein offizielles Entwicklerwerkzeug zur Überprüfung von MCP-Servern. Es ermöglicht, verfügbare Tools, Resources und Prompts anzuzeigen, einzelne Funktionen aufzurufen und die Kommunikation zwischen Client und Server zu untersuchen. Der Inspector bietet eine grafische Weboberfläche, einen CLI-Modus für automatisierte Tests und eine interaktive Terminaloberfläche.
Schritt 1: MCP Inspector starten
Für den lokalen Test starten Sie den Inspector aus dem Projektverzeichnis:
uv run mcp dev server.pybashDer Befehl startet den Entwicklungsmodus und stellt den MCP Inspector bereit. Öffnen Sie die im Terminal angezeigte URL im Browser.
Alternativ können Sie den Inspector direkt mit npx aufrufen:
npx @modelcontextprotocol/inspector uv run server.pybashDer Befehl startet den MCP Inspector mit dem angegebenen Python-Server. Öffnen Sie die im Terminal angezeigte URL im Browser und stellen Sie die Verbindung zum Server her. Anschließend können Sie die registrierten Tools, Resource Templates und Prompts überprüfen.
Schritt 2: Tools, Resources und Prompts überprüfen
Nach dem Verbindungsaufbau können die registrierten Funktionen getestet werden:
- Tools: Öffnen Sie den Bereich „Tools“, wählen Sie
addund übergeben Sie die Werte5und3. Als Ergebnis sollte8zurückgegeben werden. - Resource Templates: Öffnen Sie den Bereich „Resource Templates“ und wählen Sie
greeting://{name}aus. Ersetzen Sie den Platzhalter durchAnnaund rufen Sie die Ressource übergreeting://Annaab. Der Server sollteHallo, Anna!zurückgeben. - Prompts: Wählen Sie
summarize_topicund übergeben SiePythonals Argument. Der Server sollte die definierte Prompt-Vorlage zurückgeben.
Damit lässt sich feststellen, ob die Funktionen korrekt registriert wurden und über das MCP-Protokoll erreichbar sind.
Schritt 3: JSON-RPC-Kommunikation über die CLI prüfen
Für Tests ohne grafische Oberfläche bietet der Inspector einen CLI-Modus. Dabei übernimmt er die Rolle eines MCP-Clients und kommuniziert über JSON-RPC mit dem Python-Server. Um die verfügbaren Tools aufzulisten, führen Sie im Projektverzeichnis folgenden Befehl aus:
npx @modelcontextprotocol/inspector --cli uv run server.py --method tools/listbashFür einen gezielten Funktionsaufruf verwenden Sie:
npx @modelcontextprotocol/inspector --cli uv run server.py --method tools/call --tool-name add --tool-arg a=5 --tool-arg b=3bashDer Inspector startet den Server als Unterprozess, baut die MCP-Verbindung auf und sendet die entsprechende Anfrage. Anschließend gibt er die Antwort im Terminal aus. Die CLI unterstützt unter anderem die folgenden Methoden:
initialize: Stellt die Verbindung zwischen MCP-Client und Server her und handelt die unterstützten Protokollfunktionen aus.tools/list: Listet alle verfügbaren Tools des MCP-Servers auf.tools/call: Ruft ein bestimmtes Tool mit den angegebenen Parametern auf.resources/list: Listet die verfügbaren Ressourcen des MCP-Servers auf.resources/templates/list: Listet verfügbare Resource Templates wiegreeting://{name}auf.resources/read: Liest eine konkrete Ressource, beispielsweisegreeting://Anna.prompts/list: Listet alle bereitgestellten Prompt-Vorlagen auf.prompts/get: Ruft eine Prompt-Vorlage mit den angegebenen Argumenten ab.
Mit der Option --format json lässt sich die Ausgabe maschinenlesbar weiterverarbeiten.
Wenn der Inspector keine Verbindung herstellen kann, sollten Sie zunächst den Python-Pfad, die installierten Abhängigkeiten und das Projektverzeichnis prüfen. Außerdem muss sichergestellt sein, dass der Server über stdio startet und keine zusätzlichen Ausgaben auf stdout schreibt.
Python-MCP-Server in KI-Clients einbinden – am Beispiel von Claude Desktop
Nach dem erfolgreichen Test kann der MCP-Server in einen lokalen KI-Client eingebunden werden. Als Beispiel dient nachfolgend Claude Desktop. Die Anwendung unterstützt lokale MCP-Server, die über stdio gestartet und über eine JSON-Konfigurationsdatei registriert werden.
Alternativ lässt sich der MCP-Server mit uv run mcp install server.py automatisch in Claude Desktop registrieren. Der Befehl trägt den Server mit den erforderlichen absoluten Pfaden in die Konfigurationsdatei ein. Eine manuelle Einrichtung ist dann nicht notwendig.
Schritt 1: Konfigurationsdatei öffnen
Die Datei claude_desktop_config.json befindet sich je nach Betriebssystem an einem anderen Speicherort:
| Betriebssystem | Speicherort |
|---|---|
| Windows | %APPDATA%\Claude\claude_desktop_config.json |
| macOS | ~/Library/Application Support/Claude/claude_desktop_config.json |
| Linux | ~/.config/Claude/claude_desktop_config.json (Beta; nicht in der offiziellen MCP-Dokumentation ausgewiesen) |
Die Konfigurationsdatei lässt sich auch über die Entwicklereinstellungen von Claude Desktop aufrufen. Falls sie noch nicht existiert, kann sie am vorgesehenen Speicherort erstellt werden.
Schritt 2: MCP-Server konfigurieren
Fügen Sie der Konfigurationsdatei einen Eintrag unter mcpServers hinzu:
{
"mcpServers": {
"python-demo": {
"command": "uv",
"args": [
"--directory",
"/SERVERPFAD/mcp-server-demo",
"run",
"server.py"
]
}
}
}jsonErsetzen Sie /SERVERPFAD/mcp-server-demo durch den tatsächlichen absoluten Pfad des Projektverzeichnisses. Unter Windows können Sie beispielsweise C:\\Projekte\\mcp-server-demo verwenden.
Die wichtigsten Bestandteile der Konfiguration sind:
mcpServers: Enthält die registrierten MCP-Server.python-demo: Legt einen frei wählbaren Namen für den Server fest.command: Gibt das ausführbare Programm an, mit dem der Server gestartet wird.args: Enthält die Argumente für den Paketmanager uv, einschließlich des Projektverzeichnisses und der Python-Datei.
Falls Claude Desktop uv nicht findet, muss unter command der absolute Pfad zur ausführbaren Datei eingetragen werden. Dieser lässt sich unter Windows mit where uv und unter macOS mit which uv ermitteln.
Benötigt ein MCP-Server Zugangsdaten für externe APIs oder Datenbanken, können diese über den Konfigurationsschlüssel env bereitgestellt werden. Sensible Zugangsdaten sollten nicht fest im Python-Quellcode hinterlegt werden. Für produktive Anwendungen empfiehlt sich eine geeignete Secret-Verwaltung.
Schritt 3: Claude Desktop neu starten und Server testen
Nach dem Speichern der Konfigurationsdatei muss Claude Desktop vollständig beendet und neu gestartet werden, damit die Anwendung den neuen MCP-Server lädt. Prüfen Sie anschließend, ob python-demo in der Übersicht der verfügbaren MCP-Server erscheint. Starten Sie danach eine neue Unterhaltung und geben Sie beispielsweise folgende Anfrage ein:
Addiere die Zahlen 15 und 27 mit dem verfügbaren Python-Tool.txtClaude kann daraufhin das registrierte Tool add verwenden und das Ergebnis 42 zurückgeben. Je nach Einstellungen muss der Tool-Aufruf zuvor bestätigt werden.
Wird der Server nicht erkannt, sollten die JSON-Syntax, die angegebenen Pfade und die Startberechtigungen kontrolliert werden. Bei Problemen können die MCP-Logs von Claude Desktop zusätzliche Hinweise liefern. Für die Fehleranalyse im eigenen Python-Code kann außerdem Python-Logging eingesetzt werden.

