MCP Server von Null entwickeln: Der vollständige Entwickler-Leitfaden

Ca. 22 Min. Lesezeit · MACCOME

Zielgruppe: Backend- und AI-Entwickler mit Python- oder TypeScript-Erfahrung, die Claude, Cursor oder VS Code an interne APIs, Datenbanken und Dateien anbinden wollen — ohne pro Modell einen eigenen Adapter zu schreiben. Ergebnis: Ein lauffaehiger MCP Server von der lokalen STDIO-Validierung bis HTTP+SSE-Produktion, inklusive Wissensdatenbank-Praxis. Aufbau: Protokoll-Kurzueberblick, sechs typische Fehlannahmen, drei Entscheidungstabellen, Code fuer Hello World / Tools / Resources / Prompts, Debugging, acht Rollout-Schritte, DSGVO-Checkliste und FAQ. Protokoll-Tiefe: MCP Deep Dive.

Sechs Fehlannahmen beim ersten MCP Server (2026)

  1. MCP = noch ein REST-Wrapper: REST beantwortet «Kann ich aufrufen?»; MCP standardisiert Laufzeit-Discovery via tools/list, JSON Schema und zustandsbehaftete Sitzungen.
  2. Nur Tools implementieren: Resources (Lesekontext) und Prompts (Vorlagen) fehlen — das Modell ruft Tools mit unvollstaendigem Kontext auf und halluziniert Parameter.
  3. STDIO reicht fuer Produktion: Lokale Subprozesse brechen ab, wenn der Host-Rechner schlaeft oder PATH in launchd/systemd anders ist als in der interaktiven Shell.
  4. Auth pro Client konfigurieren: Jeder Cursor-/Claude-Desktop-Eintrag mit eigenem Token erhoeht Fehlkonfigurationsrisiko und erschwert DSGVO-Dokumentation (Art. 30/32).
  5. Community-Server ungeprueft kopieren: Ohne Pinning von Version und Berechtigungsumfang exponieren Sie interne APIs — geschaetzt ~1.000 oeffentliche Server ohne Auth (Stand 2026).
  6. Debugging nur im UI: Ohne strukturierte JSON-RPC-Logs lassen sich Timeout- vs. Schema-Fehler nicht von Channel-Problemen trennen.

Wenn mindestens zwei Punkte zutreffen, lohnt ein systematischer Aufbau statt «schnell npx -y». Dieser Leitfaden ersetzt nicht den Protokoll-Artikel, sondern liefert die Implementierungsschicht darunter.

MCP-Protokoll in 90 Sekunden: Host, Client, Server

Host (Cursor, Claude Desktop, VS Code) betreibt einen MCP Client. Der Client haelt eine 1:1-Sitzung mit jedem MCP Server und spricht JSON-RPC 2.0. Der Server exponiert drei Capability-Typen und kapselt externe Systeme.

CapabilityRolleTypische RPC-MethodenWenn/Dann
ToolsAktionen mit Nebenwirkungentools/list, tools/callWenn SQL, Tickets oder Dateien geschrieben werden — dann idempotent designen und Schema dokumentieren
ResourcesLesbarer Kontext (URI)resources/list, resources/readWenn das Modell Dokumente/Configs braucht — dann vor Tool-Call laden, Token-Budget beachten
PromptsWiederverwendbare Vorlagenprompts/list, prompts/getWenn wiederkehrende Workflows (Onboarding, Code-Review) — dann Parameter im Schema fixieren
TransportLatenz (lokal)SkalierungEmpfehlung
STDIO< 5 ms Cold Start (TS, gepinnt)Ein Host-Prozess pro Server-InstanzEntwicklung, Einzelplatz, CI-Smoke-Tests
HTTP + SSE+ RTT (typ. 20–80 ms EU)Horizontal mit Session AffinityTeam-Sharing, Remote, getrennte Auth-Zone

Schritt 1: Umgebung vorbereiten

