MCP · Lektion 05 · Bauen
Dein erster Python-MCP-Server
Jetzt wird gebaut. Am Ende dieser Lektion läuft ein echter MCP-Server auf deiner Maschine, und du hast sein Tool im MCP Inspector aufgerufen — ganz ohne Agent.
1. Setup (offizielles SDK)
Das Paket heißt mcp. Mit uv (empfohlen) oder pip:1
# Projekt anlegen
uv init mcp-demo && cd mcp-demo
uv add "mcp[cli]"
# oder klassisch:
pip install "mcp[cli]"
Das [cli]-Extra bringt das mcp-Kommando mit, inkl.
Inspector-Integration.
2. Der Server — server.py
Der ganze Server. FastMCP ist die High-Level-API des SDKs; der
Decorator macht aus einer normalen Python-Funktion ein MCP-Tool. Type-Hints und
Docstring werden automatisch zu Schema + Beschreibung, die der Agent sieht:1
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("Demo") # Name, taucht im serverInfo auf
@mcp.tool()
def add(a: int, b: int) -> int:
"""Addiere zwei Zahlen.""" # ← wird zur Tool-Beschreibung
return a + b
@mcp.tool()
def greet(name: str) -> str:
"""Begrüße eine Person beim Namen."""
return f"Hallo, {name}!"
if __name__ == "__main__":
mcp.run(transport="stdio") # lokal, siehe Lektion 4
Lies das im Licht der bisherigen Lektionen:
FastMCP("Demo")→ dasserverInfoaus dem Handshake (Lektion 2).@mcp.tool()→ deklariert dietools-Capability und füllttools/list; ein Aufruf landet alstools/call.- Die
int/str-Type-Hints → das JSON-Input-Schema, das der Agent zum korrekten Aufruf braucht. transport="stdio"→ der Subprozess-Weg aus Lektion 4.
Das ist die Asymmetrie aus Lektion 1 in Aktion: Der Host trägt die ganze Komplexität, dein Server ist nur ein paar dekorierte Funktionen.
3. Testen ohne Agent: der MCP Inspector
Bevor du an einen Agent anbindest, prüfst du den Server isoliert. Der MCP Inspector ist ein Browser-Tool, das sich wie ein Client verbindet und dir Tools/Resources/Prompts zeigt:2
# startet Server + Inspector-UI im Browser
uv run mcp dev server.py
# (oder direkt:) npx @modelcontextprotocol/inspector uv run server.py
Im Inspector: Connect → Reiter Tools → List Tools →
add wählen → a=2, b=3 → Run. Du siehst die echte
tools/call-Anfrage und das Ergebnis 5. Das
ist dein Workshop-Moment: der Wire aus Lektion 2, sichtbar gemacht.
4. Häufige Stolperfalle
Niemals print() in einem STDIO-Server! Es landet auf stdout
und zerschießt die JSON-RPC-Nachrichten (Lektion 4).
Zum Debuggen nach stderr loggen:
import sys
print("debug", file=sys.stderr) # ok: stderr ist erlaubt
5. Übung (selber machen — das baut die Skill)
- Lege
server.pymit den zwei Tools oben an. - Starte
uv run mcp dev server.pyund rufgreetmit deinem Namen auf. - Füge ein drittes Tool
multiply(a, b)hinzu, reload, teste. - Provoziere den Fehler: baue ein
print("hi")ein und beobachte, wie die Verbindung bricht. Entferne es wieder.
Wenn das läuft, hast du das Kern-Handwerk. Melde dich mit „erledigt“ — oder zeig mir deinen Code, ich gebe Feedback.
6. Primärquelle
📖 Python SDK README (Abschnitte Quickstart & Running your server) und der MCP Inspector.
1 — Python SDK README: github.com/modelcontextprotocol/python-sdk
2 — MCP Inspector: github.com/modelcontextprotocol/inspector