mcp-demo-server
MCP Demo – Python-Agent-Tooling von Grund auf
Was ist MCP?
MCP (Model Context Protocol) ist ein standardisiertes Protokoll, das es KI-Anwendungen ermöglicht, externe Tools, Ressourcen und Prompts über eine einheitliche Schnittstelle zu entdecken und zu nutzen.
Anstatt dass jedes KI-Framework eine eigene Integration für jede Datenbank, API, jedes Dateisystem oder jeden internen Dienst erfindet, kann ein MCP-Host eine Verbindung zu einem MCP-Server herstellen und dieselbe Protokolloberfläche nutzen.
Probleme, die MCP löst
Problem | MCP-Lösung |
Anbieterbindung | Integrationen stellen Fähigkeiten über MCP bereit, anstatt sie an einen einzelnen Modellanbieter oder ein Agent-Framework zu binden |
Inkonsistenter Tool-Aufruf | Tools haben maschinenlesbare Schemata und standardisierte Entdeckungs-/Aufrufsemantik |
Keine Kontextpersistenz | MCP trennt Kontext-/Tool-Anbieter vom Modell und ermöglicht langlebige Verbindungen |
Dynamische Datenquellen | Datenbanken, APIs, Dateien und interne Systeme werden als MCP-Ressourcen/-Tools gekapselt, ohne die Implementierung in die Modell-Laufzeit einzubetten |
Über das Netzwerk verwendet MCP JSON-RPC-2.0-Nachrichten über Transporte wie stdio und HTTP-basierte Transporte (SSE/Streamable HTTP). Dieses Repository verwendet stdio: Der Client startet den Server als Unterprozess, sendet Protokollnachrichten über stdin und empfängt Antworten über stdout.
Related MCP server: Weather MCP Server
Architektur
flowchart TD
A[User: "What's the weather in London?"] --> B[AI Agent<br/>OpenAI Responses API]
B --> C[1. Discovers MCP tools]
B --> D[2. Decides whether to call]
B --> E[3. Emits function call]
E --> F[MCP Client<br/>ClientSession + stdio]
F --> G[initialize]
F --> H[tools/list]
F --> I[tools/call]
I --> J[JSON-RPC 2.0<br/>stdin/stdout]
J --> K[MCP Server subprocess]
K --> L[get_current_weather tool]
K --> M[greeting://{name} resource]Warum das offizielle SDK?
Dieses Repository verwendet das offizielle Python-MCP-SDK, anstatt das Protokoll neu zu implementieren. Das SDK bietet:
Protokoll-Lebenszyklus und -Validierung
Transportabstraktion (stdio, HTTP/SSE)
Typisierte Client-/Server-APIs
Der Anwendungscode macht die wichtigen MCP-Konzepte weiterhin explizit: Serverregistrierung, Tool-Schemata, initialize, tools/list, tools/call, Ressourcen-Lesevorgänge und stdio-Prozessverwaltung.
Die stabile v2-API des aktuellen SDKs verwendet
MCPServerfür die Serverkonstruktion undClientSession/stdio_clientfür stdio-Clients.
Projektstruktur
mcp-demo/
├── README.md
├── requirements.txt
├── .env.example
├── pyproject.toml
├── src/
│ ├── mcp_server/
│ │ ├── __init__.py
│ │ ├── server.py # MCP server entry point
│ │ ├── tools.py # Tool implementations
│ │ ├── handlers.py # Request handlers
│ │ └── utils.py # Shared utilities
│ ├── mcp_client/
│ │ ├── __init__.py
│ │ ├── client.py # MCP client wrapper
│ │ ├── agent.py # OpenAI agent integration
│ │ └── runner.py # Demo runner
│ └── shared/
│ ├── __init__.py
│ └── types.py # Shared Pydantic models
├── tests/
│ ├── test_server.py
│ └── test_client.py
├── examples/
│ └── demo.ipynb
└── scripts/
└── run_demo.shAnforderungen
Python 3.10+
OpenAI-API-Schlüssel (für die KI-Agenten-Demo)
Kein Wetter-API-Schlüssel erforderlich – das Wetter-Tool verwendet deterministische Beispieldaten, sodass der MCP-Pfad offline funktioniert.
Schnellstart
1. Virtuelle Umgebung erstellen
python -m venv .venv
source .venv/bin/activate # Linux/macOS
.venv\Scripts\Activate.ps1 # Windows PowerShell2. Abhängigkeiten installieren
python -m pip install --upgrade pip
pip install -r requirements.txt3. OpenAI konfigurieren
cp .env.example .envBearbeiten Sie .env mit Ihren Anmeldedaten:
OPENAI_API_KEY=your_api_key_here
OPENAI_MODEL=gpt-4.1-miniDer Server selbst benötigt keinen OpenAI-Schlüssel.
Demo ausführen
Vom Repository-Stammverzeichnis aus
python src/mcp_client/runner.pyWas der Runner tut:
Schritt | Beschreibung |
1️⃣ | Startet |
2️⃣ | Führt den MCP-Initialisierungs-Handshake durch |
3️⃣ | Ruft |
4️⃣ | Konvertiert entdeckte MCP-Schemata → OpenAI-Funktionstools |
5️⃣ | Fordert das Modell auf, eine Frage in natürlicher Sprache zu beantworten |
6️⃣ | Wenn das Modell |
7️⃣ | Sendet das MCP-Ergebnis zurück an das Modell |
8️⃣ | Gibt die endgültige Antwort aus |
9️⃣ | Fährt den Server sauber herunter |
Alternative: Shell-Wrapper
bash scripts/run_demo.shErwartete Ausgabe
Der genaue Wortlaut variiert je nach Modell, aber der Log-Ablauf sieht so aus:
INFO mcp_client.client: -> MCP initialize
INFO mcp_client.client: <- MCP initialize: server=mcp-demo-server
INFO mcp_client.client: -> MCP tools/list
INFO mcp_client.client: <- MCP tools/list: ["get_current_weather"]
INFO mcp_client.agent: User: What's the weather in London?
INFO mcp_client.agent: OpenAI requested tool: get_current_weather {"city":"London","units":"metric"}
INFO mcp_client.client: -> MCP tools/call name=get_current_weather arguments={"city":"London","units":"metric"}
INFO mcp_server.tools: weather lookup city=London units=metric
INFO mcp_client.client: <- MCP tools/call result={"city":"London","temperature":18.0,...}
INFO mcp_client.agent: Final: London is 18°C and partly cloudy.Die Logs zeigen bewusst MCP-semantische Nachrichten an der Anwendungsgrenze. Das SDK übernimmt die JSON-RPC-Rahmung intern.
MCP-Server eigenständig ausführen
python src/mcp_server/server.pyEin stdio-MCP-Server scheint zu „hängen“ – das ist erwartet. Er wartet auf Protokollnachrichten auf stdin. Ein Host/Client sollte ihn starten und die stdio-Pipes besitzen.
Interaktive Protokollprüfung
pip install "mcp[cli]"
mcp dev src/mcp_server/server.pyDemonstrierte MCP-Methoden
Das offizielle SDK übernimmt den JSON-RPC-Lebenszyklus:
Methode | Richtung | Zweck |
| Client → Server | Handshake & Fähigkeitsaushandlung |
| Client → Server | Verfügbare Tools entdecken |
| Client → Server | Ein Tool aufrufen |
| Client → Server | Verfügbare Ressourcen entdecken |
| Client → Server | Eine Ressource lesen |
Der Client ruft explizit initialize() auf, bevor er Fähigkeiten auflistet oder aufruft. Die Dekoratoren des Servers generieren Tool-/Ressourcen-Schemata aus Python-Typannotationen.
Tool: get_current_weather
get_current_weather(
city: str,
units: Literal["metric", "imperial"] = "metric"
) -> WeatherResponseGibt strukturierte, Pydantic-gestützte Nutzdaten zurück:
{
"city": "London",
"temperature": 18.0,
"units": "metric",
"condition": "partly cloudy",
"humidity_percent": 72
}Unbekannte Städte schlagen mit einem kontrollierten MCP-Tool-Fehler fehl, anstatt den Server zum Absturz zu bringen.
Agenten-Integrationsablauf
Der Agent verwendet einfaches OpenAI-Function-Calling (kein zusätzliches Framework), um die Demo fokussiert zu halten:
flowchart LR
A[MCP Tool Schema] --> B[OpenAI Function Tool]
B --> C[Model Chooses Function]
C --> D[MCP ClientSession.call_tool]
D --> E[MCP Server Executes Tool]
E --> F[Function Call Output]
F --> G[Final Model Answer]Dies ist dasselbe Muster, das Agent-Frameworks umsetzen: MCP-Tools entdecken → Schemata dem Modell bereitstellen → ausgewählte Aufrufe über MCP zurückleiten → Ergebnisse in die nächste Modellrunde einspeisen.
Testen
pytest -qDie Testsuite umfasst:
✅ Tool-Ausführung (metrisches Wetter)
✅ Tool-Ausführung (imperiales Wetter)
✅ Validierungs-/Fehlerverhalten (unbekannte Stadt)
✅ In-Process-MCP-Client-Erkennung und Tool-Aufruf
Tests verwenden nach Möglichkeit den In-Memory-Client des SDKs – das vermeidet Subprozess-Flakiness und übt gleichzeitig die echte MCP-Protokollebene.
Formatierung & Linting
Dieses Projekt verwendet Ruff:
# Check
ruff check .
ruff format --check .
# Format
ruff format .Produktionshinweise
Diese Demo ist bewusst klein, repräsentiert aber mehrere Produktionsaspekte:
Anliegen | Implementierung |
stdout-Disziplin | Server gibt niemals App-Logs auf stdout aus (gehört zu MCP); Logs gehen über |
Typisierte E/A | Pydantic-Modelle validieren Tool-Eingaben/-Ausgaben an der Anwendungsgrenze |
Kontrollierte Fehler | Tool-Ausnahmen → MCP-Fehlerergebnisse (SDK), keine Prozessabstürze |
Subprozess-Lebenszyklus | Der stdio-Kontextmanager des SDKs verwaltet Prozessstart/-herunterfahren |
Umgebung mit minimalen Rechten | Der MCP-stdio-Client übergibt explizit die vom Unterprozess benötigten Umgebungsvariablen |
Dynamische Erkennung | Der Agent codiert das Wetter-Tool-Schema nicht fest, sondern entdeckt es über |
Für echte externe Datenquellen: Ersetzen Sie deterministisches Wetter durch authentifizierte API-/Datenbankaufrufe, fügen Sie Timeouts, Wiederholungen, Ratenbegrenzung, Beobachtbarkeit und Geheimnisverwaltung hinzu.
Protokoll-Mentales Modell
Vereinfachte JSON-RPC-Sequenz:
// Client -> Server
{"jsonrpc":"2.0","id":1,"method":"initialize","params":{...}}
// Server -> Client
{"jsonrpc":"2.0","id":1,"result":{...}}
// Client -> Server
{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}
// Server -> Client
{"jsonrpc":"2.0","id":2,"result":{"tools":[...]}}
// Client -> Server
{"jsonrpc":"2.0","id":3,"method":"tools/call",
"params":{"name":"get_current_weather","arguments":{"city":"London"}}}
// Server -> Client
{"jsonrpc":"2.0","id":3,"result":{"content":[...],"structuredContent":{...}}}Das genaue Protokollschema wird von der MCP-Spezifikation und dem SDK gepflegt. Das Obige ist für Lehrzwecke bewusst vereinfacht.
Referenzen
Offizielles MCP-Python-SDK: https://py.sdk.modelcontextprotocol.io/
MCP-Spezifikation: https://modelcontextprotocol.io/specification/
OpenAI Function Calling: https://platform.openai.com/docs/guides/function-calling
This server cannot be deployed
Maintenance
Related MCP Connectors
Weather, code search, currency & Solana trust scoring as MCP tools. Free, no API key needed.
Hosted MCP server for Xweather weather data: conditions, forecasts, alerts, and more.
Geocoding, routing, isochrones, traffic, weather, and place search for AI agents. 19 MCP tools.
Pay-per-use tool marketplace for AI agents. Search, price-check, and call APIs via MCP.
Related MCP Servers
- FlicenseBqualityDmaintenanceEnables AI agents to retrieve real-time weather conditions and forecasts via OpenWeatherMap API. Supports interactive weather queries and travel planning through MCP tools, resources, and prompts.2-
- AlicenseNot gradedqualityDmaintenanceProvides weather data from OpenWeatherMap API through MCP tools and a REST API with OpenAPI support. Enables LLM agents to retrieve current weather, forecasts, and temperature ranges by city or coordinates.4 npmMIT
- AlicenseNot gradedqualityBmaintenanceWraps the OpenWeatherMap API to provide weather data through MCP, enabling AI agents to query current conditions, forecasts, and other weather information via natural language.452 npmMIT
- AlicenseNot gradedqualityBmaintenanceProvides weather data from WeatherAPI.com through MCP, enabling AI agents to query current conditions and forecasts via natural language.195 npmMIT