MCP-Entwicklung 16. Juni 2026 ca. 22 Min. Model Context Protocol AI Tool Calling

MCP Server von null entwickeln:
Hands-on-Anleitung für AI-Tool-Aufrufe

Protokoll · Tools / Resources / Prompts · Debug & Deploy · Wissensbasis-Praxis

MCP Server von null entwickeln und AI-Tool-Aufrufe aufbauen

Backend- und AI-Entwickler mit Python- oder TypeScript-Grundlagen kennen das Problem: Claude und GPT sind leistungsfähig, greifen aber nicht auf Ihre Datenbank, interne APIs oder lokale Dateien zu — es fehlt ein standardisierter Kanal für externe Tools. Das Model Context Protocol (MCP) von Anthropic ist ein offenes Protokoll, über das AI-Clients (Cursor, Claude Desktop) per JSON-RPC mit Ihrem Server sprechen. Nach diesem Artikel können Sie eigenständig einen produktionsreifen MCP Server entwickeln und deployen: Architektur → Umgebung → Hello World → Tools / Resources / Prompts → HTTP-Transport → Debug & Tests → Docker → Wissensbasis-Projekt → Ökosystem 2026.

01

Einleitung: Warum braucht KI MCP?

Selbst starke Modelle kennen weder Ihre CRM-Kunden noch die Logs von gestern Nacht. Der Branchenpfad ist klar: Function Calling → Plugins → MCP. Die ersten beiden sind oft vendor-spezifisch; MCP standardisiert, welche Tools eine KI entdeckt und wie sie sie aufruft — einmal schreiben, mehrere Clients nutzen.

  1. 01

    Schmerz: Claude / GPT soll DB, API und Dateien nutzen — jedes Format ist anders.

  2. 02

    Szenario: In Cursor Markdown-Notizen lesen, in Claude Desktop GitHub-Issues abfragen.

  3. 03

    Versprechen: Vom leeren Verzeichnis zum deploybaren Server — mit Code und Fehlertabelle.

02

Was ist MCP? Protokoll verstehen, dann coden

2.1 Entstehung

Anthropic veröffentlichte MCP im November 2024, um KI-Tool-Kommunikation zu standardisieren und das N×M-Adapter-Problem zu lösen. Mehr Kontext in unserem MCP-HTTP-Vergleich.

2.2 Architektur

Client ↔ Server: Der Client sitzt bei der KI (Claude Desktop, Cursor); der Server liefert Fähigkeiten per JSON-RPC:

  • T

    Tools: Aufrufbare Funktionen — Suche, Berechnung, DB-Query.

  • R

    Resources: Lesbare Daten — Dateien, URLs, Konfiguration.

  • P

    Prompts: Vordefinierte, parametrisierbare Prompt-Vorlagen.

2.3 Kommunikation

Basis: JSON-RPC 2.0. Transport: stdio (lokaler Subprozess, Cursor-Standard) oder HTTP + SSE / Streamable HTTP (Remote). Lebenszyklus: Handshake → initialize → Request/Response → Shutdown.

2.4 Vergleich

DimensionMCPOpenAI Function CallingLangChain Tools
StandardOffenes ProtokollVendor-proprietärFramework-gebunden
Transportstdio / HTTPHTTPHTTP
Cross-ModelJaNeinTeilweise
Resources / PromptsNativNeinNein
Ökosystem 202610.000+ ServerReifReif
03

Entwicklungsumgebung vorbereiten

3.1 Sprache wählen

Python (mcp, FastMCP) für Einsteiger; TypeScript (@modelcontextprotocol/sdk) für Frontend/Full-Stack. Dieser Artikel nutzt Python, TS als Referenz.

Umgebung
# Python
python -m venv .venv && source .venv/bin/activate
pip install mcp httpx pydantic

# TypeScript (Referenz)
npm init -y && npm install @modelcontextprotocol/sdk

3.2 Projektstruktur

my-mcp-server/
my-mcp-server/
├── server.py            # Einstieg
├── tools/               # calculator.py, web_search.py
├── resources/           # file_reader.py
├── prompts/             # templates.py
├── tests/test_tools.py
├── pyproject.toml
└── README.md

3.3 Debug-Tools

  1. 1

    MCP Inspector: npx @modelcontextprotocol/inspector python server.py

  2. 2

    Claude Desktop: claude_desktop_config.json bearbeiten.

  3. 3

    Cursor: Settings → MCP → command + args hinzufügen.

04

Erster MCP Server: Hello World

server.py · Minimal-Server
from mcp.server.fastmcp import FastMCP

mcp = FastMCP("my-first-server")

