Bau einen MCP-Server, der etwas tut
Kein Echo-Werkzeug, kein Hello World: ein Server mit einer Domäne, neun Werkzeugen, zwei Transporten und zwei Auth-Modellen - angeschlossen an einen echten Client und absichtlich zum Scheitern gebracht.
Der Baustein MCP-Server erklärt, warum es das Protokoll gibt und was ein Server anbietet. Dieser Kurs baut einen.
Nicht den mit dem Echo-Werkzeug. Von dem gibt es genug. Er beantwortet keine einzige der Fragen, die beim zweiten Server auftauchen, und beim zweiten Server tauchen sie alle auf einmal auf: Wer räumt die Sitzungen weg? Was passiert, wenn zwei Clients gleichzeitig da sind? Wie soll ein fehlgeschlagener Aufruf für das Modell aussehen? Und wie beschreibst du ein Werkzeug so, dass ein Modell damit auch etwas anfangen kann?
Was am Ende läuft
Der Helpdesk von Simhaven. Acht Tickets, eine Produktdoku, neun Werkzeuge. Und ein Agent, der die Tickets einordnet, beantwortet, eskaliert und schließt, ohne dass irgendwo eine Zeile Bedienoberfläche steht. Dieselbe Kulisse betreten Mitglieder im Parcours von der anderen Seite; hier baust du den Dienst, gegen den ein Agent dort arbeitet.
Der Server läuft über beide Transporte, kennt zwei Arten von Berechtigung, verträgt mehrere gleichzeitige Clients und liegt am Ende als eigener Container neben der Anwendung. Rund 560 Zeilen TypeScript in sechs Dateien. Kein Framework. Keine Datenbank. Keine Abstraktionsschicht über dem SDK.
Was du brauchst
Node 22 und sonst nichts. Der Kurs schreibt TypeScript und lässt es von Node
selbst entpacken (--experimental-strip-types). Kein Bundler, kein Build-Schritt,
kein tsc im Weg. Bequemlichkeit ist das nicht: In derselben Bauweise läuft auch
der MCP-Dienst dieses Projekts, mcp/server.ts im Repo wird genau so gestartet.
Zwei Pakete kommen dazu, @modelcontextprotocol/sdk und zod. Beide sind in
den Beispielen in den Fassungen 1.30 und 3.25 gelaufen.
Woher die Beispiele kommen
Alles, was in diesem Kurs als Ausgabe abgedruckt ist, ist eine echte. Die Fehlermeldungen in Kapitel 6 wurden ausgelöst und nicht nachgestellt, die Zeichenzahlen sind gemessen, der Container in Kapitel 7 ist gebaut und gesundheitsgeprüft worden. Wo eine Zahl steht, steht sie, weil sie so herausgekommen ist.
Die zweite Quelle ist dieses Repo selbst. Unter mcp/ läuft ein Server mit
sechzehn redaktionellen Werkzeugen und zwei Simulationswelten, mit
Sitzungsdeckel, Reaper und zwei Auth-Modellen nebeneinander. An den Stellen, an
denen der Kurs sich entscheidet, kannst du daneben nachlesen, wie dort
entschieden wurde. Und wo einmal falsch entschieden wurde.
Der Fahrplan
7 Schritte, je eine Einsicht und ein lauffähiger Stand. Jeder Schritt steht auf dem vorigen.
- 01Der leere Server25 min
Der Server ist in zwanzig Zeilen fertig. Die Entscheidung ist der Transport, nicht der Code.
Meilenstein Ein Werkzeug antwortet über stdio und über Streamable HTTP, beide Male gegen denselben Client.
- 02Werkzeuge, die man auch beschreiben kann25 min
Die Beschreibung ist kein Kommentar, sondern der Teil des Werkzeugs, der im Prompt landet.
Meilenstein Das Schema weist eine falsche Kategorie mit einer Meldung ab, aus der hervorgeht, welche richtig wären.
- 03Eine Domäne statt einer Sammlung40 min
Neun Werkzeuge, die eine Aufgabe zu Ende bringen, sind mehr wert als dreißig, die alles ein bisschen können.
Meilenstein Der Helpdesk von Simhaven läuft: acht Tickets, lesen, einordnen, beantworten, eskalieren, schließen, zählen.
- 04Zustand und Sitzungen30 min
Ein geteilter Transport weist das zweite `initialize` ab - und eine Sitzung muss wissen, wofür sie geöffnet wurde.
Meilenstein Zwei Clients arbeiten gleichzeitig in getrennten Beständen, und der Reaper räumt beide wieder weg.
- 05Wer darf was30 min
Ein Token je Vorgang ist die interessantere Bauform: Es gehört keinem Nutzer, sondern einem Durchgang.
Meilenstein Derselbe Container bedient zwei Endpunkte mit zwei Auth-Modellen, und keine Sitzung wandert zwischen ihnen.
- 06Anschließen und scheitern lassen30 min
Die drei typischen Fehlerbilder ausgelöst, nicht behauptet - und eines davon sieht wie ein Erfolg aus.
Meilenstein Unbekanntes Werkzeug, fehlende Pflichtangabe und ein Ergebnis mit 130 152 Zeichen stehen als echte Ausgaben da.
- 07Betrieb25 min
Ein Dienst, den niemand räumt und niemand befragt, fällt genau dann, wenn keiner hinsieht.
Meilenstein Der Server läuft als eigener Container mit Gesundheitsprüfung, Sitzungsdeckel und einer Logzeile je Aufruf.