Voraussetzungen: Node.js 20 LTS oder Python 3.11+, Git, ein MCP-faehiger Host (Cursor 0.4x+ oder Claude Desktop). Auf macOS empfehlen wir dieselbe Minor-Version lokal und auf dem Ziel-Host — Environment-Drift ist die haeufigste Ursache fuer «Tool nicht registriert».

bash
mkdir mcp-hello && cd mcp-hello
npm init -y
npm install @modelcontextprotocol/sdk zod
# Alternativ Python:
# python3 -m venv .venv && source .venv/bin/activate
# pip install mcp
SDKPaketStartbefehlStärke
TypeScript@modelcontextprotocol/sdknode dist/index.jsCursor/Claude-Integration, schnelles STDIO
Pythonmcppython server.pyDaten-APIs, interne ML-Pipelines

Schritt 2: Hello World — minimaler STDIO-Server

Der kleinste Server antwortet auf initialize und registriert ein Echo-Tool. Erwartetes Ergebnis: Host zeigt genau ein Tool «echo» in der Tool-Liste.

typescript
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";

const server = new McpServer({ name: "hello-mcp", version: "1.0.0" });

server.tool(
  "echo",
  { message: z.string().describe("Text zur Ausgabe") },
  async ({ message }) => ({ content: [{ type: "text", text: message }] })
);

const transport = new StdioServerTransport();
await server.connect(transport);
json
// ~/.cursor/mcp.json (Beispiel)
{
  "mcpServers": {
    "hello-mcp": {
      "command": "node",
      "args": ["/abs/path/mcp-hello/dist/index.js"],
      "env": {}
    }
  }
}
info

Validierung: Absoluter Pfad fuer command/args; relative Pfade brechen unter launchd. Nach Config-Aenderung Host neu starten und tools/list im Inspector pruefen.

Schritt 3: Tools — Aktionen mit JSON Schema

Tools fuehren Nebenwirkungen aus. Jedes Tool braucht: eindeutigen Namen, Zod-/JSON-Schema, dokumentierte Seiteneffekte und Timeout-Budget. Beispiel: interne REST-API «Kundenstatus abfragen».

typescript
server.tool(
  "get_customer_status",
  {
    customerId: z.string().uuid(),
    includeOrders: z.boolean().default(false),
  },
  async ({ customerId, includeOrders }) => {
    const res = await fetch(`${process.env.CRM_BASE}/customers/${customerId}`);
    if (!res.ok) throw new Error(`CRM ${res.status}`);
    const data = await res.json();
    return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
  }
);

Tool-Design-Regeln

  • Read vs. Write trennen: getrennte Server oder Namespaces — erleichtert Least-Privilege und DPIA.
  • PII minimieren: Wenn customerId in Logs landet, Verarbeitungsverzeichnis und Aufbewahrungsfrist definieren (DSGVO Art. 30).
  • Fehler maschinenlesbar: JSON-RPC-Fehler mit code und kurzer message — das Modell kann retry vs. escalate entscheiden.

Schritt 4: Resources — Kontext per URI

Resources liefern Lesedaten ohne garantierte Mutation. Nutzen Sie stabile URIs wie kb://article/{id} oder file:///policy/handbook.md.

typescript
server.resource(
  "handbook",
  "kb://policy/handbook",
  async (uri) => ({
    contents: [{
      uri: uri.href,
      mimeType: "text/markdown",
      text: await fs.readFile("./data/handbook.md", "utf8"),
    }],
  })
);

Schritt 5: Prompts — standardisierte Workflows

Prompts sind parametrisierbare Vorlagen — nuetzlich fuer wiederkehrende Aufgaben (Incident-Triage, PR-Review). Sie reduzieren Token-Verschwendung gegenueber langen System-Prompts im Host.