@mcp.tool()
def say_hello(name: str) -> str:
    """Begrüßt eine Person"""
    return f"Hello, {name}! Das ist Ihr erster MCP-Tool."

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

Nach python server.py in Cursor {"command":"python","args":["/abs/path/server.py"]} eintragen — say_hello sollte in der Tool-Liste erscheinen.

Cursor / Claude Desktop

  • Absolute Pfade zu server.py und venv-Python.

  • Nach Codeänderung MCP-Verbindung neu starten oder Cursor-Fenster schließen.

  • Tool-Aufruf im Chat explizit anfordern und registrierten Kontext prüfen.

05

Tools: Von der KI aufrufbare Funktionen

5.1 Grundstruktur

Signatur = Dokumentation: Typen, Rückgabe und Docstring steuern die Tool-Auswahl. Namen: snake_case, Verb zuerst (search_web). Fehler als strukturiertes JSON statt nackter Exceptions.

5.2 Komplexe Parameter (Pydantic)

Such-Tool mit Schema
from pydantic import BaseModel, Field

class SearchInput(BaseModel):
    query: str = Field(description="Suchbegriff")
    max_results: int = Field(default=5, description="Max. Treffer")
    language: str = Field(default="de", description="Ergebnissprache")

@mcp.tool()
def web_search(input: SearchInput) -> list[dict]:
    """Websuche, liefert Ergebnisliste"""
    ...

5.3 Fünf praktische Tools

ToolZweckHinweis
RechnerMathe-Ausdrückeast.literal_eval, kein eval
Datei-I/OLokal lesen/schreibenWhitelist, Pfad-Normalisierung
HTTPExterne APIsTimeout, Retry, Größenlimit
DB-QueryRead-only SQLParametrisiert, kein DDL
ZeitNow, ZeitzonenISO 8601 zurückgeben

5.4 Async-Tools

async fetch_url
@mcp.tool()
async def fetch_url(url: str) -> str:
    """Lädt URL-Inhalt"""
    async with httpx.AsyncClient(timeout=30.0) as client:
        response = await client.get(url)
        return response.text

5.5 Fehlerbehandlung

  • !

    Netzwerk/IO: Timeout 15–30 s.

  • !

    Sensible Ops: Auth (API Key, erlaubte Pfade).

  • !

    {"error": "...", "hint": "..."} für Modell-Retry.

06

Resources: Dynamische Inhalte für die KI

Resource vs. Tool: Resource = Datenlieferant (read-only); Tool = Aktion. Adressierung per URI: file://, http://, custom://.

Statische und dynamische Resources
@mcp.resource("config://app-settings")
def get_app_settings() -> str:
    """App-Konfiguration"""
    return json.dumps({"version": "1.0", "env": "production"})

@mcp.resource("user://{user_id}/profile")
def get_user_profile(user_id: str) -> str:
    """Nutzerprofil nach ID"""
    return json.dumps(db.query_user(user_id))

Typen: Text (text/plain, JSON), Binär (Bilder, PDF), Stream (Live-Daten). Praxis: Dateisystem-Server mit Verzeichnisliste, Lesen, optional Watch.

07

Prompts: Wiederverwendbare Vorlagen

MCP-Prompts sind parametrisierbare Fragmente für konsistente Team-Prompts.

Code-Review-Prompt
from mcp.types import PromptMessage, TextContent

@mcp.prompt()
def code_review_prompt(language: str, code: str) -> list[PromptMessage]:
    """Code-Review-Vorlage"""
    return [PromptMessage(
        role="user",
        content=TextContent(type="text", text=f"""Bitte prüfe diesen {language}-Code:
1. Qualität  2. Bugs & Sicherheit  3. Performance

```{language}
{code}
```""")
    )]

Mehrturn-Vorlagen (user + assistant) für Interviews oder Debug-Hilfe. Client ruft prompts/get auf.

08

Fortgeschritten: HTTP-Transport (Remote MCP)

MerkmalstdioHTTP + SSE
DeployLokalRemote-Server
LatenzSehr niedrigNetzwerk
Multi-ClientNeinJa
SzenarioIDE lokalSaaS / Team
Streamable HTTP
mcp = FastMCP("remote-server", transport="streamable-http")

if __name__ == "__main__":
    mcp.run(host="0.0.0.0", port=8000)

Produktion: Bearer Token, CORS, Rate Limiting. Unauthentifizierten HTTP-MCP nicht ins Internet stellen.

09

Debug und Tests

9.1 MCP Inspector

Grafisch testen: tools/list, tools/call, JSON-RPC-Logs, Fehlersimulation.

9.2 Unit-Tests (pytest + ClientSession)

