MCP Server von Grund auf entwickeln:
Vollständiger Entwicklerleitfaden

Protokoll-Grundlagen · Tools · Resources · Prompts · HTTP-Transport · Produktions-Deploy

MCP Server von Grund auf entwickeln Entwicklerleitfaden
Zielgruppe: Entwickler, die wissen, dass LLMs Tools aufrufen können, aber bei manueller Verdrahtung jedes Modells mit jeder API an Grenzen stoßen. Ergebnis: Ein vollständiger Pfad von null zu einem produktionsreifen MCP Server — Protokoll-Hintergrund, FastMCP Hello World, fünf echte Tools mit Pydantic-Schemas, Resources und Prompts, HTTP-Streamable-Transport mit Auth, Docker-Deploy und ChromaDB-Wissensbasis als Capstone. Aufbau: Evolution und Architektur (s1–s2), hands-on Implementierung (s3), HTTP/Debug/Sechs-Schritte-Runbook (s4), Produktions-Hosting und Ökosystem-Daten 2026 (s5) — inklusive DSGVO-Aspekten bei Cloud-Verarbeitung von Tool-Parametern und Prompt-Inhalten.
01

Warum MCP existiert: Function Calling, Plugins und die Integrationswand

LLMs sind starke Reasoner, aber schwache Ausführer. Der erste Fix war OpenAI Function Calling (Juni 2023): JSON-Schemas definieren, das Modell strukturierte Aufrufe emittieren lassen, Ihr Code führt aus. Es funktionierte — aber nur innerhalb der OpenAI-API. Jedes andere Modell brauchte einen separaten Adapter.

ChatGPT Plugins (März 2023) versuchten ein Marktplatzmodell: jedes Plugin war ein individueller REST-Wrapper mit eigenem Manifest. Discovery war zentral im OpenAI-Store, nicht runtime-dynamisch. Als Anthropic Tool Use lieferte und LangChain Agent-Frameworks popularisierte, hatte die Branche drei inkompatible Tool-Schemas und keine portable Server-Schicht.

01

Function-Calling-Ära: Pro-Vendor-Schemas. GPT, Claude und Gemini erwarten unterschiedliche Message-Formen. Modell wechseln → Tool-Bridge neu schreiben.

02

Plugin-Ära: Zentralisierte Discovery in einem Store, nicht in Ihrer Agent-Runtime. Kein Standard für Resources oder Prompts — nur aufrufbare Endpunkte.

03

Framework-Ära: LangChain Tools, CrewAI-Tools und IDE-spezifische Hooks definieren jeweils eigene Tool-Objekte. Definitionen reisen nicht zwischen Cursor, VS Code und Claude Desktop.

04

N×M-Kosten: N KI-Clients × M Backends = N×M Integrationen. Enterprise-CRM-Teams pflegen parallele Adapter-Schichten für jeden LLM-Anbieter.

05

MCP-Antwort (Nov 2024): Anthropic open-sourcete ein einziges Protokoll — JSON-RPC 2.0 über STDIO oder HTTP — bei dem Server Tools, Resources und Prompts selbst beschreiben. Einmal schreiben; Cursor, Claude Desktop, ChatGPT, Gemini und VS Code verbinden ohne Neuschreiben.

Anthropics Design spiegelt USB-C: den Anschluss standardisieren, nicht jedes Kabel. MCP ersetzt REST-APIs nicht — es wrappt sie hinter eine einheitliche Discovery- und Invocations-Schicht, damit KI-Clients nicht mehr kümmern müssen, welcher Vendor oder welches Framework auf der anderen Seite sitzt. Bis Q2 2026 wechselte die Governance zur Linux Foundation AAIF; OpenAI, Google und Microsoft liefern native MCP-Client-Unterstützung.

Function Calling löste „wie ruft ein Modell eine Funktion auf?“ MCP löst „wie entdeckt und ruft jeder KI-Client jeden Tool-Server auf?“ — die Frage, der jeder Agent-Stack 2026 gegenübersteht.

02

MCP-Architektur: Client/Server, drei Fähigkeiten und Transport-Lebenszyklus

MCP läuft auf JSON-RPC 2.0 mit bidirektionaler Messaging. Ein Host (Cursor, Claude Desktop) embeddet einen oder mehrere MCP Clients. Jeder Client pflegt eine 1:1-Session mit einem MCP Server, der echte Systeme anbindet.