typescript
server.prompt(
  "incident_triage",
  {
    service: z.string(),
    severity: z.enum(["P1", "P2", "P3"]),
  },
  ({ service, severity }) => ({
    messages: [{
      role: "user",
      content: {
        type: "text",
        text: `Triage ${severity} fuer ${service}: Logs sammeln, Root Cause, naechste 3 Schritte.`,
      },
    }],
  })
);

Schritt 6: HTTP+SSE fuer Remote-Teams

Wenn mehrere Entwickler denselben Server nutzen, wechseln Sie von STDIO auf HTTP+SSE. Planen Sie TLS, Reverse Proxy und Session Affinity — SSE ist zustandsbehaftet, nicht wie stateless REST.

typescript
import { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse.js";
import express from "express";

const app = express();
app.get("/sse", async (req, res) => {
  const transport = new SSEServerTransport("/message", res);
  await server.connect(transport);
});
app.post("/message", express.json(), async (req, res) => {
  await transport.handlePostMessage(req, res);
});
app.listen(8787, "0.0.0.0");
HTTP-CheckpunktParameterProduktionswert
TLSTerminierungAm Reverse Proxy (nginx/Caddy), HSTS aktiv
TimeoutErster Cold Call30–60 s; danach 10–15 s steady state
AuthBearer / OAuth 2.1Am Server-Entry, nicht im Client-JSON verstreut
AffinityLoad BalancerSticky Session oder ein Pod pro Client-Session

Schritt 7: Debugging und Tests

Symptom-Matrix fuer strukturierte Triage:

SymptomErste EvidenzWahrscheinliche UrsacheMassnahme
Leere Tool-ListeChild-Exit-Code, stderrFalscher cwd, fehlende BinaryAbsoluter Pfad; gleicher OS-User wie Host
Erster Call langsamnpm/pip Fetch-Logsnpx -y JITVersion pinnen; Image prewarmen
Schema rejectedJSON-RPC -32602Zod/JSON-Schema-Mismatchtools/list-Output mit Client vergleichen
Steady TimeoutCPU, offene FDsBlockierendes IORead-only Tool als A/B-Referenz
bash
# MCP Inspector (Community-Tool)
npx @modelcontextprotocol/inspector node dist/index.js
# Erwartung: initialize OK, tools/list >= 1 Eintrag, tools/call echo OK

Schritt 8: Produktions-Deployment

  • Prozess-Manager: launchd (macOS) oder systemd mit Restart=on-failure und explizitem EnvironmentFile.
  • Secrets: API-Keys nur via Secret Store — nie in mcp.json committen.
  • Observability: Strukturierte Logs pro tools/call mit correlation_id; Metriken: p95-Latenz, Fehlerrate, aktive SSE-Sessions.
  • Release: Semver am Server; Host-Config pinnt Minor-Version.

DSGVO vor Go-Live (EU-Teams)

PruefpunktArtikelMCP-Bezug
VerarbeitungsverzeichnisArt. 30tools/call-Parameter, Logs, CRM-Responses
AV-VertragArt. 28Getrennt: Cloud-Host (MACCOME) vs. LLM-API vs. eigener Server
TOMsArt. 32TLS, OAuth zentral, Pseudonymisierung in Tool-Outputs
SpeicherortDatenresidenzEU-Region dokumentieren — nicht US-Laptop als Prod-Host
LoeschungArt. 17Session-Logs und Caches wipe-faehig bei Mandatsende

Praxis: Wissensdatenbank-Server

Kombinieren Sie Resources (Markdown-Artikel) mit einem Tool «semantic_search» (Vektor-DB oder einfaches BM25). Ablauf: Modell liest Resource-Metadaten via resources/list, ruft semantic_search auf, zitiert URIs — reduziert Halluzinationen in Support- und Compliance-Workflows.

typescript
server.tool(
  "semantic_search",
  { query: z.string().min(3), topK: z.number().int().min(1).max(10).default(5) },
  async ({ query, topK }) => {
    const hits = await index.search(query, topK);
    return {
      content: [{
        type: "text",
        text: hits.map(h => `${h.uri} (score ${h.score})\n${h.snippet}`).join("\n---\n"),
      }],
    };
  }
);

Oekosystem und naechste Schritte (2026)

  • 10.000+ Community-Server — wiederverwenden mit Version-Pin und Security-Review.
  • AAIF / Linux Foundation — Governance ab Q2 2026; Spec-Updates semver-faehig verfolgen.
  • A2A ergaenzt MCP horizontal (Agent-zu-Agent); MCP bleibt vertikal Modell↔Tools.
  • Verknuepfung mit Agent Skill Guide: Skills = Host-Prompt-Pakete; MCP = portables Tool-Protokoll.

Acht Schritte: Von Null bis produktionsreif

  1. Stack waehlen (TS oder Python) und Node/Python-Version pinnen.
  2. Hello World STDIOtools/list im Inspector gruen.
  3. Ein Read-Tool + eine Resource gegen echte interne API.
  4. Prompt fuer wiederkehrenden Workflow hinzufuegen.
  5. Cursor/Claude Config mit absoluten Pfaden und env-Datei.
  6. HTTP+SSE Prototyp wenn Team > 1 oder Remote-Zugriff.
  7. Auth + Logging + DSGVO-Dokumentation vor PII-Daten.
  8. 7×24-Host fuer Long-Lived-Sessions — nicht Laptop-Sleep (siehe unten).

Drei Kennzahlen fuer die Architektur-Runde

  • Integrationskosten −38 bis −55 % wenn ein Server Claude, GPT und Gemini bedient — kein N×M-Rewrite.
  • STDIO Cold Start < 5 ms (gepinntes TS-Bundle) vs. 30–60 s erster npx -y-Call ohne Pinning.
  • 10.000+ Server (2026) — Netzwerkeffekt: jeder neue Client nutzt bestehende Tools sofort.

Fazit: Lokaler Prototyp vs. produktionsfester Betrieb

Ein MCP Server auf dem Entwicklungs-Mac ist der richtige Start — aber drei Grenzen zeigen sich schnell: STDIO/SSE bricht beim Zuklappen, PATH und Secrets divergieren zwischen Team-Mitgliedern, und mehrschrittige Agent-Workflows brauchen stabile Uptime. Self-hosted VMs ohne dedizierte macOS-Umgebung kaempfen zudem mit Xcode-Toolchain-Luecken, wenn Ihr Server native Apple-APIs oder Simulator-Hooks braucht.

Fuer Teams, die MCP Server und Agent-Orchestrierung dauerhaft betreiben, ist ein dedizierter MACCOME Mac mini (M4 / M4 Pro) als 7×24-Knoten oft guenstiger als lokaler Sleep-Kampf — mit dokumentierter EU-Region fuer DSGVO-Anforderungen. Tarife: Mac-Mini-Mietpreise; Onboarding: Hilfe-Center.

Haeufige Fragen

Python oder TypeScript fuer den ersten MCP Server?

TypeScript mit @modelcontextprotocol/sdk fuer schnelle Cursor-Integration; Python mit mcp bei Daten-Pipelines. Entscheidung nach Team-Stack — beide sind produktionsfaehig.

Brauche ich HTTP+SSE oder reicht STDIO?

STDIO fuer Solo-Entwicklung. HTTP+SSE ab Team-Sharing oder Remote — dann TLS, Session Affinity und zentrale Auth planen.

Wie haengt MCP mit Agent Skills zusammen?

Skills sind Host-interne Prompt-Pakete; MCP ist das offene Tool-Protokoll. Details im Agent Skill Guide.

Welcher Host fuer Produktions-MCP?

Vermeiden Sie Laptop-Sleep fuer Long-Lived-Sessions. MACCOME bietet dedizierte M4/M4 Pro-Knoten mit 7×24-Betrieb. Mietpreise und Hilfe-Center.