test_calculator_tool
@pytest.mark.asyncio
async def test_calculator_tool():
    server_params = StdioServerParameters(command="python", args=["server.py"])
    async with stdio_client(server_params) as (read, write):
        async with ClientSession(read, write) as session:
            await session.initialize()
            result = await session.call_tool("calculate", {"expression": "2 + 2"})
            assert result.content[0].text == "4"

9.3 Häufige Fehler

FehlerUrsacheLösung
Tool fehltFalscher PfadAbsoluten Pfad in config prüfen
JSON-FehlerTyp nicht serialisierbarstr oder dict
TimeoutLangsame Tool-AusführungAsync + Timeout
Permission deniedPfad / TCCWhitelist / VNC für Dialog
10

Produktions-Deployment

10.1 Docker

Dockerfile
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["python", "server.py"]

10.2 Cloud-Optionen

  • Railway / Render: Schnell für Side Projects.

  • Lambda / Cloud Run: Serverless — Cold Start, stdio-Limits beachten.

  • VPS + Nginx: Reverse Proxy, TLS, Rate Limit.

10.3 Observability

Strukturierte Logs, Prometheus-Metriken, Sentry, /health. MCP-Version deklarieren, Tools rückwärtskompatibel erweitern.

11

Praxis: Wissensbasis MCP Server

Ziel: KI durchsucht lokale Markdown-Notizen, semantische Suche, Notizen anlegen. In Cursor: „Was habe ich letzte Woche zu MCP notiert?“

Stack

KomponenteEmpfehlung
Vektor-DBChromaDB / Qdrant (lokal)
Embeddingstext-embedding-3-small
File Watchwatchfiles für inkrementellen Index

Kern-Tools

  1. 1

    index_notes: Verzeichnis scannen, Vektorindex.

  2. 2

    semantic_search: Semantische Treffer.

  3. 3

    write_note: Markdown erstellen/anhängen.

  4. 4

    Resource: notes://{path} Einzelnotiz.

semantic_search spart Tokens gegenüber dem Einfügen des gesamten Archivs und liefert präzisere Antworten.

12

MCP-Ökosystem und Ausblick 2026

Empfohlene Open-Source-Server

  • mcp-server-filesystem — Dateisystem

  • mcp-server-github — GitHub

  • mcp-server-brave-search — Websuche

  • mcp-server-postgres — Datenbank

  • mcp-server-slack — Slack

2026 unterstützen Cursor, Claude Desktop, OpenAI, Google Gemini und Microsoft MCP; Marketplace und Enterprise-Security (OAuth 2.1, Audit) reifen. Docs: modelcontextprotocol.io; Python SDK: github.com/modelcontextprotocol/python-sdk.

Fünf Schritte (inkl. Remote-Mac)

  1. 1

    Host wählen (Cursor / Claude Desktop), MCP-Support in 2026-Version prüfen.

  2. 2

    Lokal mit stdio entwickeln, Inspector für tools/list.

  3. 3

    In Cursor MCP registrieren, Hello-World-Smoke-Test.

  4. 4

    Browser-, Keychain-, Screen-Capture-Server: macOS-GUI für TCC (SSH reicht nicht).

  5. 5

    HTTP + Docker + Auth live; verknüpfen mit Agent-Skill-Leitfaden und Browser-MCP.

13

FAQ

Python (mcp + FastMCP) am schnellsten; TypeScript (@modelcontextprotocol/sdk) für Node-Teams. Protokollebene identisch.

IDE lokal: stdio. Multi-User / SaaS: HTTP + SSE / Streamable HTTP mit Authentifizierung.

Tools führen Aktionen aus; Resources liefern lesbare Daten über URI-Templates.

Browser-MCP, Keychain und Bildschirmaufnahme lösen macOS-TCC-Dialoge aus. SSH kann „Immer erlauben“ nicht klicken — VNC-GUI auf dem Host nötig.

Fazit

MCP ist das Standardprotokoll für AI-Tooling — die Kette von Hello World bis Produktion ist 2026 Kernkompetenz für AI-Engineers. Welches Tool bauen Sie als Nächstes?

Die versteckten Kosten liegen selten im Code, sondern in der Laufzeitumgebung: Windows + Cloud-Mac + Cursor MCP erfordert TCC-Dialoge, venv und Inspector-Logs in einer Desktop-Sitzung. Eigenes Mac mini bringt Sleep, Updates und Abschreibung; 8 GB RAM reichen bei Vektorindex und parallelen Servern schnell nicht.

MCP stundenweise mit GUI auf derselben Maschine wie Cursor validieren? VNCMac Remote-Mac mieten — Hauptbutton zur Preisseite, Pakete auf der Startseite.