MCP · Lektion 07 · Capstone
Vom Spielzeug zum echten Server
Du kennst jetzt Architektur, Wire, Primitive, Transports, Bau und Anbindung. Diese Lektion verdichtet alles zu einem realistischeren Server — und gibt dir den roten Faden, mit dem du das Ganze im Workshop lehrst.
1. Ein Server mit allen drei Primitiven
Wir erweitern server.py aus Lektion 5
um eine Resource (lesbarer Kontext) und einen Prompt
(User-Workflow) — die Decorators entsprechen 1:1 den Primitiven aus
Lektion 3:1
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("Notes")
_NOTES: dict[str, str] = {} # simpler State, in echt: DB/API
@mcp.tool()
def add_note(title: str, body: str) -> str:
"""Lege eine Notiz an.""" # MODELL-gesteuert → Tool
_NOTES[title] = body
return f"Notiz '{title}' gespeichert."
@mcp.resource("note://{title}")
def read_note(title: str) -> str:
"""Lies eine Notiz.""" # APP-gesteuert, Lesen → Resource
return _NOTES.get(title, "nicht gefunden")
@mcp.prompt()
def summarize(title: str) -> str:
"""Vorlage: Notiz zusammenfassen.""" # USER-gesteuert → Prompt
return f"Fasse die Notiz '{title}' in einem Satz zusammen."
if __name__ == "__main__":
mcp.run(transport="stdio")
Drei Decorators, drei Capabilities im Handshake, drei Kontroll-Modelle. Wenn deine Teilnehmer das Diagramm im Kopf haben, haben sie MCP verstanden.
2. Der Schritt zu „echt nützlich“ (deine Mission)
Den Sprung von Demo zu Produktion machen drei Dinge — ersetze den Dummy-State durch echte Systeme:
- Echte Datenquelle: statt
_NOTESeine DB, eine interne REST-API, das Filesystem, Forgejo/GitLab. Dein Tool ist nur der dünne MCP-Mantel darum. - Fehler & Secrets: Exceptions sauber zurückgeben; API-Keys
aus Umgebungsvariablen (
--envbeim Anbinden), nie hartkodiert. - Transport-Wahl: bleibt es ein lokales Team-Tool → STDIO. Soll es ein zentraler Dienst werden → Streamable HTTP + die Security-Regeln aus Lektion 4 (Origin prüfen, localhost-Bind, Auth).
Gute Server-Designregel: Ein Tool = eine klar benannte Absicht. Liebercreate_issueundclose_issueals ein generischesdo_issue_stuff(action). Der Agent wählt nach Namen + Beschreibung.
3. Workshop-Dramaturgie (90 Min, erprobte Reihenfolge)
- Der Schmerz (10′): N×M-Integrationsproblem. Frag das Publikum, wie viele Tools × Agents sie kennen. → Motivation für ein Protokoll.
- Das Bild (15′): host/client/server + 3 Primitive an der Tafel (L1/L3). Anker: ein laufender Server (forgejo) live zeigen.
- Der Wire (10′): Inspector öffnen,
tools/list+tools/calllive sehen (L2). „Es ist nur JSON-RPC.“ - Selber bauen (35′): alle tippen
server.pymit, Inspector-Test (L5). Dieprint()-Falle bewusst vorführen. - Anbinden (15′):
claude mcp add, Tool im Chat aufrufen (L6). Der „Wow“-Moment. - Ausblick (5′): Resources/Prompts, Remote/Auth, eigene Ideen der Teilnehmer.
Das Prinzip: Schmerz → Bild → Beweis → eigene Hände → Erfolg. Jede Stufe ist eine Lektion dieses Workspace — du kannst sie als Hand-out verlinken.
4. Die drei Sätze, die hängen bleiben sollen
- „MCP standardisiert, wie ein Agent ein Tool entdeckt und aufruft — aus N×M wird N+M.“
- „Host ist schwer, Server ist leicht: deshalb baust du einen in 20 Zeilen.“
- „Tool/Resource/Prompt = Modell-/App-/User-gesteuert.“
5. Wisdom — wo es weitergeht
Du bist jetzt über die Grundlagen hinaus. Reale Reibung (Design-Fragen, Edge-Cases, Best Practices) holst du dir am besten aus der Community:
- MCP GitHub Discussions — von Maintainern moderiert, ideal für „warum ist das so“.
- r/mcp — reale Server, Stolperfallen, Beispiele.
6. Primärquelle
📖 Python SDK README (Resources & Prompts) + die MCP Specification als verbindliche Referenz. Halte die Cheatsheet griffbereit.
1 — Python SDK README: github.com/modelcontextprotocol/python-sdk