Dieses Kapitel zeigt, wie man einen praxisnahen KI-Agenten entwickelt, der externe APIs integriert, verschiedene Datentypen verarbeitet, Fehler handhabt und mehrere Tools orchestriert – alles in einem produktionsreifen Format. Du wirst sehen:
- Integration externer APIs mit Authentifizierung
- Umgang mit unterschiedlichen Datentypen von mehreren Endpunkten
- Robuste Fehlerbehandlung und Protokollierungsstrategien
- Multi-Tool-Orchestrierung in einem einzigen Server
Am Ende hast du praktische Erfahrung mit Mustern und Best Practices, die für fortgeschrittene KI- und LLM-basierte Anwendungen unerlässlich sind.
In dieser Lektion lernst du, wie man einen fortgeschrittenen MCP-Server und -Client baut, der LLM-Fähigkeiten mit Echtzeit-Webdaten über SerpAPI erweitert. Diese Fähigkeit ist entscheidend, um dynamische KI-Agenten zu entwickeln, die auf aktuelle Informationen aus dem Web zugreifen können.
Am Ende dieser Lektion wirst du in der Lage sein:
- Externe APIs (wie SerpAPI) sicher in einen MCP-Server zu integrieren
- Mehrere Tools für Web-, Nachrichten-, Produktsuche und Q&A zu implementieren
- Strukturierte Daten für die Nutzung durch LLMs zu parsen und zu formatieren
- Fehler zu behandeln und API-Rate-Limits effektiv zu managen
- Sowohl automatisierte als auch interaktive MCP-Clients zu bauen und zu testen
Dieser Abschnitt stellt die Architektur und Funktionen des Web Search MCP Servers vor. Du siehst, wie FastMCP und SerpAPI zusammenarbeiten, um LLM-Fähigkeiten mit Echtzeit-Webdaten zu erweitern.
Diese Implementierung umfasst vier Tools, die die Fähigkeit von MCP demonstrieren, vielfältige, externe API-gesteuerte Aufgaben sicher und effizient zu bewältigen:
- general_search: Für allgemeine Web-Ergebnisse
- news_search: Für aktuelle Schlagzeilen
- product_search: Für E-Commerce-Daten
- qna: Für Frage-Antwort-Snippets
- Code-Beispiele: Enthält sprachspezifische Codeblöcke für Python (und leicht auf andere Sprachen erweiterbar) mit Code-Pivots zur besseren Übersicht
# Example usage of the general_search tool
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
async def run_search():
server_params = StdioServerParameters(
command="python",
args=["server.py"],
)
async with stdio_client(server_params) as (reader, writer):
async with ClientSession(reader, writer) as session:
await session.initialize()
result = await session.call_tool("general_search", arguments={"query": "open source LLMs"})
print(result)Bevor du den Client startest, ist es hilfreich zu verstehen, was der Server macht. Die Datei server.py implementiert den MCP-Server, der Tools für Web-, Nachrichten-, Produktsuche und Q&A bereitstellt, indem er SerpAPI integriert. Er verarbeitet eingehende Anfragen, verwaltet API-Aufrufe, parst Antworten und liefert strukturierte Ergebnisse an den Client zurück.
Die vollständige Implementierung kannst du in server.py nachlesen.
Hier ein kurzes Beispiel, wie der Server ein Tool definiert und registriert:
# server.py (excerpt)
from mcp.server import MCPServer, Tool
async def general_search(query: str):
# ...implementation...
server = MCPServer()
server.add_tool(Tool("general_search", general_search))
if __name__ == "__main__":
server.run()- Integration externer APIs: Zeigt den sicheren Umgang mit API-Schlüsseln und externen Anfragen
- Strukturierte Datenverarbeitung: Veranschaulicht, wie API-Antworten in LLM-freundliche Formate umgewandelt werden
- Fehlerbehandlung: Robuste Fehlerbehandlung mit passender Protokollierung
- Interaktiver Client: Beinhaltet automatisierte Tests und einen interaktiven Modus zum Testen
- Kontextmanagement: Nutzt MCP Context für Logging und Nachverfolgung von Anfragen
Bevor du beginnst, stelle sicher, dass deine Umgebung richtig eingerichtet ist, indem du diese Schritte befolgst. So sind alle Abhängigkeiten installiert und deine API-Schlüssel korrekt konfiguriert für eine reibungslose Entwicklung und Tests.
- Python 3.8 oder höher
- SerpAPI API-Schlüssel (Registrierung unter SerpAPI – kostenlose Stufe verfügbar)
Um loszulegen, folge diesen Schritten zur Einrichtung deiner Umgebung:
- Installiere die Abhängigkeiten mit uv (empfohlen) oder pip:
# Using uv (recommended)
uv pip install -r requirements.txt
# Using pip
pip install -r requirements.txt- Erstelle eine
.env-Datei im Projektstammverzeichnis mit deinem SerpAPI-Schlüssel:
SERPAPI_KEY=your_serpapi_key_here
Der Web Search MCP Server ist die zentrale Komponente, die Tools für Web-, Nachrichten-, Produktsuche und Q&A bereitstellt, indem er SerpAPI integriert. Er verarbeitet eingehende Anfragen, verwaltet API-Aufrufe, parst Antworten und liefert strukturierte Ergebnisse an den Client zurück.
Die vollständige Implementierung findest du in server.py.
Um den MCP-Server zu starten, verwende folgenden Befehl:
python server.pyDer Server läuft dann als stdio-basierter MCP-Server, mit dem sich der Client direkt verbinden kann.
Der Client (client.py) unterstützt zwei Modi zur Interaktion mit dem MCP-Server:
- Normalmodus: Führt automatisierte Tests aus, die alle Tools durchlaufen und deren Antworten überprüfen. Nützlich, um schnell zu prüfen, ob Server und Tools wie erwartet funktionieren.
- Interaktiver Modus: Startet eine menügesteuerte Oberfläche, in der du Tools manuell auswählen, eigene Anfragen eingeben und Ergebnisse in Echtzeit sehen kannst. Ideal, um die Fähigkeiten des Servers zu erkunden und mit verschiedenen Eingaben zu experimentieren.
Die vollständige Implementierung findest du in client.py.
Um die automatisierten Tests auszuführen (dies startet den Server automatisch):
python client.pyOder im interaktiven Modus starten:
python client.py --interactiveEs gibt mehrere Möglichkeiten, die vom Server bereitgestellten Tools zu testen und zu nutzen, je nach Bedarf und Arbeitsweise.
Du kannst auch eigene Testskripte mit dem MCP Python SDK erstellen:
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
async def test_custom_query():
server_params = StdioServerParameters(
command="python",
args=["server.py"],
)
async with stdio_client(server_params) as (reader, writer):
async with ClientSession(reader, writer) as session:
await session.initialize()
# Call tools with your custom parameters
result = await session.call_tool("general_search",
arguments={"query": "your custom query"})
# Process the resultIn diesem Zusammenhang bedeutet ein „Testskript“ ein eigenes Python-Programm, das du schreibst, um als Client für den MCP-Server zu fungieren. Statt ein formaler Unit-Test zu sein, erlaubt dir dieses Skript, programmatisch eine Verbindung zum Server herzustellen, beliebige Tools mit selbst gewählten Parametern aufzurufen und die Ergebnisse zu prüfen. Diese Methode ist nützlich für:
- Prototyping und Experimentieren mit Tool-Aufrufen
- Validierung der Serverreaktionen auf verschiedene Eingaben
- Automatisierung wiederholter Tool-Aufrufe
- Aufbau eigener Workflows oder Integrationen auf Basis des MCP-Servers
Mit Testskripten kannst du schnell neue Anfragen ausprobieren, das Verhalten der Tools debuggen oder als Ausgangspunkt für komplexere Automatisierungen nutzen. Unten findest du ein Beispiel, wie du mit dem MCP Python SDK ein solches Skript erstellst:
Die folgenden Tools, die vom Server bereitgestellt werden, kannst du für verschiedene Such- und Abfragearten verwenden. Jedes Tool wird mit seinen Parametern und Beispielanwendungen beschrieben.
Dieser Abschnitt liefert Details zu jedem verfügbaren Tool und dessen Parametern.
Führt eine allgemeine Websuche durch und liefert formatierte Ergebnisse zurück.
So rufst du dieses Tool auf:
Du kannst general_search aus deinem eigenen Skript mit dem MCP Python SDK aufrufen oder interaktiv über den Inspector oder den interaktiven Client-Modus. Hier ein Codebeispiel mit dem SDK:
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
async def run_general_search():
server_params = StdioServerParameters(
command="python",
args=["server.py"],
)
async with stdio_client(server_params) as (reader, writer):
async with ClientSession(reader, writer) as session:
await session.initialize()
result = await session.call_tool("general_search", arguments={"query": "latest AI trends"})
print(result)Alternativ kannst du im interaktiven Modus general_search im Menü auswählen und deine Suchanfrage eingeben, wenn du dazu aufgefordert wirst.
Parameter:
query(string): Die Suchanfrage
Beispielanfrage:
{
"query": "latest AI trends"
}Sucht nach aktuellen Nachrichtenartikeln zu einer Anfrage.
So rufst du dieses Tool auf:
Du kannst news_search aus deinem eigenen Skript mit dem MCP Python SDK aufrufen oder interaktiv über den Inspector oder den interaktiven Client-Modus. Hier ein Codebeispiel mit dem SDK:
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
async def run_news_search():
server_params = StdioServerParameters(
command="python",
args=["server.py"],
)
async with stdio_client(server_params) as (reader, writer):
async with ClientSession(reader, writer) as session:
await session.initialize()
result = await session.call_tool("news_search", arguments={"query": "AI policy updates"})
print(result)Alternativ kannst du im interaktiven Modus news_search im Menü auswählen und deine Suchanfrage eingeben, wenn du dazu aufgefordert wirst.
Parameter:
query(string): Die Suchanfrage
Beispielanfrage:
{
"query": "AI policy updates"
}Sucht nach Produkten, die zu einer Anfrage passen.
So rufst du dieses Tool auf:
Du kannst product_search aus deinem eigenen Skript mit dem MCP Python SDK aufrufen oder interaktiv über den Inspector oder den interaktiven Client-Modus. Hier ein Codebeispiel mit dem SDK:
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
async def run_product_search():
server_params = StdioServerParameters(
command="python",
args=["server.py"],
)
async with stdio_client(server_params) as (reader, writer):
async with ClientSession(reader, writer) as session:
await session.initialize()
result = await session.call_tool("product_search", arguments={"query": "best AI gadgets 2025"})
print(result)Alternativ kannst du im interaktiven Modus product_search im Menü auswählen und deine Suchanfrage eingeben, wenn du dazu aufgefordert wirst.
Parameter:
query(string): Die Produktsuchanfrage
Beispielanfrage:
{
"query": "best AI gadgets 2025"
}Gibt direkte Antworten auf Fragen aus Suchmaschinen zurück.
So rufst du dieses Tool auf:
Du kannst qna aus deinem eigenen Skript mit dem MCP Python SDK aufrufen oder interaktiv über den Inspector oder den interaktiven Client-Modus. Hier ein Codebeispiel mit dem SDK:
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
async def run_qna():
server_params = StdioServerParameters(
command="python",
args=["server.py"],
)
async with stdio_client(server_params) as (reader, writer):
async with ClientSession(reader, writer) as session:
await session.initialize()
result = await session.call_tool("qna", arguments={"question": "what is artificial intelligence"})
print(result)Alternativ kannst du im interaktiven Modus qna im Menü auswählen und deine Frage eingeben, wenn du dazu aufgefordert wirst.
Parameter:
question(string): Die Frage, auf die eine Antwort gefunden werden soll
Beispielanfrage:
{
"question": "what is artificial intelligence"
}Dieser Abschnitt liefert Codeausschnitte und Verweise zu den Server- und Client-Implementierungen.
Siehe server.py und client.py für die vollständigen Implementierungsdetails.
# Example snippet from server.py:
import os
import httpx
# ...existing code...Bevor du mit dem Bau beginnst, hier einige wichtige fortgeschrittene Konzepte, die im Verlauf dieses Kapitels immer wieder auftauchen. Ihr Verständnis hilft dir, besser folgen zu können, auch wenn du mit ihnen noch nicht vertraut bist:
- Multi-Tool-Orchestrierung: Bedeutet, dass mehrere verschiedene Tools (wie Websuche, Nachrichtensuche, Produktsuche und Q&A) innerhalb eines einzigen MCP-Servers laufen. So kann dein Server eine Vielzahl von Aufgaben erledigen, nicht nur eine.
- Umgang mit API-Rate-Limits: Viele externe APIs (wie SerpAPI) begrenzen, wie viele Anfragen du in einer bestimmten Zeit stellen kannst. Gute Programme prüfen diese Limits und gehen damit geschickt um, damit deine App nicht abstürzt, wenn du das Limit erreichst.
- Strukturierte Datenverarbeitung: API-Antworten sind oft komplex und verschachtelt. Dieses Konzept beschreibt, wie man diese Antworten in saubere, leicht nutzbare Formate umwandelt, die für LLMs oder andere Programme geeignet sind.
- Fehlerbehebung und -wiederherstellung: Manchmal läuft etwas schief – vielleicht fällt das Netzwerk aus oder die API liefert unerwartete Daten. Fehlerbehebung bedeutet, dass dein Code solche Probleme abfangen kann und trotzdem nützliche Rückmeldungen gibt, statt abzustürzen.
- Parameter-Validierung: Dabei wird geprüft, ob alle Eingaben für deine Tools korrekt und sicher sind. Das umfasst das Setzen von Standardwerten und die Sicherstellung der richtigen Datentypen, was Fehler und Verwirrung vorbeugt.
Dieser Abschnitt hilft dir, häufige Probleme zu erkennen und zu lösen, die beim Arbeiten mit dem Web Search MCP Server auftreten können. Wenn du auf Fehler oder unerwartetes Verhalten stößt, findest du hier Lösungen für die gängigsten Probleme. Schau dir diese Tipps zuerst an – oft lassen sich Probleme so schnell beheben.
Beim Arbeiten mit dem Web Search MCP Server können gelegentlich Probleme auftreten – das ist normal bei der Entwicklung mit externen APIs und neuen Tools. Dieser Abschnitt bietet praktische Lösungen für die häufigsten Probleme, damit du schnell wieder weiterarbeiten kannst. Wenn du auf einen Fehler stößt, beginne hier: Die folgenden Tipps behandeln die Probleme, die die meisten Nutzer haben, und lösen dein Problem oft ohne weitere Hilfe.
Hier sind einige der häufigsten Probleme, auf die Nutzer stoßen, mit klaren Erklärungen und Lösungsschritten:
-
Fehlender SERPAPI_KEY in der .env-Datei
- Wenn du den Fehler
SERPAPI_KEY environment variable not foundsiehst, bedeutet das, dass deine Anwendung den API-Schlüssel für SerpAPI nicht findet. Erstelle eine Datei namens.envim Projektstammverzeichnis (falls noch nicht vorhanden) und füge eine Zeile wieSERPAPI_KEY=dein_serpapi_schluesselhinzu. Ersetzedein_serpapi_schluesseldurch deinen tatsächlichen Schlüssel von der SerpAPI-Webseite.
- Wenn du den Fehler
-
Modul nicht gefunden Fehler
- Fehler wie
ModuleNotFoundError: No module named 'httpx'zeigen an, dass ein benötigtes Python-Paket fehlt. Das passiert meist, wenn du nicht alle Abhängigkeiten installiert hast. Führepip install -r requirements.txtim Terminal aus, um alle benötigten Pakete zu installieren.
- Fehler wie
-
Verbindungsprobleme
- Wenn du einen Fehler wie
Error during client executionbekommst, kann das bedeuten, dass der Client keine Verbindung zum Server herstellen kann oder der Server nicht wie erwartet läuft. Überprüfe, ob Client und Server kompatible Versionen sind und observer.pyim richtigen Verzeichnis vorhanden und gestartet ist. Ein Neustart von Server und Client kann ebenfalls helfen.
- Wenn du einen Fehler wie
-
SerpAPI-Fehler
- Die Meldung
Search API returned error status: 401bedeutet, dass dein SerpAPI-Schlüssel fehlt, falsch oder abgelaufen ist. Prüfe dein SerpAPI-Dashboard, verifiziere deinen Schlüssel und aktualisiere gegebenenfalls die.env-Datei. Wenn der Schlüssel korrekt ist, aber der Fehler weiterhin auftritt, überprüfe, ob dein kostenloses Kontingent aufgebraucht ist.
- Die Meldung
Standardmäßig protokolliert die App nur wichtige Informationen. Wenn du mehr Details sehen möchtest (z. B. zur Diagnose schwieriger Probleme), kannst du den DEBUG-Modus aktivieren. Dann werden viel mehr Informationen zu jedem Schritt angezeigt.
Beispiel: Normale Ausgabe
2025-06-01 10:15:23,456 - __main__ - INFO - Calling general_search with params: {'query': 'open source LLMs'}
2025-06-01 10:15:24,123 - __main__ - INFO - Successfully called general_search
GENERAL_SEARCH RESULTS:
... (search results here) ...
Beispiel: DEBUG-Ausgabe
2025-06-01 10:15:23,456 - __main__ - INFO - Calling general_search with params: {'query': 'open source LLMs'}
2025-06-01 10:15:23,457 - httpx - DEBUG - HTTP Request: GET https://serpapi.com/search ...
2025-06-01 10:15:23,458 - httpx - DEBUG - HTTP Response: 200 OK ...
2025-06-01 10:15:24,123 - __main__ - INFO - Successfully called general_search
GENERAL_SEARCH RESULTS:
... (search results here) ...
Beachte, dass der DEBUG-Modus zusätzliche Zeilen zu HTTP-Anfragen, Antworten und anderen internen Details enthält. Das ist sehr hilfreich bei der Fehlersuche.
Um den DEBUG-Modus zu aktivieren, setzen Sie das Protokollierungslevel oben in Ihrer client.py oder server.py auf DEBUG:
# At the top of your client.py or server.py
import logging
logging.basicConfig(
level=logging.DEBUG, # Change from INFO to DEBUG
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s"
)Haftungsausschluss:
Dieses Dokument wurde mit dem KI-Übersetzungsdienst Co-op Translator übersetzt. Obwohl wir uns um Genauigkeit bemühen, beachten Sie bitte, dass automatisierte Übersetzungen Fehler oder Ungenauigkeiten enthalten können. Das Originaldokument in seiner Ursprungssprache gilt als maßgebliche Quelle. Für wichtige Informationen wird eine professionelle menschliche Übersetzung empfohlen. Wir übernehmen keine Haftung für Missverständnisse oder Fehlinterpretationen, die aus der Nutzung dieser Übersetzung entstehen.