Server exponieren drei Fähigkeitstypen: Tools (ausführbare Aktionen mit Nebenwirkungen), Resources (schreibgeschützte Daten mit URI-Identifikation) und Prompts (wiederverwendbare Template-Strings, die der Client vorab füllen kann). Zentrale RPC-Methoden: tools/list, tools/call, resources/list, resources/read, prompts/list und prompts/get.

JSON-RPC 2.0
{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "query_database",
    "arguments": { "sql": "SELECT id, email FROM users LIMIT 10" }
  },
  "id": 42
}

STDIO-Transport: Host startet Server als Subprozess; Nachrichten fließen über stdin/stdout. Null Netzwerk-Abhängigkeiten, starke Prozess-Isolation, ideal für lokale Entwicklung. Lebenszyklus: spawn → Initialize-Handshake → Capability-Negotiation → persistente Session → Subprozess-Ende bei Disconnect.

HTTP + SSE / streamable-http: Server läuft als lang lebender HTTP-Dienst. Client öffnet SSE-Stream für Server-Push-Events; Tool-Aufrufe gehen per POST. Ermöglicht Remote-Deploy, team-geteilte Server, horizontale Skalierung — erfordert aber Session-Affinität für SSE und Auth am Edge. Die 2026-Spezifikation fügt streamable-http als empfohlenen Remote-Transport hinzu und ersetzt Legacy-SSE-only-Muster.

