Skip to main content
Glama
mcp-demo-server

mcp-demo-server

by mhamzanadeem

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 MCPServer für die Serverkonstruktion und ClientSession/stdio_client fü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.sh

Anforderungen

  • 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 PowerShell

2. Abhängigkeiten installieren

python -m pip install --upgrade pip
pip install -r requirements.txt

3. OpenAI konfigurieren

cp .env.example .env

Bearbeiten Sie .env mit Ihren Anmeldedaten:

OPENAI_API_KEY=your_api_key_here
OPENAI_MODEL=gpt-4.1-mini

Der Server selbst benötigt keinen OpenAI-Schlüssel.


Demo ausführen

Vom Repository-Stammverzeichnis aus

python src/mcp_client/runner.py

Was der Runner tut:

Schritt

Beschreibung

1️⃣

Startet src/mcp_server/server.py als Unterprozess

2️⃣

Führt den MCP-Initialisierungs-Handshake durch

3️⃣

Ruft tools/list auf

4️⃣

Konvertiert entdeckte MCP-Schemata → OpenAI-Funktionstools

5️⃣

Fordert das Modell auf, eine Frage in natürlicher Sprache zu beantworten

6️⃣

Wenn das Modell get_current_weather wählt, sendet es tools/call über MCP

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.sh

Erwartete 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.py

Ein 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.py

Demonstrierte MCP-Methoden

Das offizielle SDK übernimmt den JSON-RPC-Lebenszyklus:

Methode

Richtung

Zweck

initialize

Client → Server

Handshake & Fähigkeitsaushandlung

tools/list

Client → Server

Verfügbare Tools entdecken

tools/call

Client → Server

Ein Tool aufrufen

resources/list

Client → Server

Verfügbare Ressourcen entdecken

resources/read

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"
) -> WeatherResponse

Gibt 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 -q

Die 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 logging an stderr

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 tools/list

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


Related MCP Connectors

Related MCP Servers

  • F
    license
    B
    quality
    D
    maintenance
    Enables 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
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    Provides 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 npm
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Wraps 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 npm
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Provides weather data from WeatherAPI.com through MCP, enabling AI agents to query current conditions and forecasts via natural language.
    195 npm
    MIT