MCP Server Praxisleitfaden: Aufbau, Test und Bereitstellung von 0 auf 1

Beim Aufbau von KI-Agenten-Systemen besteht eine häufige Herausforderung darin, wie ein Agent externe Tools und Daten sicher und zuverlässig aufrufen kann, während diese vom Agenten dynamisch auffindbar sind. Das Model Context Protocol (MCP) wurde entwickelt, um ein standardisiertes Schnittstellenprotokoll zwischen großen Sprachmodellen (Large Language Models, LLMs) und externen Datenquellen oder Tools bereitzustellen.
Einfach ausgedrückt, definiert MCP die Kommunikationsregeln zwischen LLMs (die als Clients agieren) und Daten-/Tool-Anbietern (die als MCP Server agieren). Dies löst mehrere zentrale technische Probleme:
- Fragmentierte Tool-Verwaltung: Vereinheitlicht die Art und Weise, wie Tools entdeckt, beschrieben und aufgerufen werden.
- Schwieriges Kontext- und Zustandsmanagement: Standardisiert Mechanismen für die Kontexteinbettung und -übertragung.
- Verschwommene Berechtigungen und Sicherheitsgrenzen: Legt klare Grenzen für den Tool- und Datenzugriff auf Protokollebene fest.
- Hohe Komplexität bei der Integration heterogener Systeme: Verbindet verschiedene Backend-Systeme über ein Standardprotokoll.
Typische Szenarien für MCP Server:
- Multi-Tool-KI-Agenten: Wenn Ihr Agent flexibel verschiedene Funktionen wie Abfragen, Schreiben, Berechnen und API-Operationen kombinieren und aufrufen muss.
- Interne Unternehmenssysteme/Privater Datenzugriff: Sichere Bereitstellung interner Datenbanken, CRMs oder Wissensdatenbanken für KI-Agenten.
- Agentenarchitekturen, die einen einheitlichen Kontext und Berechtigungen erfordern: Verwaltung von Benutzeridentität, Sitzungsstatus und Datenzugriffsberechtigungen in komplexen, mehrstufigen Workflows.
Szenarien, die nicht für MCP Server geeignet sind:
- Einzelne API-Aufrufe: Wenn Sie eine Benutzeranfrage einfach einem festen API-Endpunkt zuordnen, ist traditionelles Function Calling möglicherweise leichtergewichtig.
- Einfache Chatbots/Formularbasierte Automatisierung: Szenarien, in denen die Aufgabenlogik fest ist und eine dynamische Tool-Erkennung oder -Kombination unnötig ist.
Wesentliche Unterschiede:
- vs. Function Calling: Function Calling ist eine proprietäre Implementierung von LLM-Anbietern (wie OpenAI), die zur Beschreibung und zum Aufruf von Funktionen verwendet wird, deren Protokoll- und Transportschichten jedoch normalerweise nicht offen sind. MCP ist ein offener, anbieterunabhängiger Protokollstandard, der ein Server-Client-Kommunikationsmodell sowie Mechanismen zur Tool-Erkennung (list_tools) und Ressourcenverwaltung definiert und eine standardisierte Grundlage für übergeordnete Agentenarchitekturen bietet.
- vs. Webhook: Ein Webhook ist ein einseitiger HTTP-Callback, der durch ein Ereignis ausgelöst wird und zu Benachrichtigungszwecken dient. MCP beinhaltet eine zweiseitige Anfrage-Antwort- oder Streaming-Kommunikation, die vom Client (LLM) initiiert wird, um Tool-Ausführungsergebnisse oder Datenressourcen bei Bedarf abzurufen.
Dieser Artikel basiert auf den offiziellen Model Context Protocol (MCP) Spezifikationen und konzentriert sich auf die Praxis des KI-Agenten-Engineerings in der realen Welt, wobei er die Erfahrungen des Autors bei der Integration von Agenten-Systemen in Unternehmen und dem Prototyping von MCP Servern zusammenfasst.
Zielgruppe:
- Technologie-Enthusiasten und Einsteiger
- Experten und Manager, die Effizienzsteigerungen anstreben
- Unternehmensentscheider und Leiter von Geschäftsabteilungen
- Allgemeine Benutzer, die an zukünftigen KI-Trends interessiert sind
Inhaltsverzeichnis:
- 1. Technische Auswahl und architektonische Entscheidungen vor dem Aufbau eines MCP Servers
- 2. Umgebungsvorbereitung und MCP Entwicklungs-Toolchain
- 3. Ihr erster MCP Server: Ein minimales, aber erweiterbares Beispiel
- 4. MCP Server Debugging- und Testmethoden
- 5. Produktionsbereitstellungsmuster für MCP Server
- 6. Performance, Stabilität und Praktiken für hohe Parallelität
- 7. Sicherheitsdesign und Risikokontrolle
- 8. FAQ und Fehlerbehebungshandbuch
- 9. Zusammenfassung: Wie man MCP Server in realen KI-Agenten-Systemen einsetzt
1. Technische Auswahl und architektonische Entscheidungen vor dem Aufbau eines MCP Servers
1.1 Offizielle MCP Protokoll-Implementierung
Der Kern von MCP ist ein Messaging-Protokoll, das auf JSON-RPC 2.0 basiert. Offizielle SDKs (wie TypeScript und Python) kapseln Protokolldetails und bieten die folgenden Kernfunktionen:
- Nachrichten-Serialisierung/-Deserialisierung: Automatische Handhabung von JSON-RPC-Anfragen und -Antworten.
- Abstraktion der Transportschicht: Unterstützt zwei Standard-Transportmethoden: STDIO (Standard Input/Output) und SSE (Server-Sent Events) über HTTP.
- Server-Lebenszyklus-Management: Vereinfacht Server-Initialisierung, Tool-Registrierung und Startprozesse.
- Typsicherheit (insbesondere in TypeScript): Bietet Typ-Schnittstellen für Tool-Definitionen und Ressourcenbeschreibungen.
1.2 Kernarchitekturkomponenten eines MCP Servers
Das Verständnis der Komponenten eines MCP Servers ist grundlegend für Design und Implementierung:
- Tools: Ausführbare Operationen, die der Server dem MCP Client zur Verfügung stellt. Jedes Tool hat einen Namen, eine Beschreibung und ein stark typisiertes Eingabeparameter-Schema (JSON Schema). In unserem Beispiel zur Buchung eines Konferenzraums ist
book_conference_roomein Tool. - Ressourcen: Lesbare Dateneinheiten, die der MCP Server dem MCP Client zur Verfügung stellt. Jede Ressource hat einen Uniform Resource Identifier (URI), einen MIME-Typ und optionalen Textinhalt. Zum Beispiel kann ein
company-holiday-calendarals Ressource in den Kontext des LLM injiziert werden. - Prompts: Werden verwendet, um dem MCP Client vordefinierte Prompt-Vorlagen zur Verfügung zu stellen, um das LLM-Verhalten zu steuern. Ihre Wirksamkeit hängt davon ab, ob und wie der Client diese Funktion nutzt.
- Transport: Die Kommunikationsmethode zwischen dem MCP Server und dem MCP Client. Die MCP-Spezifikation definiert zwei:
- Stdio: Kommunikation über Standard-Input/Output. Geeignet für Szenarien, in denen der Server als Sub-Prozess des Clients gestartet wird; einfach bereitzustellen.
- HTTP mit Server-Sent Events (SSE): Basierend auf HTTP Server-Sent Events. Geeignet für Szenarien, in denen der Server als eigenständiger Netzwerkdienst läuft; unterstützt Fernverbindungen.
1.3 Auswahl der Programmiersprache (aus technischer Sicht)
Die Wahl hängt von den Teamfähigkeiten, Leistungsanforderungen und der Bereitstellungsumgebung ab.
Python:
- Vorteile: Florierendes Ökosystem (insbesondere in AI/ML), schnelle Entwicklungsgeschwindigkeit und ausgereiftes offizielles SDK. Ideal für schnelles Prototyping und die Anbindung an verschiedene Python-Bibliotheken (z. B. Datenanalyse, ML-Modelle).
- Parallelitätsmodell: Basiert auf
asynciofür asynchrone I/O, geeignet für I/O-intensive Operationen wie Netzwerkanfragen und Datenbankabfragen. Bei CPU-intensiven Aufgaben ist der Global Interpreter Lock (GIL) zu beachten. - Beste Anwendungsfälle: Schnelle Validierung, Data-Science-Tools, Teams, die mit Python vertraut sind.
Node.js (TypeScript):
- Vorteile: Hochleistungsfähige asynchrone, nicht-blockierende I/O, ausgereiftes offizielles SDK und geeignet für den Aufbau hochparalleler Netzwerkdienste. TypeScript bietet hervorragende Typsicherheit.
- Parallelitätsmodell: Ereignisgesteuert mit herausragender Fähigkeit, hochparallele Verbindungen auf einem einzigen Thread zu verarbeiten.
- Beste Anwendungsfälle: Szenarien, die eine große Anzahl gleichzeitiger Tool-Aufrufe oder eine tiefe Integration mit Frontend- oder Node.js-Backend-Diensten erfordern.
Go:
- Vorteile: Statische Kompilierung, einfache Bereitstellung, extrem hohe Parallelitätsleistung (Goroutinen) und hohe Speichereffizienz.
- Herausforderungen: Derzeit fehlt ein offizielles SDK (erfordert Community-Implementierung oder Eigenentwicklung), und das Ökosystem ist im KI-Bereich im Vergleich zu Python/Node etwas schwächer.
- Beste Anwendungsfälle: Produktionsumgebungen mit strengen Anforderungen an Leistung und Ressourcenverbrauch oder Unternehmen mit einem Go-basierten Technologie-Stack.
2. Umgebungsvorbereitung und MCP Entwicklungs-Toolchain
Wir werden ein "Konferenzraum-Buchungssystem" als Beispiel verwenden, um detailliert zu erklären, wie man einen MCP Server von Grund auf entwickelt, der debuggbar, deploybar und nachhaltig ist.
Der folgende Beispielcode wurde in einer lokalen Umgebung (Python 3.13.3, mcp Python SDK v1.25.0) unter Verwendung des HTTP SSE-Kommunikationsmodus vollständig verifiziert, um die Implementierung eines minimal funktionsfähigen MCP Servers zu demonstrieren.
2.1 Minimale lauffähige MCP Server-Umgebung
Am Beispiel von Python benötigen Sie:
Python 3.13.3+: Sicherstellen der Versionskompatibilität.
MCP Python SDK: Installation über pip.
pip install mcp pip install pydanticTexteditor oder IDE: Wie VS Code.
Terminal: Zum Starten und Testen des MCP Servers.
2.2 Offizielle MCP SDKs und Ökosystem-Tools
- Funktionsumfang des SDK: Die Python-SDK-Bibliothek
mcpstellt Kernklassen (wieServer,Tool) zum Erstellen von Servern, Definieren von Tools/Ressourcen und Behandeln von Anfragen bereit. - Unterstützende Tools:
- MCP Inspector: Ein grafisches Client-Tool zum Debuggen und Testen von MCP Servern. Sie können es verwenden, um sich mit Ihrem Server zu verbinden, alle Tools/Ressourcen aufzulisten und Tools manuell aufzurufen. Es ist ein unverzichtbares Werkzeug während der Entwicklungsphase.
- CLI Tools: Einige SDKs oder Community-Projekte bieten möglicherweise Gerüst-CLIs für die schnelle Projektinitialisierung.
2.3 Checkliste der wesentlichen Entwicklungswerkzeuge
- Logging: Integrieren Sie strukturiertes Logging in den Servercode, um Anfragen, Parameter und Fehler aufzuzeichnen – dies ist die Grundlage des Debuggings.
- Schema-Validierung: Nutzen Sie die Typ-Hinweise des SDK und die JSON Schema-Validierungsfunktionen, um sicherzustellen, dass Eingaben und Ausgaben den Erwartungen entsprechen.
- HTTP Server: Dieser Beispielcode basiert auf der HTTP SSE-Kommunikationsmethode und verwendet
uvicornals HTTP-Server.
3. Ihr erster MCP Server: Ein minimales, aber erweiterbares Beispiel
Wir werden ein book_conference_room Tool implementieren. Logik: Buchungsanfrage empfangen → Parameter prüfen → Datenbank (simuliert mit einem In-Memory-Dictionary) auf Verfügbarkeit zur angegebenen Zeit abfragen → Falls verfügbar, die gebuchte Raumnummer zurückgeben; falls nicht, die Fehlermeldung "No rooms available." zurückgeben.
3.1 Designprinzipien für die Definition von Tools und Ressourcen
Tool-Granularität:
- Ein Tool sollte eine logisch unabhängige und vollständige Operation abschließen.
book_conference_roomist ein gutes Beispiel: Eingabezeit, Ausgabe Buchungsergebnis. - Vermeiden Sie die Erstellung von "God Tools" (ein Tool, das alles macht). Vermeiden Sie auch eine übermäßige Aufteilung (z. B. wenn
check_room_availabilityundconfirm_bookingstark atomar sind, können sie zusammengehalten werden).
Grenzen zwischen Ressourcen und Tools:
- Ressourcen sind statische oder sich langsam ändernde Kontextinformationen, die das LLM lesen kann, wie z. B. Unternehmensrichtliniendokumente oder Produktkataloge.
- Tools sind dynamische Operationen mit Nebenwirkungen, wie z. B. Erstellen, Aktualisieren, Löschen oder Berechnen.
- In unserem Beispiel könnte das
Meeting Room User Manualeine Ressource sein, während die Buchungsoperation ein Tool sein muss.
Best Practices für die Kontextübertragung:
- Benutzeridentität, Sitzungstoken usw. sollten über den
Contextder MCP-Anfrage übergeben werden (sofern vom Client unterstützt). - Der Server sollte Identitätsinformationen im
Contextüberprüfen und in der Geschäftslogik verwenden. Zum Beispiel mussbook_conference_roomwissen, wer bucht; diese Information kann aus demContextabgerufen werden.
3.2 Design der Anfrage- und Antwortstruktur
Verwenden Sie die Tool-Klasse des Python SDK und Pydantic-Modelle, um stark typisierte Eingaben zu definieren.
Inhalt von "conference_room_server.py":
import asyncio
from datetime import datetime, timedelta
from typing import Any
from mcp.server import Server
from mcp.server.sse import SseServerTransport
from mcp.types import Tool, TextContent, CallToolResult
from pydantic import BaseModel, Field
from starlette.applications import Starlette
from starlette.routing import Route, Mount
from starlette.responses import Response
## 1. Define a Pydantic model for the input parameters.
class BookRoomInput(BaseModel):
start_time: datetime = Field(..., description="Meeting start time, format: YYYY-MM-DD HH:MM")
duration_hours: float = Field(..., gt=0, le=8, description="Meeting duration (hours), maximum 8 hours")
class RoomBookingSystem:
def __init__(self):
""" Simulate two meeting rooms, where the value is a list of already booked time slots."""
self.rooms = {"A101": [], "B202": []}
def is_room_available(self, room_id: str, start: datetime, duration_hours: float) -> bool:
"""Check if the specified meeting room is available during the given time period."""
end = start + timedelta(hours=duration_hours)
for b_start, b_end in self.rooms[room_id]:
if not (end <= b_start or start >= b_end): return False
return True
def book_room(self, room_id: str, start: datetime, duration_hours: float, booker: str) -> bool:
"""Attempt to book the meeting room and return whether it was successful."""
if self.is_room_available(room_id, start, duration_hours):
self.rooms[room_id].append((start, start + timedelta(hours=duration_hours)))
return True
return False
booking_system = RoomBookingSystem()
## --- 2. Create an MCP Server instance ---
server = Server("conference-room-booking")
3.3 Detaillierter Aufrufablauf des MCP Servers
Erstellen Sie nun den Server und implementieren Sie die Logik zur Handhabung des Tools.
## List of tools
@server.list_tools()
async def handle_list_tools() -> list[Tool]:
return [
Tool(
name="book_conference_room",
description="Book a meeting room for a specific time.",
inputSchema=BookRoomInput.model_json_schema()
)
]
## Meeting room booking logic
@server.call_tool()
async def handle_call_tool(name: str, arguments: dict[str, Any] | None) -> CallToolResult:
if name != "book_conference_room" or not arguments:
return CallToolResult(is_error=True, content=[TextContent(type="text", text="Parameter error")])
try:
input_data = BookRoomInput(**arguments)
booked = False
booked_room = None
for room_id in booking_system.rooms.keys():
if booking_system.book_room(room_id, input_data.start_time, input_data.duration_hours, "demo_user"):
booked, booked_room = True, room_id
break
res_text = f"Booking successful! Room {booked_room}" if booked else "Booking failed"
return CallToolResult(is_error=False, content=[TextContent(type="text", text=res_text)])
except Exception as e:
return CallToolResult(is_error=True, content=[TextContent(type="text", text=str(e))])
## --- 3. HTTP SSE Transport Layer Settings ---
## Create an SSE transport instance
sse = SseServerTransport("/messages")
async def handle_sse(request):
"""Handles client requests to establish an SSE connection."""
async with sse.connect_sse(
request.scope,
request.receive,
request._send
) as (read_stream, write_stream):
# Run MCP Server
await server.run(
read_stream,
write_stream,
server.create_initialization_options()
)
return Response()
## Define Starlette routes
app = Starlette(
routes=[
Route("/sse", endpoint=handle_sse),
Mount("/messages", app=sse.handle_post_message),
]
)
if __name__ == "__main__":
import uvicorn
# Start the service and listen on port 8000
print("MCP SSE Server running on http://127.0.0.1:8000/sse")
uvicorn.run(app, host="127.0.0.1", port=8000)
Analyse des Aufrufablaufs:
- Client → Server: Der Client (z. B. Claude Desktop, MCP Inspector) sendet eine
list_tools-Anfrage über HTTP SSE. Der Server gibt die Liste der Tools zurück. - Client-Entscheidung: Das LLM entscheidet,
book_conference_roomaufzurufen, basierend auf dem Befehl des Benutzers ("Hilf mir, einen Raum für 2 Stunden ab morgen 14 Uhr zu buchen"). - Tool-Ausführung: Der Client sendet eine
callTool-Anfrage mitnameundarguments. Der Server leitet sie an die Funktionhandle_call_toolweiter. - Interne Verarbeitung:
- Parameter-Validierung: Das Pydantic-Modell validiert automatisch das Format von
start_timeund den Bereich vonduration_hours. - Geschäftslogik: Iteriert durch simulierte Besprechungsräume, prüft die Verfügbarkeit und versucht zu buchen.
- Zustandsänderung: Eine erfolgreiche Buchung ändert den Zustand von
booking_system.rooms. - Logging: Gibt das Buchungsprotokoll aus.
- Parameter-Validierung: Das Pydantic-Modell validiert automatisch das Format von
- Rückgabe der Ergebnisse: Der Server kapselt das
CallToolResultin eine JSON-RPC-Antwort und sendet es an den Client zurück. - Kontext-Injektion: Wenn dieses Tool eine Benutzeridentität erfordert, sollte der Client das Identitätstoken im
context-Feld dercallTool-Anfrage mitführen. Diehandle_call_tool-Funktion des Servers sollte dieses Token aus dem Anfrageobjekt parsen und überprüfen (in diesem Beispiel auf einen festen Benutzer vereinfacht).
Ziel erreicht: Das Obige ist ein vollständiger, lauffähiger MCP Server MVP. Er verfügt über klare Eingabedefinitionen, Geschäftslogik, Fehlerbehandlung und Logging und bietet eine solide Grundlage für weitere Erweiterungen.
4. MCP Server Debugging- und Testmethoden
4.1 Lokaler Debugging-Workflow
- Startmethode: Führen Sie Ihr Python-Skript direkt mit
python conference_room_server.pyaus. Das Skript startet den HTTP SSE-Dienst und tritt in eine Ereignisschleife ein, die auf die Verbindung des MCP Clients wartet. - Verbindung mit MCP Inspector: Dies ist die effektivste Debugging-Methode.
- Anzeigen von
book_conference_roomim Tab „Tools“. - Anzeigen definierter Ressourcen (falls vorhanden) im Tab „Resources“.
- Aufrufen des Tools direkt im Tab „Session“, Parameter eingeben und Rückgabeergebnisse sowie server-seitige Logs beobachten.
- Anzeigen von
- Log-Beobachtungspunkte: Protokolle am Anfang, Ende und an den Fehlererfassungspunkten Ihres Tool-Handlers ausgeben. Beobachten Sie, ob Parameter korrekt geparst werden und ob die Geschäftslogik wie erwartet ausgeführt wird.
- Häufige Startfehlerursachen:
- Python Pfadfehler: MCP Inspector kann den Befehl
pythonnicht finden. - Fehlende Abhängigkeiten: Die Bibliotheken
mcpoderpydanticsind nicht installiert. - Skript-Syntaxfehler: Der Python-Interpreter meldet Fehler vor dem Start.
- Port-Konflikt (nur SSE-Modus): Der angegebene HTTP-Port ist bereits belegt.
- Python Pfadfehler: MCP Inspector kann den Befehl
4.2 Funktionstests durch Simulation eines MCP Clients
Neben dem Inspector können Sie einfache Testskripte schreiben, um das Client-Verhalten zu simulieren:
Inhalt von "test_client.py":
import asyncio
from mcp import ClientSession
from mcp.client.sse import sse_client
async def test_booking_http():
# 1. Define the SSE address of the server
server_url = "http://127.0.0.1:8000/sse"
print(f"Connecting to MCP SSE Server: {server_url}...")
try:
# 2. Use the standard sse_client to establish the transport layer.
async with sse_client(server_url) as (read_stream, write_stream):
# 3. Create a standard client session
# The session will automatically complete the initialize handshake and send the notifications/initialized notification.
async with ClientSession(read_stream, write_stream) as session:
# Initialize handshake
print("[1/3] Performing protocol handshake...")
await session.initialize()
print("The handshake was successful.!")
# 4. List all tools (corresponds to tools/list)
print("\n[2/3] Retrieving tool list...")
tools_result = await session.list_tools()
print(f"Available tools: {[tool.name for tool in tools_result.tools]}")
#5. Calling the pre-defined tools (corresponding to tools/call)
print("\n[3/3] Attempting to book the meeting room...")
arguments = {
"start_time": "2025-12-25 14:00",
"duration_hours": 2.0
}
# `#call_tool` is a standard SDK method that automatically handles response encapsulation.
result = await session.call_tool("book_conference_room", arguments)
# Parse the returned content.
for content in result.content:
if content.type == "text":
print(f"\n[Server response]: {content.text}")
except ConnectionRefusedError:
print("Error: Unable to connect to the server. Please ensure the server is running on port 8000.")
except Exception as e:
print(f"An error occurred during execution: {type(e).__name__}: {e}")
if __name__ == "__main__":
asyncio.run(test_booking_http())
Fehlerbehebung bei Schema-Validierungsfehlern: Wenn der Aufruf fehlschlägt, überprüfen Sie die Fehlermeldung, die vom Inspector oder Testskript zurückgegeben wird. Dies liegt normalerweise an Parameter-Tippfehlern, Typenkonflikten (z. B. Übergabe eines Strings, wo ein Integer erwartet wird) oder fehlenden Pflichtfeldern.
Fehlerbehebung bei Kontextverlust: Wenn die Tool-Logik vom Kontext abhängt, diesen aber nicht abrufen kann, überprüfen Sie:
- Ob der Client so konfiguriert ist, dass er den Kontext sendet.
- Ob der serverseitige Handler Kontextdaten korrekt aus dem Anfrageobjekt extrahiert.
4.3 Checkliste häufiger Fehler in der Entwicklungsphase
- Tool nicht auffindbar: Überprüfen Sie, ob die Methode
list_toolskorrekt registriert ist und die Tool-Definition zurückgibt. Stellen Sie sicher, dass alle Tools beim Serverstart erfolgreich geladen werden. - Timeout: Der Tool-Handler benötigt zu lange für die Ausführung. Optimieren Sie die Codelogik oder setzen Sie ein angemessenes Timeout auf Client-Seite. Für lang laufende Aufgaben sollten Sie asynchrone Benachrichtigungen oder Ergebnis-Polling-Mechanismen in Betracht ziehen.
- Parameter-Fehlübereinstimmung: Die vom Client gesendete Parameter-JSON-Struktur stimmt nicht mit dem
inputSchemades Tools überein. Verwenden Sie eine strenge Modellvalidierung (wie Pydantic) und geben Sie klare Hinweise in Fehlermeldungen.
5. Produktionsbereitstellungsmuster für MCP Server
Die Bereitstellung sollte sich auf die operativen Eigenschaften des MCP Servers als unabhängigen Prozess konzentrieren. Die Integration mit dem Agenten erfolgt normalerweise durch Ausführung als Sub-Prozess des Agenten (via Stdio) oder als unabhängiger Netzwerkdienst (via HTTP/SSE).
5.1 Zustandsloses Design und Sitzungszustandsverwaltung für MCP Server
Kernprinzip: Der MCP Server sollte so zustandslos wie möglich sein.
- Strategie zur Zustandsverwaltung: Jeder Zustand, der über mehrere Tool-Aufrufe hinweg bestehen bleiben muss (wie z. B. der Warenkorb eines Benutzers oder Zwischenergebnisse eines mehrstufigen Genehmigungsprozesses), sollte nicht im Serverprozessspeicher gespeichert werden. Stattdessen:
- Verwenden Sie den MCP
Context-Mechanismus, damit der Client den notwendigen Zustand in jeder Anfrage mitführt. - Speichern Sie ihn in externen persistenten Systemen wie Datenbanken, Redis oder Dateispeichern. Server-Tools können den Zustand durch Abfragen oder Aktualisieren dieser externen Systeme bearbeiten.
- Verwenden Sie den MCP
- Zusammenarbeit mit Agenten: Der Agent (Client) ist für die Aufrechterhaltung des Konversationszustands und der Benutzerabsicht verantwortlich. Der MCP Server antwortet nur auf atomare Tool-Aufrufe. Zum Beispiel ist die Buchung eines Besprechungsraums eine vom Server gewährleistete atomare Operation; jedoch sollte eine mehrstufige Planung wie "Einen passenden Zeitpunkt finden und für die Teambesprechung nächste Woche buchen" vom Agenten koordiniert werden.
5.2 Bereitstellungsvergleich: Lokal vs. Cloud vs. Containerisiert
- Lokale Bereitstellung: Server und Agent Client laufen auf derselben physischen oder virtuellen Maschine. Geeignet für Entwicklung, Tests oder kleine interne Anwendungen. Geringe Kosten, aber schlechte Skalierbarkeit und Verfügbarkeit.
- Containerisierte Bereitstellung (Empfohlen): Verpacken Sie den Server in einen Docker-Container. Dies bietet enorme Vorteile bei der Umgebungskonsistenz, der einfachen Skalierung (über Kubernetes) und der vereinfachten Abhängigkeitsverwaltung. Bevorzugt für Produktionsumgebungen.
- Serverlose Cloud-Bereitstellung: Stellen Sie den Server als Cloud-Funktion bereit (z. B. AWS Lambda, Google Cloud Functions). Geeignet für Szenarien mit seltenen Aufrufen oder sprunghaftem Datenverkehr. Beachten Sie jedoch die Kaltstartlatenz und Laufzeitbeschränkungen, die möglicherweise nicht für lang andauernde Aufgaben oder Szenarien geeignet sind, die persistente TCP-/SSE-Verbindungen erfordern.
5.3 Konfigurationsmanagement und Geheimnis-Sicherheit
Niemals Geheimnisse, Passwörter, API-Token oder Datenbank-Verbindungsstrings hart im Code codieren.
Umgebungsvariablen: Konfigurationen über Umgebungsvariablen injizieren. Verwenden Sie das
-e-Flag oder das Geheimnismanagement in Docker; verwenden Sie ConfigMaps und Secrets in Kubernetes.import os database_url = os.getenv('DATABASE_URL') api_key = os.getenv('EXTERNAL_API_KEY') if not database_url: raise ValueError("DATABASE_URL environment variable is not set")Geheimnismanagement: Verwenden Sie professionelle Dienste für das Geheimnismanagement wie HashiCorp Vault, AWS Secrets Manager oder Azure Key Vault. Die Anwendung sollte Schlüssel bei jedem Start dynamisch aus diesen Diensten abrufen.
Hot Configuration Updates: Für Konfigurationen, die dynamisch angepasst werden müssen (wie z. B. Ratenbegrenzungsschwellenwerte), speichern Sie diese in einer externen Datenbank oder einem Konfigurationszentrum (wie etcd oder ZooKeeper) und lassen Sie den Server auf Änderungen warten. Vermeiden Sie häufige Server-Neustarts.
6. Performance, Stabilität und Praktiken für hohe Parallelität
"Hohe Parallelität" in diesem Kapitel bezieht sich auf die gleichzeitigen Tool-Aufrufanfragen, die der MCP Server selbst verarbeiten kann. Ratenbegrenzung und Circuit Breaking sind Strategien, die vom Server implementiert werden, um sich selbst oder nachgeschaltete Systeme zu schützen.
6.1 Parallelitätsmodelle für MCP Tool-Aufrufe
Python (asyncio): Verwendet
async/awaitfür Coroutine-Parallelität. Während ein Tool-Handler auf eine Datenbankabfrage oder eine externe API-Antwort wartet (imawait-Zustand), kann die Ereignisschleife zur Verarbeitung einer anderen Tool-Anfrage wechseln. Dies ist ideal für I/O-intensive Operationen.Wichtig: Stellen Sie sicher, dass alle blockierenden I/O-Operationen asynchrone Bibliotheken verwenden (z. B.
asyncpgfür PostgreSQL,aiohttpfür HTTP-Anfragen).Node.js: Ähnliches ereignisschleifenbasiertes asynchrones Modell, das von Natur aus hohe I/O-Parallelität unterstützt.
Go: Jede Verbindung oder Anfrage wird typischerweise von einer unabhängigen Goroutine behandelt, die Multi-Core-Fähigkeiten nutzt und sowohl bei I/O- als auch bei CPU-intensiven Aufgaben hervorragende Leistungen erbringt.
I/O-intensive Optimierung:
- Verwenden Sie Verbindungspools zur Verwaltung von Datenbank- und externen Dienstverbindungen.
- Legen Sie angemessene Timeout- und Wiederholungsrichtlinien für externe HTTP-Anfragen fest.
- Erwägen Sie das Hinzufügen einer Caching-Schicht (wie Redis) für häufig gelesene Daten, die sich langsam ändern.
6.2 Design für Timeout, Wiederholung und Fehlergrenzen
- Timeout-Propagierung: Legen Sie ein Gesamt-Timeout für jeden Tool-Aufruf fest. Wenn ein Tool intern mehrere nachgeschaltete Dienste aufruft, sollten deren Timeouts kürzer sein als das Gesamt-Timeout des Tools, und nachgeschaltete Timeout-Ausnahmen sollten elegant behandelt werden.
- Die Risiken von Wiederholungen: Wiederholungsentscheidungen sollten vom Client (Agenten) getroffen werden, nicht automatisch innerhalb des Server-Tools. Dies liegt daran, dass:
- Ein Tool möglicherweise nicht idempotent ist (mehrere Ausführungen ergeben das gleiche Ergebnis). Zum Beispiel könnte eine Wiederholung von
book_conference_roomaufgrund eines Netzwerk-Timeouts zu doppelten Buchungen führen. - Der Client über einen vollständigeren Kontext (z. B. Benutzeranweisungen) verfügt und entscheiden kann, ob und wie er eine Wiederholung versucht.
- Der Server klare, verwertbare Informationen in Fehlerantworten bereitstellen sollte, um dem Client bei Entscheidungen zu helfen.
- Ein Tool möglicherweise nicht idempotent ist (mehrere Ausführungen ergeben das gleiche Ergebnis). Zum Beispiel könnte eine Wiederholung von
- Idempotenz-Anforderungen: Versuchen Sie, Tools mit Schreiboperationen als idempotent zu gestalten – zum Beispiel, indem der Client eine eindeutige Anfrage-ID bereitstellt, damit der Server doppelte Verarbeitung vermeiden kann.
6.3 Ratenbegrenzung, Circuit Breaking und Fallback-Strategien
- Tool-Level-Schutz:
- Ratenbegrenzung: Verwenden Sie Token-Bucket- oder Leaky-Bucket-Algorithmen, um Raten pro Tool oder pro Benutzer/API-Schlüssel zu begrenzen. Dies verhindert, dass ein einzelnes Tool übermäßig oft aufgerufen wird und den Server oder nachgeschaltete Dienste zum Absturz bringt.
- Circuit Breaking: Wenn ein nachgeschalteter Dienst (wie eine Datenbank oder externe API) über einen Schwellenwert hinaus wiederholt fehlschlägt, den „Schaltkreis“ für eine bestimmte Zeit direkt „auslösen“, um schnell zu scheitern, und dann versuchen, mithilfe einer halboffenen Zustandsprüfung wiederherzustellen. Bibliotheken wie
pybreaker(Python) können verwendet werden.
- Agenten-Level-Ratenbegrenzung: Implementieren Sie eine globale Ratenbegrenzung am Server-Einstiegspunkt für bestimmte Clients oder das gesamte Anfragevolumen.
- Fallback: Bieten Sie eingeschränkte Alternativen an, wenn Kerndienste nicht verfügbar sind. Wenn zum Beispiel der Echtzeit-Besprechungsraumabfragedienst ausgefallen ist, kann das
book_conference_roomTool auf eine statische Antwort wie "Dienst vorübergehend nicht verfügbar, bitte versuchen Sie es später erneut" zurückfallen, anstatt auf ein Timeout zu warten.
7. Sicherheitsdesign und Risikokontrolle
Die Sicherheitskontrolle konzentriert sich auf die Teile, die MCP Server-Entwickler implementieren müssen. Das MCP-Protokoll selbst bietet keine Authentifizierungs- oder Autorisierungsmechanismen; die gesamte Sicherheitsvalidierungslogik muss vom Client und Server auf der Anwendungsschicht implementiert werden.
7.1 Sicherheitsbedrohungsmodell für MCP Server
Spezifische Bedrohungsbeispiele:
- Unautorisierte Aufrufe: Ein Client mit nur "Abfrage"-Berechtigungen ruft erfolgreich ein "Löschen"-Tool auf, indem er eine Anfrage konstruiert. Oder ein Tool, das für den Zugriff auf "Abteilung A's Daten-API" autorisiert ist, wird von einem Client missbraucht, um auf "Abteilung B's Daten" zuzugreifen.
- Datenlecks: Ein Tool gibt versehentlich sensible Informationen in Fehlerantworten oder Protokollen zurück (z. B. Datenbankfehlerdetails, die Tabellenstrukturen oder SQL-Anweisungen enthalten).
- Kontextinjektionsrisiken: Blindes Vertrauen in Kontextdaten vom Client ohne Überprüfung bei Datenbankabfragen oder Befehlsausführung kann zu SQL-Injection oder Command-Injection führen.
7.2 Berechtigungs- und Zugriffsverwaltungspraktiken
Implementieren Sie ein "Drei-Schichten-Berechtigungsvalidierungsmodell":
- Transportschicht: Wer darf sich mit dem Server verbinden?
- Stdio: Typischerweise durch OS-Prozessberechtigungen kontrolliert; der Client benötigt die Berechtigung, den Server-Subprozess zu starten.
- SSE/HTTP: Verwenden Sie TLS (HTTPS) für verschlüsselte Kommunikation. Verwenden Sie Firewalls auf Netzwerkebene, API-Gateways oder verlangen Sie gültige Client-Zertifikate (mTLS), um Verbindungen einzuschränken.
- Tool-Aufrufschicht: Kann der aktuelle Benutzer/die aktuelle Identität dieses Tool aufrufen?
- Extrahieren Sie Identitätstoken (wie JWT) aus dem Anfrage-
Context. - Überprüfen Sie Token-Signaturen und -Ablauf.
- Basierend auf den Rollen oder Berechtigungsansprüchen im Token bestimmen Sie, ob der Aufruf des
book_conference_roomTools zulässig ist. Eine einfache "Rollen-Tool"-Zuordnungstabelle kann geführt werden.
- Extrahieren Sie Identitätstoken (wie JWT) aus dem Anfrage-
- Datenschicht: Kann diese Identität auf die Zielressource zugreifen?
- Führen Sie eine detaillierte Validierung innerhalb der Geschäftslogik von
book_conference_roomdurch. - Prüfen Sie zum Beispiel, selbst wenn der Benutzer das Buchungs-Tool aufrufen darf, ob er zur Abteilung gehört, die berechtigt ist, den Raum zu nutzen, oder ob seine Buchungsdauer das Limit überschreitet.
- Dies erfordert die Abfrage externer Benutzerverzeichnisse oder Berechtigungssysteme.
- Führen Sie eine detaillierte Validierung innerhalb der Geschäftslogik von
Prinzip der geringsten Privilegien: Jedes Tool sollte nur die minimalen Berechtigungen besitzen, die zur Erfüllung seiner Funktion erforderlich sind. Zum Beispiel sollte ein Abfrage-Tool nur Lesezugriffsrechte auf die Datenbank haben.
7.3 Strategien zur Reaktion auf Sicherheitsvorfälle
- Log-Forensik: Stellen Sie sicher, dass alle Authentifizierungs-, Autorisierungsentscheidungen, Tool-Aufrufe (einschließlich Parameter) und wichtigen Geschäftsoperationen strukturierte Logs haben, die zentral in einer sicheren Log-Plattform (z. B. ELK Stack, Splunk) gesammelt werden.
- Schnelle Tool-Deaktivierung: Wenn eine schwerwiegende Schwachstelle in einem Tool gefunden wird, sollten Sie die Möglichkeit haben, dieses Tool schnell über Konfigurationsschalter zu deaktivieren oder eine neue Version freizugeben, ohne den gesamten Server offline zu nehmen.
- Rollback-Strategie: Bei der Veröffentlichung einer neuen Serverversion sollten frühere Docker-Images oder Bereitstellungspakete bereitgehalten werden, um bei Sicherheits- oder Funktionsproblemen schnell ein Rollback durchführen zu können.
8. FAQ und Fehlerbehebungshandbuch
Diese Probleme sind typisch entweder auf der MCP-Protokollschicht oder der Server-Implementierungsschicht.
8.1 Checkliste für Startfehler des MCP Servers
| Phenomenon | Possible Cause | Checklist |
|---|---|---|
| Prozess beendet sich sofort | Python-Syntaxfehler, fehlende Abhängigkeiten | 1. Führen Sie python your_server.py direkt im Terminal aus, um die Fehlerausgabe zu sehen.2. Führen Sie pip list aus, um Abhängigkeiten zu prüfen. |
| MCP Inspector Verbindungsfehler | Falsche Transportmethode oder Pfadkonfiguration | 1. Bestätigen Sie, dass die im Inspector ausgewählte Transportmethode (Stdio/SSE) mit dem Servercode übereinstimmt.2. Bei Stdio bestätigen Sie, dass "Command" und "Arguments" auf den korrekten Python-Interpreter und Skriptpfad verweisen. |
Client meldet Tool not found |
Tool nicht korrekt registriert oder Namenskonflikt | 1. Prüfen Sie, ob der Rückgabewert der list_tools-Methode des Servercodes das Ziel-Tool enthält.2. Vergleichen Sie den name-String des Tools mit dem im Client-Aufruf verwendeten Namen (Groß- und Kleinschreibung beachten). |
8.2 Prozess zur Diagnose von Performance-Anomalien
- Lokalisierung langsamer Anfragen:
- Zeichnen Sie Zeitstempel am Anfang und Ende der Tool-Handler-Funktion auf.
- Verwenden Sie Performance-Analyse-Tools wie Python cProfile oder py-spy, um genau zu ermitteln, welche Funktion oder welcher externe Aufruf am längsten dauert.
- Analyse von Parallelitätsengpässen:
- Verwenden Sie Überwachungstools, um die CPU-, Speicher- und I/O-Auslastung des Systems bei zunehmenden gleichzeitigen Anfragen zu beobachten.
- Wenn die Datenbank der Engpass ist, überprüfen Sie die Slow Query Logs und optimieren Sie Indizes und Abfrageanweisungen.
- Prüfen Sie auf synchrone Blockieroperationen (z. B. die Verwendung eines nicht-asynchronen Datenbanktreibers), die die Ereignisschleife in einer asynchronen Umgebung blockieren könnten.
8.3 Überprüfung und Verbesserung von Produktionsvorfällen
Klassischer Fall: SQL-Injection
- Szenario: Ein
search_documentsTool empfängt vom Benutzer eingegebene Schlüsselwörter und verkettet diese direkt zu einem SQL-String für die Abfrage. - Angriff: Ein Benutzer gibt
”’; DROP TABLE documents; --”ein. - Konsequenz: Daten werden beschädigt oder geleakt.
- Grundursache: Die Tool-Implementierung hat die Eingabe nicht validiert oder keine parametrisierten Abfragen verwendet.
- Lehren & Verbesserungen:
- Alle Tool-Eingabeparameter müssen einer strengen Schema-Validierung unterzogen werden (z. B. durch Verwendung von Pydantic zur Begrenzung von Typ, Länge und Bereich).
- Verwenden Sie immer parametrisierte Abfragen (prepared statements) oder ein ORM, um auf Datenbanken zuzugreifen; verketten Sie niemals SQL-Strings.
- Geben Sie in Fehlerantworten generische, benutzerfreundliche Nachrichten zurück, um das Offenlegen von Details wie der Datenbankstruktur zu vermeiden.
- Machen Sie sichere Codierungsstandards und Code-Reviews zu obligatorischen Prozessen, wobei der Fokus auf allem Code liegt, der externe Systeminteraktionen beinhaltet.
9. Zusammenfassung: Wie man MCP Server in realen KI-Agenten-Systemen einsetzt
- Die Position von MCP Servern in der Agentenarchitektur: Er dient als standardisierte und sichere Verbindungsbrücke zwischen dem KI-Agenten (dem Gehirn/Koordinator) und seinen "Händen" (Tools) und "Augen" (Datenquellen). Agenten entdecken und nutzen die vom Server über das MCP-Protokoll bereitgestellten Funktionen dynamisch.
- Entwicklungspfad vom MVP zur Produktion:
- Phase Eins (MVP): Ein einzelner MCP Server mit einigen Kern-Tools (z. B.
book_room,query_calendar), der über Stdio auf derselben Entwicklungsmaschine wie der Agent (z. B. Claude Desktop) läuft. Schnelle Validierung von Ideen. - Phase Zwei (Entwicklung): Aufteilung in mehrere MCP Server mit jeweils einer einzigen Verantwortung, basierend auf funktionalen Domänen. Zum Beispiel:
calendar-server: Verwaltet Kalender und Ereignisse.conference-server: Verwaltet Räume und Ausstattung.user-directory-server: Bietet Abfragen von Mitarbeiterinformationen. Der Agent kann sich gleichzeitig mit mehreren Servern verbinden, um deren Funktionen für komplexe Aufgaben zu kombinieren.
- Phase Drei (Plattformisierung): Einführung von Dienstregistrierungs- und Erkennungsmechanismen (z. B. Consul, etcd). MCP Server registrieren ihre bereitgestellten Tools beim Start im Register. Agenten entdecken dynamisch verfügbare Server und stellen Verbindungen vom Register her. Zusätzlich werden Health Checks, Lastausgleich und eine einheitliche Überwachung/Alarmierung hinzugefügt.
- Phase Eins (MVP): Ein einzelner MCP Server mit einigen Kern-Tools (z. B.
- Nächste Schritte zur Erkundung:
- Vertiefen Sie Ihre Nutzung erweiterter Funktionen in Debugging-Tools wie dem MCP Inspector .
- Erkunden Sie, wie MCP Server in gängige Agenten-Frameworks (wie LangChain oder LlamaIndex) integriert werden können, die native Unterstützung für MCP hinzufügen.
- Erforschen Sie komplexere Muster, wie z. B. den Server, der Ressourcen-Updates aktiv an den Client pusht (Änderungsbenachrichtigungen für Ressourcen).
- Verfolgen Sie Updates des Offiziellen Model Context Protocol und der SDKs, um neue Protokollfunktionen und Best Practices zeitnah zu übernehmen.
Durch diesen Leitfaden haben Sie das Kernwissen und die praktischen Fähigkeiten für den Aufbau eines robusten, sicheren und skalierbaren MCP Servers erworben. Es ist nun an der Zeit, Ihre internen Systeme sicher mit der Welt der KI-Agenten zu verbinden.
MCP-Artikelserie:
- Umfassende Analyse des MCP-Servers: Die Drehscheibe für Kontext und Tool-Kommunikation im Zeitalter der KI-Agenten
- Welche Kernprobleme löst der MCP-Server? Warum AI-Agents ihn brauchen
- MCP Server Architektur und Funktionsweise: Vom Protokoll zum Ausführungsfluss
- MCP Server Praxisleitfaden: Aufbau, Test und Bereitstellung von 0 auf 1
- MCP Server: Bewertung von Anwendungsszenarien und Leitfaden zur Technischen Auswahl
Über den Autor
Dieser Inhalt wird vom Redaktionsteam von NavGood zusammengestellt und veröffentlicht.
NavGood ist eine Navigations- und Content-Plattform, die sich auf KI-Tools und das KI-Anwendungsökosystem konzentriert und die Entwicklung und praktische Implementierung von KI-Agenten, automatisierten Workflows und generativer KI verfolgt.
Haftungsausschluss: Dieser Artikel spiegelt das persönliche Verständnis und die praktische Erfahrung des Autors wider. Er repräsentiert nicht die offizielle Position eines Frameworks, einer Organisation oder eines Unternehmens und stellt keine kommerzielle, finanzielle oder Investitionsberatung dar. Alle Informationen basieren auf öffentlichen Quellen und der unabhängigen Recherche des Autors.
Referenzen:
[1]: https://github.com/modelcontextprotocol/inspector "MCP Inspector"
[2]: https://modelcontextprotocol.io/docs/getting-started/intro "What is the Model Context Protocol (MCP)?"
[3]: https://platform.openai.com/docs/guides/function-calling "Function calling"
[4]: https://docs.python.org/3/library/profile.html "The Python Profilers"
[5]: https://github.com/benfred/py-spy "Sampling profiler for Python programs"
[6]: https://github.com/modelcontextprotocol/python-sdk "The official Python SDK for MCP servers and clients"
[7]: https://github.com/modelcontextprotocol/typescript-sdk "The official TypeScript SDK for MCP servers and clients"
[8]: https://json-rpc.org/specification "JSON-RPC 2.0 Specification"
[9]: https://etcd.io/ "A distributed, reliable key-value store for the most critical data of a distributed system"
[10]: https://zookeeper.apache.org/ "What is ZooKeeper?"
[11]: https://aws.amazon.com/cn/secrets-manager/ "AWS Secrets Manager"
[12]: https://developer.hashicorp.com/vault "Manage Secrets & Protect Sensitive Data"
[13]: https://azure.microsoft.com/en-us/products/key-vault "Azure Key Vault"