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.

Dein Gewinn: Ein lauffähiger Server in <20 Zeilen Python, den du im Workshop live vor Publikum tippen kannst — und das Verständnis, dass die Decorators genau die Primitive aus Lektion 3 erzeugen.

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:

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 ToolsList Toolsadd wählen → a=2, b=3Run. 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)

  1. Lege server.py mit den zwei Tools oben an.
  2. Starte uv run mcp dev server.py und ruf greet mit deinem Namen auf.
  3. Füge ein drittes Tool multiply(a, b) hinzu, reload, teste.
  4. 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.

Frag mich: „Mach daraus einen Server für [dein echtes System]“ — wir können dein produktives Tool von hier aus weiterbauen (Mission: echter Server!). Sag „weiter“ für Lektion 6 (Anbinden an Claude Code & Co.).

1 — Python SDK README: github.com/modelcontextprotocol/python-sdk

2 — MCP Inspector: github.com/modelcontextprotocol/inspector