DimensionOpenAI Function CallingLangChain ToolsMCP
GeltungsbereichNur OpenAI-APIPython-Agent-FrameworksJeder MCP-Host (Cursor, Claude, ChatGPT, VS Code)
DiscoveryStatisch: Dev hardcodiert Funktionsliste im API-CallStatisch: Tools beim Start in Python registriertDynamisch: tools/list bei Session-Init
SelbstbeschreibungJSON Schema im API-PayloadPydantic-/Dict-Schemas im CodeJSON Schema vom Server; gleich für Resources und Prompts
DatenzugriffKeine standardisierte Read-only-SchichtCustom Retriever pro FrameworkResources mit URI-Schema (file://, db://)
Wiederverwendbare TemplatesNur System-PromptsPromptTemplate-ObjektePrompts-Fähigkeit mit Argument-Schemas
TransportHTTPS zu OpenAIIn-Process-Python-CallsSTDIO-Subprozess oder HTTP streamable remote
PortabilitätVendor-lockedFramework-lockedServer einmal schreiben; jeder Client verbindet
03

Dev-Setup und Implementierung: FastMCP, Tools, Resources und Prompts

SDK-Stack wählen: Python mit mcp + FastMCP für schnellste Iteration, oder TypeScript mit @modelcontextprotocol/sdk für Node-native HTTP-Server. Empfohlenes Projekt-Layout:

Projektstruktur
my-mcp-server/
  pyproject.toml
  src/
    server.py          # FastMCP-Einstieg
    tools/             # Tool-Module
    resources/         # Resource-Handler
    prompts/           # Prompt-Templates
  tests/
    test_tools.py
  Dockerfile

Installation: pip install mcp oder npm install @modelcontextprotocol/sdk. Debug mit MCP Inspector (npx @modelcontextprotocol/inspector) — verbindet mit STDIO- oder HTTP-Endpunkten und zeigt live tools/list-Output. In Cursor: Einstellungen → MCP → Server-Config hinzufügen; Claude Desktop über claude_desktop_config.json.

Python · FastMCP Hello World
from mcp.server.fastmcp import FastMCP

mcp = FastMCP("hello-mcp")

@mcp.tool()
def greet(name: str) -> str:
    return f"Hello, {name}!"

if __name__ == "__main__":
    mcp.run()

Tools mit Pydantic-Input: FastMCP leitet JSON Schema aus Type Hints und Pydantic-Modellen automatisch ab. Unten: fünf praktische Tools — Rechner, Datei-I/O, HTTP-Fetch, DB-Query und Zeit — mit Async-Support und strukturierten Fehlerrückgaben.

Python · fünf Tools
import asyncio
import httpx
from datetime import datetime, timezone
from pathlib import Path
from pydantic import BaseModel, Field
from mcp.server.fastmcp import FastMCP

mcp = FastMCP("utility-server")

class CalcInput(BaseModel):
    expression: str = Field(description="Math expression e.g. 2 + 3 * 4")

@mcp.tool()
def calculate(input: CalcInput) -> str:
    try:
        allowed = set("0123456789+-*/(). ")
        if not all(c in allowed for c in input.expression):
            return "Error: invalid characters in expression"
        return str(eval(input.expression, {"__builtins__": {}}, {}))
    except Exception as e:
        return f"Error: {e}"

@mcp.tool()
def read_file(path: str) -> str:
    try:
        target = Path(path).resolve()
        if not target.is_file():
            return f"Error: {path} is not a file"
        return target.read_text(encoding="utf-8", errors="replace")[:50000]
    except Exception as e:
        return f"Error: {e}"

@mcp.tool()
async def http_get(url: str) -> str:
    try:
        async with httpx.AsyncClient(timeout=15.0) as client:
            resp = await client.get(url)
            return resp.text[:10000]
    except Exception as e:
        return f"Error: {e}"

@mcp.tool()
async def db_query(sql: str) -> str:
  try:
    import aiosqlite
    async with aiosqlite.connect("app.db") as db:
      cursor = await db.execute(sql)
      rows = await cursor.fetchall()
      return str(rows[:100])
  except Exception as e:
    return f"Error: {e}"

@mcp.tool()
def current_time(tz: str = "UTC") -> str:
    return datetime.now(timezone.utc).isoformat()

Resources: Statische URIs mappen auf feste Dateien; dynamische URIs akzeptieren Parameter. Ein Filesystem-Resource-Server exponiert Projektdocs, die der Agent ohne Tool-Nebenwirkungen lesen kann.

Python · Filesystem-Resources
from mcp.server.fastmcp import FastMCP
from pathlib import Path

mcp = FastMCP("fs-resources")
DOCS = Path("./docs")

@mcp.resource("docs://index")
def docs_index() -> str:
    files = [f.name for f in DOCS.glob("*.md")]
    return "\n".join(files)

@mcp.resource("docs://{filename}")
def read_doc(filename: str) -> str:
    path = DOCS / filename
    if not path.exists():
        return f"Error: {filename} not found"
    return path.read_text(encoding="utf-8")

Prompts: Wiederverwendbare Templates mit Argument-Slots. Ein Code-Review-Prompt füllt Kontext vor, damit der Agent Ihre Team-Checkliste befolgt.

Python · Code-Review-Prompt
from mcp.server.fastmcp import FastMCP

mcp = FastMCP("review-prompts")

@mcp.prompt()
def code_review(file_path: str, language: str) -> str:
    return f"""Review {file_path} ({language}) for:
1. Security vulnerabilities (injection, auth bypass)
2. Performance bottlenecks
3. Error handling gaps
4. Test coverage holes
Provide severity-rated findings with fix suggestions."""

Cursor-Config-Snippet: In .cursor/mcp.json einfügen — {"mcpServers": {"utility": {"command": "python", "args": ["src/server.py"]}}}. Claude Desktop nutzt dieselbe Form in claude_desktop_config.json.

04

HTTP-Transport, Debugging und das Sechs-Schritte-MCP-Server-Runbook

Streamable-HTTP-Transport ist der 2026-Standard für Remote-MCP-Server. FastMCP mit mcp.run(transport="streamable-http") starten oder TypeScript-SDK StreamableHTTPServerTransport nutzen. Sicherheit am Edge schichten:

01

Bearer-Tokens: Authorization: Bearer <token> bei jeder Anfrage validieren. Tokens per Env-Vars rotieren, nie hardcoden.

02

API-Keys: Header X-API-Key für einfachere Client-Configs. Keys auf Mandanten-Rate-Limits mappen.

03

CORS: Access-Control-Allow-Origin auf bekannte Host-Origins beschränken. Wildcard * auf Produktions-MCP-Endpunkten ist ein häufiger Fehlkonfigurationsfehler.

04

Rate Limiting: Requests pro Key am Reverse Proxy (nginx, Cloudflare) oder in App-Middleware deckeln. MCP-Tool-Calls können teure Downstream-APIs auslösen.

Debug-Workflow: Zuerst MCP Inspector, dann Client-Logs, dann Unit-Tests. Inspector zeigt rohes JSON-RPC, Schema-Validierungsfehler und Timing pro Call.

Python · pytest Unit-Test
import pytest
from server import calculate, CalcInput

def test_calculate_valid():
    result = calculate(CalcInput(expression="2 + 3"))
    assert result == "5"

def test_calculate_invalid_chars():
    result = calculate(CalcInput(expression="import os"))
    assert result.startswith("Error:")
FehlersymptomWahrscheinliche UrsacheFix
Server nicht in Cursor gelistetFalscher Config-Pfad oder Befehlmcp.json command/args prüfen; Subprozess-Start ohne Import-Fehler verifizieren
tools/list liefert leerDekoratoren vor run() nicht registriertTool-Module in server.py-Einstieg importieren
HTTP connection refusedFalscher Port oder Transport-MismatchClient-Transport an Server-Modus anpassen (STDIO vs streamable-http)
CORS-Fehler im Browser-ClientFehlende oder zu strikte HeaderErlaubte Origins hinzufügen; Credentials nur bei Bedarf aktivieren
Tool-Call-TimeoutSync-Blocking im Async-Kontextasync def-Tools oder asyncio.to_thread für I/O nutzen
Ungültiges JSON Schema abgelehntPydantic-Modell ohne Field-BeschreibungenField(description=...) für agent-lesbare Params ergänzen

Sechs-Schritte-Runbook von Assessment bis produktionsreifer MCP Server:

01

Integrationen mappen: Externe Systeme (DB, Git, Slack, interne APIs) listen. Aktuelle Pro-Modell-Adapter zählen und Rewrite-Kosten bei Vendor-Wechsel schätzen.

02

SDK und Transport wählen: Python FastMCP für STDIO-Prototyping; streamable-http, wenn Teammitglieder Remote-Zugriff brauchen. TypeScript, wenn Ihr Stack Node ist.

03

Fähigkeiten implementieren: Mit 2–3 Tools, einem Resource-URI-Schema, einem Prompt-Template starten. Schemas in MCP Inspector validieren, bevor Clients verdrahtet werden.

04

Clients verdrahten: Server in Cursor mcp.json und Claude-Desktop-Config eintragen. tools/list beim Session-Start bestätigen — keine hardcodierten Tool-Arrays in Prompts.

05

Testen und härten: Unit-Tests pro Tool, Integrationstests via Inspector, strukturierte Fehlerstrings statt roher Tracebacks ans LLM.

06

7×24-Host deployen: Dockerisieren, auf Railway/Render/Cloud Run oder dediziertem VPS pushen. Für Apple-Silicon-Inferenz und Xcode CI auf demselben Knoten Cloud-Mac-Mini statt Linux-VPS — DSGVO: AVV und Datenresidenz prüfen, wenn Tool-Calls personenbezogene Daten in US-Cloud verarbeiten.

05

Produktions-Deploy, Capstone-Projekt, Ökosystem und Hard Data

Produktionspfade: Mit Docker paketieren (python:3.12-slim-Base, Non-Root-User, Health-Check auf HTTP-Port). Plattform-Optionen:

A

Railway / Render: Container pushen, Env-Vars für API-Keys setzen, HTTP-Port exposen. Gut für team-geteilte Dev/Staging-Server.

B

AWS Lambda: Nur für zustandslose Tool-Calls — nicht für persistente SSE-Sessions. API Gateway + kurzlebige Handler.

C

Google Cloud Run: Skaliert HTTP-Streamable-Server; min instances auf 1 für Session-Wärme setzen.

D

VPS / Bare Metal: Volle Kontrolle für lang laufende Agenten, lokale Embeddings und Multi-Server-Stacks auf einem Host.

Monitoring: Request-Latenz und Tool-Call-Counter nach Prometheus exportieren; Exceptions nach Sentry mit MCP-Method-Name-Tags. SDK-Versionen in pyproject.toml / package.json pinnen und Docker-Images pro Release taggen — MCP-Spec-Revisionen 2026 liefern noch breaking Transport-Changes.

Capstone: persönliche Wissensbasis-MCP. ChromaDB-Vektorspeicher, Embedding-Modell (lokal Ollama oder API) und Semantic-Search-Tool kombinieren:

Python · ChromaDB-Search-Tool
import chromadb
from mcp.server.fastmcp import FastMCP

mcp = FastMCP("knowledge-base")
client = chromadb.PersistentClient(path="./chroma_data")
collection = client.get_or_create_collection("notes")

@mcp.tool()
def semantic_search(query: str, n: int = 5) -> str:
    results = collection.query(query_texts=[query], n_results=n)
    docs = results.get("documents", [[]])[0]
    return "\n---\n".join(docs) if docs else "No matches found."

@mcp.tool()
def ingest_note(text: str, source: str) -> str:
    collection.add(documents=[text], metadatas=[{"source": source}], ids=[source])
    return f"Indexed: {source}"

Ökosystem-Server 2026 zum Studieren: mcp-server-filesystem (offizielle Referenz), GitHub MCP (Repo/PR/Issue-Ops), Brave Search MCP (Web-Retrieval), Postgres MCP (SQL mit Schema-Introspection), Slack MCP (Channel-Messaging). Trends H2 2026: OAuth 2.1 als standardisierte Auth, unified Server-Registries, Multi-Tenant-hosted MCP-Marketplaces und Agent-to-Agent (A2A)-Orchestrierung über MCPs Tool-Schicht.

A

10.000+ Community-Server: MCP-Server-Anzahl überschritt Mitte 2026 zehntausend — jeder neue Server erreicht sofort jeden kompatiblen Client.

B

38–55 % Integrationskosten-Senkung: Enterprise-Teams berichten 38–55 % niedrigere KI-Integrationsausgaben nach Konsolidierung hinter MCP-Servern (Branchenumfrage-Durchschnitt 2025–2026).

C

~1.000 exponierte unautorisierte Server: Security-Scans Anfang 2026 fanden rund tausend MCP-Endpunkte im öffentlichen Internet ohne Auth — produktive Server nie ohne Bearer-Tokens, API-Keys und Netzwerk-Isolation deployen. DSGVO: ungeschützte Endpunkte riskieren unbefugten Zugriff auf personenbezogene Tool-Daten.

Achtung: Linux-VPS-Knoten können keine Xcode-Builds oder Apple-Silicon-optimierten lokalen Embedding-Modelle ausführen. Laptop-STDIO-Sessions sterben beim Sleep. AWS Lambda hält keine persistenten MCP-SSE-Sessions. Jede Abkürzung opfert etwas, das Produktions-Agenten brauchen.

Für Teams, die MCP Server neben Cursor-Agenten, ChromaDB-Ingestion und iOS-CI auf einem always-on-Knoten betreiben, ist MESHLAUNCH Cloud-Mac-Mini-Miete meist der bessere Produktions-Host: dediziertes Apple Silicon, keine Sleep-Disconnects, flexible Tages-/Wochen-/Monatsabrechnung und ein stabiler Ort, an dem Tool-Definitionen zu portablen Team-Assets statt pro-Developer-Laptop-Configs werden. Specs unter Mietpreise.

FAQ

Python FastMCP ist am schnellsten für Prototypen: dekoratorbasierte Tools, automatisches JSON Schema aus Type Hints und One-Line-STDIO-Start. TypeScript @modelcontextprotocol/sdk passt zu Node.js-Teams oder HTTP-Streamable-Servern auf Express. Beide sind offizielle SDKs — wählen Sie die Sprache, in der Ihr Team ausliefert. Knoten-Specs auf der Mietpreise-Seite.

Ja. STDIO-Server laufen als Subprozesse auf jedem macOS-Host. HTTP-Streamable-Server brauchen persistente Prozesse und stabiles Netz — Cloud-Mac-Mini-Bare-Metal liefert Apple Silicon für lokale Embedding-Inferenz, Xcode CI auf demselben Knoten und kein Laptop-Sleep, das zustandsbehaftete MCP-Sessions beendet.

Zuerst MCP Inspector gegen Ihren Server-Endpunkt, dann tools/list auf erwartete Schemas prüfen, danach Cursor-MCP-Logs. Häufige Ursachen: falscher Transport-Modus, ungültiges JSON Schema, Subprozess-Crash beim Import oder CORS bei HTTP-Servern. SSH-Tunnel und Port-Setup im Hilfezentrum.