Claude · Einen eigenen MCP-Server bauen
Ein Connector ist nichts anderes als ein Server, der ein Protokoll spricht, und in den nächsten dreißig Minuten schreiben Sie einen, der Claude ein `get_order_status`-Tool gibt, das er in Ihrem Namen aufrufen kann. Wir betreiben ihn zuerst lokal, machen ihn dann als Remote-Connector verfügbar und sagen anschließend ein paar sorgfältige Worte dazu, wer ihn aufrufen darf.
MCPMCPEin offener Standard, mit dem KI-Assistenten einheitlich und kontrolliert an die Werkzeuge und Daten des Unternehmens angebunden werden, statt jede Integration einzeln zu bauen.Vollständige Definition ansehen → (das Model Context Protocol) kennen Sie bereits als den offenen Standard, über den Claude Tools und Daten außerhalb seines Context WindowContext WindowDas Context Window ist die maximale Textmenge (gemessen in Tokens), die ein Sprachmodell auf einmal verarbeiten kann, einschließlich Input-Prompt und generiertem Output.Vollständige Definition ansehen → erreicht. Jetzt bauen Sie die andere Seite dieses Handshakes: den Server.
Was ein MCP-Server tatsächlich ist
Ein MCP-Server ist ein kleines Programm, das eine Liste von Capabilities anbietet und darauf wartet, dass ein Client sie aufruft. Die drei Capability-Typen sind Tools (Funktionen, die das Modell aufrufen kann), Resources (Daten mit Lesezugriff, die das Modell hereinziehen kann) und Prompts (wiederverwendbare Templates). Für einen Connector, der die Frage „Wo ist meine Bestellung?“ beantwortet, brauchen Sie ein Tool.
Der Client ist die Host-Anwendung: Claude Desktop, die Claude-Apps, Claude Code oder Ihr eigener Code mit dem Agent SDK. **Der Client entscheidet, *wann* Ihr Tool aufgerufen wird. Ihr Server entscheidet nur, *was das Tool tut***. Diese Trennung ist der ganze Punkt. Sie berühren das Modell nie. Sie veröffentlichen eine klare Funktionssignatur und eine Beschreibung, und Claude findet heraus, wann ein Aufruf hilft.
Zwei Transports sind relevant:
- stdio: Der Server läuft als lokaler Subprozess und kommuniziert über Standard Input/Output. So startet Claude Desktop einen lokalen Connector. Kein Netzwerk, keine Auth, am schnellsten gebaut.
- Streamable HTTP: Der Server läuft als Web-Service unter einer URL. So funktioniert ein *Remote*-Connector, und genau das reichen Sie beim Connector-Marketplace ein oder teilen mit einem Team.
Sie schreiben die Tool-Logik einmal. Der Transport sind ein paar Zeilen am Ende. Fangen Sie mit stdio an.
Der minimale Server
Installieren Sie zuerst das offizielle Python-SDK. Das `mcp`-Paket bringt einen `FastMCP`-Helper mit, der die Protokoll-Plumbing-Arbeit übernimmt, sodass Sie praktisch nichts außererDas Verhältnis von Interaktionen (Likes, Kommentare, Shares) zur Reichweite eines Inhalts. Zeigt, wie stark die Zielgruppe reagiert, gemessen an der Zahl der Personen, die den Inhalt gesehen haben.Vollständige Definition ansehen → Ihrer eigenen Funktion schreiben.
pip install "mcp[cli]"Jetzt der Server. Das ist das Ganze.
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("order-tools")
# Ein winziger Platzhalter für Ihre echte Datenbank oder interne API.
ORDERS = {
"A1001": {"status": "shipped", "carrier": "DHL", "eta": "2026-02-14"},
"A1002": {"status": "processing", "carrier": None, "eta": None},
}
@mcp.tool()
def get_order_status(order_id: str) -> dict:
"""Look up the current status of a customer order by its ID.
Args:
order_id: The order reference, e.g. 'A1001'.
"""
order = ORDERS.get(order_id.strip().upper())
if order is None:
return {"found": False, "order_id": order_id}
return {"found": True, "order_id": order_id, **order}
if __name__ == "__main__":
mcp.run()Lesen Sie es von oben nach unten:
FastMCP("order-tools")erstellt den Server und benennt ihn. Dieser Name erscheint in der Client-UI.- Der Decorator
@mcp.tool()registriert die Funktion als aufrufbares Tool. Das SDK liest Ihre Type Hints (order_id: str, Rückgabedict), um Input- und Output-SchemaSchemaEin Schema ist der formale Bauplan, der festlegt, wie Daten in einer Datenbank, einer Datei oder einer Nachricht strukturiert, benannt, typisiert und miteinander verknüpft sind.Vollständige Definition ansehen → automatisch zu erzeugen. Kein handgeschriebenes JSON Schema. - Der Docstring ist keine Dekoration. Claude liest ihn, um zu entscheiden, wann und wie das Tool aufgerufen wird. Die erste Zeile beschreibt das Tool, der
Args:-Abschnitt dokumentiert jeden Parameter. Schreiben Sie ihn so, als briefen Sie einen klugen neuen Kollegen, der Ihren Code nicht sehen kann. mcp.run()ohne Argumente nutzt standardmäßig den stdio-Transport. Lokal brauchen Sie nicht mehr.
In der echten Version ruft der Body von get_order_status Ihr Bestellsystem auf: eine SQLSQLSales Qualified Lead: ein Prospect, den das Sales-Team als bereit für direkte Ansprache und ein Angebot validiert hat, weil er klare Qualifizierungskriterien erfüllt.Vollständige Definition ansehen →-Abfrage, einen internen REST-Endpoint, eine Stripe-Abfrage. Die MCP-Schicht ändert sich dabei nie. Sie kapseln eine bestehende Capability, Sie bauen sie nicht neu.
Lokal in Claude Desktop betreiben
Claude Desktop liest eine kleine Konfigurationsdatei, in der die lokalen Server stehen, die es starten soll. Auf macOS liegt sie unter ~/Library/Application Support/Claude/claude_desktop_config.json. Fügen Sie Ihren Server hinzu:
{
"mcpServers": {
"order-tools": {
"command": "python",
"args": ["/absolute/path/to/server.py"]
}
}
}Starten Sie Claude Desktop neu. Die App startet Ihr Skript als Subprozess, fragt die Tool-Liste ab und zeigt order-tools im Connector-Menü. Tippen Sie jetzt: *„Wie ist der Status von Bestellung A1001?“* Claude sieht das Tool, ruft get_order_status("A1001") auf, erhält das JSON zurück und antwortet in normaler Sprache. Beim ersten Mal werden Sie um Freigabe des Aufrufs gebeten. Dieser Freigabeschritt ist der Client, der Sie schützt, und er ist Absicht.
Wenn nichts erscheint, führen Sie erst python /path/to/server.py im Terminal aus, um Importfehler zu finden, und nutzen Sie dann den MCP Inspector (mcp dev server.py), um das Tool direkt anzustoßen, bevor Claude überhaupt beteiligt ist. Debuggen Sie den Server isoliert, die Verbindung erst danach.
Für die offizielle Anleitung und die aktuellen SDK-Details halten Sie den MCP Server Quickstart in einem Tab offen. Das Protokoll bewegt sich, und diese Seite ist die Source of Truth.
Build an MCP Server in Python
Remote gehen: vom Subprozess zum Connector
Ein lokaler stdio-Server hilft nur der Person, die ihn auf ihrer eigenen Maschine betreibt. Damit ein *Team* Ihren Connector nutzen kann oder damit er im Connector-Marketplace gelistet wird, muss er als Remote-HTTP-Service unter einer URL laufen.
Die Codeänderung ist fast nichts. Tauschen Sie den Transport:
if __name__ == "__main__":
mcp.run(transport="streamable-http")Jetzt lauscht Ihr Server auf einem HTTP-Endpoint statt auf stdio. Deployen Sie ihn wie jeden Web-Service: ein Container in der Cloud Ihrer Wahl, hinter HTTPS, auf einem stabilen Hostnamen wie https://tools.yourco.com/mcp. Die Dokumentation von Anthropic beschreibt die Anforderungen an Remote-Connectors, einschließlich des Streamable HTTP-Transports, den die Claude-Apps erwarten.
In den Claude-Apps fügt ein Nutzer (oder ein Admin für eine Organisation) Ihren Connector per URL unter Settings, dann Connectors hinzu. Von diesem Moment an erscheint Ihr Tool neben den eingebauten in Projects, in normalen Chats und für Managed Agents. Ein Server, viele Oberflächen.
Der schwierige Teil beim Remote-Gehen ist nicht der Transport. Es ist die Frage, die Sie in der stdio-Version ignorieren konnten: Wer ruft auf, und was darf diese Person sehen?
Wissenscheck
1. Wie ist in der beschriebenen MCP-Architektur die Verantwortung zwischen Client und Ihrem Server aufgeteilt?
2. Welcher MCP-Capability-Typ ist für eine Frage wie „Wo ist meine Bestellung?“ die richtige Wahl, und warum?
3. Warum empfiehlt die Lektion, mit dem stdio-Transport zu starten, bevor man zu Streamable HTTP wechselt?
4. Wählen Sie ALLE Aussagen, die die Transports stdio und Streamable HTTP korrekt beschreiben.
Wählen Sie alle richtigen Antworten aus.
5. Wählen Sie ALLE korrekten Aussagen über MCP-Server und den FastMCP-Helper.
Wählen Sie alle richtigen Antworten aus.
Ein Wort zur Authentifizierung
Sobald Ihr Server über das Internet erreichbar ist, wird get_order_status("A1001") zum Problem. Bestellung A1001 gehört *jemandem*. Ohne Auth kann jeder, der Ihre URL findet, alle Bestellungen durchzählen. Lokale stdio-Server erben das Vertrauen der Maschine, auf der sie laufen. Remote-Server erben nichts. Sie müssen es hinzufügen.
Der Remote-Transport von MCP unterstützt genau dafür OAuth 2.1. Der Flow, in klaren Worten:
- Ein Nutzer fügt Ihren Connector in der Claude-App hinzu.
- Bevor der Connector funktioniert, schickt die App den Nutzer zu Ihrem Authorization Server, um sich anzumelden und zuzustimmen.
- Ihr Server stellt ein Access TokenTokenEin Token ist die grundlegende Texteinheit, die Sprachmodelle verarbeiten, oft ein Wortfragment, ein ganzes Wort oder ein Satzzeichen und nicht ein einzelnes Zeichen.Vollständige Definition ansehen → aus, das an *genau diesen Nutzer* gebunden ist.
- Jeder Tool-Aufruf von Claude kommt nun mit diesem Token an.
Innerhalb Ihres Tools lesen Sie das Token, lösen es zu einem Nutzer auf und begrenzen die Abfrage darauf. Derselbe get_order_status-Aufruf liefert unterschiedliche Zeilen, je nachdem, wer fragt:
@mcp.tool()
def get_order_status(order_id: str, ctx: Context) -> dict:
user = resolve_user(ctx.request_context) # aus dem Bearer Token
order = lookup_order(order_id, owner=user.id)
if order is None:
return {"found": False, "order_id": order_id}
return {"found": True, **order}Das Prinzip: Trauen Sie niemals der `order_id` allein. Trauen Sie der authentifizierten Identität und prüfen Sie dann, ob diese Identität diese Bestellung sehen darf. Das Modell ist nicht Ihre Security-Grenze. Ihr Server ist es. Claude gibt bereitwillig alles weiter, was der Nutzer eintippt, auch eine Order-ID, die jemand anderem gehört. Die Ownership-Prüfung lebt also in Ihrem Code und nirgendwo sonst.
Zwei praktische Hinweise für 2025-2026:
- Für rein interne Tools ist ein einfacheres Bearer Token oder ein APIAPIApplication Programming Interface: eine standardisierte Schnittstelle, über die Anwendungen kommunizieren und Daten austauschen, ohne die interne Funktionsweise der jeweils anderen zu kennen.Vollständige Definition ansehen → Key im Header akzeptabel, solange der Transport HTTPS ist und das Token auf ein echtes Principal abbildet, gegen das Sie begrenzen kkDie durchschnittliche Zahl neuer Nutzer, die jeder bestehende Nutzer über Empfehlungen generiert. Über 1,0 verstärkt sich das Wachstum selbst und wird exponentiell.Vollständige Definition ansehen →önnen. Vollständiges OAuth ist für Connectors gedacht, die echte Nutzer selbst hinzufügen.
- Wenn Sie einen Connector im Marketplace listen oder organisationsweit teilen, folgen Sie den Connector- und Security-Anforderungen von Anthropic. Org-Admins steuern, welche Connectors aktiviert sind, und diese Governance-Schicht setzt voraus, dass Ihr Server darunter ordentlich authentifiziert. Den aktuellen Standard finden Sie in der Anthropic Connector-Dokumentation.
Wo das ins Ökosystem passt
Ihr MCP-Server ist ein Baustein, nicht die ganze App. Derselbe Server, den Sie gerade geschrieben haben, lässt sich ohne Änderungen in mehrere Anthropic-Oberflächen einstecken:
- Claude Code kann ihn laden, damit der Coding-Agent
get_order_statusaufruft, während er in Ihrem Repo arbeitet. - Mit dem Claude Agent SDK bauen Sie einen Managed Agent, der Ihren Connector als eines von mehreren Tools nutzt, neben Dateizugriff und der GitHub-Integration.
- Der Connector-Marketplace lässt andere Leute ihn entdecken und hinzufügen.
Vergleichen Sie das mit Skills, die Anweisungen, Skripte und Dateien bündeln und prägen, wie Claude bei einer Aufgabe *handelt*. Ein Skill bringt Claude eine Vorgehensweise bei. Ein MCP-Server gibt Claude eine *Capability*, die er vorher nicht hatte: Live-Zugriff auf Ihr Bestellsystem. Sie werden beides oft kombinieren. Ein „Customer Support“-Skill, der Ihren Tonfall und Ihre Eskalationsregeln kennt und einen order-tools-MCP-Server für die Live-Daten aufruft. Zu wissen, welches Problem jeweils gelöst wird, ist die halbe Arbeit, wenn man gut auf Claude aufbaut.
Bauen Sie das Tool einmal. Entscheiden Sie den Transport nach Zielgruppe. Schützen Sie es über Identität. Das ist die ganze Disziplin.
Key Takeaways
- Starten Sie mit stdio, shippen Sie mit HTTP. Schreiben und debuggen Sie Ihr Tool als lokalen stdio-Server mit
FastMCP, dann ändern Sie eine Zeile (transport="streamable-http"), um daraus einen Remote-Connector zu machen. Die Tool-Logik bleibt unverändert. - Docstring und Type Hints sind das Interface. Claude entscheidet anhand von Name, Beschreibung und Parametern, wann Ihr Tool aufgerufen wird. Schreiben Sie sie so sorgfältig wie den Code.
- Authentifizieren Sie ab dem Moment, in dem Sie remote gehen. Nutzen Sie OAuth 2.1 für nutzerseitige Connectors, begrenzen Sie jede Abfrage auf die authentifizierte Identität, und machen Sie den Input des Modells nie zu Ihrer Security-Grenze.
- Testen Sie erst isoliert. Nutzen Sie
mcp dev server.pyund den MCP Inspector, um zu prüfen, dass das Tool funktioniert, bevor Sie es in Claude Desktop oder die Apps einbinden. - Wählen Sie das richtige Primitiv. MCP-Server ergänzen *Capabilities* (Live-Daten, Aktionen), Skills prägen *Verhalten* (Vorgehen, Tonfall). Echte Connectors kombinieren meist beides.
Was Sie aus dieser Lektion umsetzen
Diese Maßnahmen sind im Playbook der Rolle zusammengefasst.
- Tool-Docstrings und Type Hints für das Routing des Modells schreiben
- MCP-Server zunächst als lokales stdio bauen, dann den Transport auf remote umstellen
- Jede Remote-MCP-Abfrage auf die authentifizierte Identität eingrenzen
Verwandte Artikel
Aktuelle Blogartikel, die auf dieser Lektion aufbauen.