Dit hoofdstuk laat zien hoe je een realistische AI-agent bouwt die integreert met externe API's, verschillende datatypes verwerkt, fouten afhandelt en meerdere tools orkestreert—alles in een productieklare opzet. Je leert:
- Integratie met externe API's die authenticatie vereisen
- Omgaan met diverse datatypes van meerdere eindpunten
- Robuuste foutafhandeling en logstrategieën
- Multi-tool orkestratie in één server
Aan het einde heb je praktische ervaring met patronen en best practices die essentieel zijn voor geavanceerde AI- en LLM-gestuurde toepassingen.
In deze les leer je hoe je een geavanceerde MCP-server en client bouwt die LLM-mogelijkheden uitbreidt met realtime webdata via SerpAPI. Dit is een cruciale vaardigheid voor het ontwikkelen van dynamische AI-agenten die toegang hebben tot actuele informatie van het web.
Aan het einde van deze les kun je:
- Externe API's (zoals SerpAPI) veilig integreren in een MCP-server
- Meerdere tools implementeren voor web-, nieuws-, productzoekopdrachten en Q&A
- Gestructureerde data parsen en formatteren voor LLM-gebruik
- Fouten afhandelen en API-rate limits effectief beheren
- Zowel geautomatiseerde als interactieve MCP-clients bouwen en testen
In dit gedeelte wordt de architectuur en functionaliteit van de Web Search MCP Server geïntroduceerd. Je ziet hoe FastMCP en SerpAPI samen worden gebruikt om LLM-mogelijkheden uit te breiden met realtime webdata.
Deze implementatie bevat vier tools die laten zien hoe MCP diverse, externe API-gedreven taken veilig en efficiënt kan afhandelen:
- general_search: Voor brede webresultaten
- news_search: Voor recente nieuwsberichten
- product_search: Voor e-commerce data
- qna: Voor vraag-en-antwoordfragmenten
- Codevoorbeelden: Bevat taalspecifieke codeblokken voor Python (en eenvoudig uitbreidbaar naar andere talen) met codepivots voor duidelijkheid
# 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)Voordat je de client start, is het handig om te begrijpen wat de server doet. Het bestand server.py implementeert de MCP-server en biedt tools voor web-, nieuws-, productzoekopdrachten en Q&A door integratie met SerpAPI. Het verwerkt binnenkomende verzoeken, beheert API-aanroepen, parseert antwoorden en retourneert gestructureerde resultaten aan de client.
Je kunt de volledige implementatie bekijken in server.py.
Hier is een kort voorbeeld van hoe de server een tool definieert en registreert:
# 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()- Integratie met externe API's: Laat zien hoe API-sleutels en externe verzoeken veilig worden afgehandeld
- Gestructureerde data parsing: Toont hoe API-antwoorden worden omgezet naar LLM-vriendelijke formaten
- Foutafhandeling: Robuuste foutafhandeling met passende logging
- Interactieve client: Bevat zowel geautomatiseerde tests als een interactieve modus voor testen
- Contextbeheer: Maakt gebruik van MCP Context voor logging en het volgen van verzoeken
Voordat je begint, zorg dat je omgeving correct is ingesteld door deze stappen te volgen. Dit zorgt ervoor dat alle afhankelijkheden zijn geïnstalleerd en je API-sleutels correct zijn geconfigureerd voor een soepele ontwikkeling en testing.
- Python 3.8 of hoger
- SerpAPI API-sleutel (Meld je aan op SerpAPI - gratis tier beschikbaar)
Volg deze stappen om je omgeving op te zetten:
- Installeer afhankelijkheden met uv (aanbevolen) of pip:
# Using uv (recommended)
uv pip install -r requirements.txt
# Using pip
pip install -r requirements.txt- Maak een
.env-bestand aan in de projectroot met je SerpAPI-sleutel:
SERPAPI_KEY=your_serpapi_key_here
De Web Search MCP Server is het kernonderdeel dat tools aanbiedt voor web-, nieuws-, productzoekopdrachten en Q&A door integratie met SerpAPI. Het verwerkt binnenkomende verzoeken, beheert API-aanroepen, parseert antwoorden en retourneert gestructureerde resultaten aan de client.
Je kunt de volledige implementatie bekijken in server.py.
Om de MCP-server te starten, gebruik je het volgende commando:
python server.pyDe server draait dan als een stdio-gebaseerde MCP-server waar de client direct verbinding mee kan maken.
De client (client.py) ondersteunt twee modi om met de MCP-server te communiceren:
- Normale modus: Voert geautomatiseerde tests uit die alle tools aanroepen en hun antwoorden verifiëren. Dit is handig om snel te controleren of de server en tools naar behoren werken.
- Interactieve modus: Start een menu-gestuurde interface waarin je handmatig tools kunt selecteren en aanroepen, eigen zoekopdrachten kunt invoeren en resultaten realtime kunt bekijken. Ideaal om de mogelijkheden van de server te verkennen en te experimenteren met verschillende invoer.
Je kunt de volledige implementatie bekijken in client.py.
Om de geautomatiseerde tests uit te voeren (dit start automatisch de server):
python client.pyOf start in interactieve modus:
python client.py --interactiveEr zijn meerdere manieren om de tools van de server te testen en ermee te werken, afhankelijk van je behoeften en workflow.
Je kunt ook je eigen test-scripts bouwen met de MCP Python SDK:
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 deze context betekent een "test-script" een eigen Python-programma dat je schrijft om als client voor de MCP-server te fungeren. In plaats van een formele unittest, laat dit script je programmatisch verbinding maken met de server, een van de tools aanroepen met parameters naar keuze en de resultaten inspecteren. Deze aanpak is handig voor:
- Prototypen en experimenteren met tool-aanroepen
- Valideren hoe de server reageert op verschillende invoer
- Automatiseren van herhaalde tool-aanroepen
- Eigen workflows of integraties bouwen bovenop de MCP-server
Je kunt test-scripts gebruiken om snel nieuwe zoekopdrachten uit te proberen, toolgedrag te debuggen of als startpunt voor geavanceerdere automatisering. Hieronder een voorbeeld van hoe je de MCP Python SDK gebruikt om zo’n script te maken:
Je kunt de volgende tools gebruiken die de server aanbiedt om verschillende soorten zoekopdrachten en queries uit te voeren. Elke tool wordt hieronder beschreven met zijn parameters en voorbeeldgebruik.
Deze sectie geeft details over elke beschikbare tool en hun parameters.
Voert een algemene webzoekopdracht uit en retourneert geformatteerde resultaten.
Hoe deze tool aan te roepen:
Je kunt general_search aanroepen vanuit je eigen script met de MCP Python SDK, of interactief via de Inspector of de interactieve clientmodus. Hier is een codevoorbeeld met de 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)Of in interactieve modus, selecteer general_search in het menu en voer je zoekopdracht in wanneer daarom gevraagd wordt.
Parameters:
query(string): De zoekopdracht
Voorbeeldverzoek:
{
"query": "latest AI trends"
}Zoekt naar recente nieuwsartikelen gerelateerd aan een zoekopdracht.
Hoe deze tool aan te roepen:
Je kunt news_search aanroepen vanuit je eigen script met de MCP Python SDK, of interactief via de Inspector of de interactieve clientmodus. Hier is een codevoorbeeld met de 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)Of in interactieve modus, selecteer news_search in het menu en voer je zoekopdracht in wanneer daarom gevraagd wordt.
Parameters:
query(string): De zoekopdracht
Voorbeeldverzoek:
{
"query": "AI policy updates"
}Zoekt naar producten die overeenkomen met een zoekopdracht.
Hoe deze tool aan te roepen:
Je kunt product_search aanroepen vanuit je eigen script met de MCP Python SDK, of interactief via de Inspector of de interactieve clientmodus. Hier is een codevoorbeeld met de 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)Of in interactieve modus, selecteer product_search in het menu en voer je zoekopdracht in wanneer daarom gevraagd wordt.
Parameters:
query(string): De productzoekopdracht
Voorbeeldverzoek:
{
"query": "best AI gadgets 2025"
}Geeft directe antwoorden op vragen van zoekmachines.
Hoe deze tool aan te roepen:
Je kunt qna aanroepen vanuit je eigen script met de MCP Python SDK, of interactief via de Inspector of de interactieve clientmodus. Hier is een codevoorbeeld met de 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)Of in interactieve modus, selecteer qna in het menu en voer je vraag in wanneer daarom gevraagd wordt.
Parameters:
question(string): De vraag waarvoor je een antwoord zoekt
Voorbeeldverzoek:
{
"question": "what is artificial intelligence"
}Deze sectie bevat codefragmenten en verwijzingen voor de server- en clientimplementaties.
Zie server.py en client.py voor volledige implementatiedetails.
# Example snippet from server.py:
import os
import httpx
# ...existing code...Voordat je begint met bouwen, zijn hier enkele belangrijke geavanceerde concepten die door dit hoofdstuk heen terugkomen. Ze begrijpen helpt je om beter te volgen, ook als ze nieuw voor je zijn:
- Multi-tool Orkestratie: Dit betekent dat je meerdere verschillende tools (zoals websearch, nieuwssearch, productsearch en Q&A) binnen één MCP-server draait. Zo kan je server verschillende taken aan, niet slechts één.
- API Rate Limit Afhandeling: Veel externe API's (zoals SerpAPI) beperken hoeveel verzoeken je in een bepaalde tijd mag doen. Goede code controleert deze limieten en gaat er netjes mee om, zodat je app niet crasht als je de limiet bereikt.
- Gestructureerde Data Parsing: API-antwoorden zijn vaak complex en genest. Dit concept gaat over het omzetten van die antwoorden naar schone, makkelijk te gebruiken formaten die vriendelijk zijn voor LLM's of andere programma's.
- Foutherstel: Soms gaat er iets mis—bijvoorbeeld een netwerkfout of een onverwacht API-antwoord. Foutherstel betekent dat je code deze problemen kan opvangen en toch nuttige feedback geeft, in plaats van te crashen.
- Parameter Validatie: Dit gaat over het controleren of alle invoer voor je tools correct en veilig is. Inclusief het instellen van standaardwaarden en het controleren van types, wat helpt bugs en verwarring te voorkomen.
Deze sectie helpt je om veelvoorkomende problemen te herkennen en op te lossen die je kunt tegenkomen bij het werken met de Web Search MCP Server. Als je fouten of onverwacht gedrag ervaart, biedt deze troubleshooting-sectie oplossingen voor de meest voorkomende issues. Bekijk deze tips eerst—ze lossen vaak problemen snel op.
Bij het werken met de Web Search MCP Server kun je af en toe problemen tegenkomen—dat is normaal bij het ontwikkelen met externe API's en nieuwe tools. Deze sectie geeft praktische oplossingen voor de meest voorkomende problemen, zodat je snel weer verder kunt. Als je een fout tegenkomt, begin hier: de onderstaande tips behandelen de issues die de meeste gebruikers ervaren en kunnen vaak je probleem oplossen zonder extra hulp.
Hieronder staan enkele van de meest voorkomende problemen met duidelijke uitleg en stappen om ze op te lossen:
-
Ontbrekende SERPAPI_KEY in .env-bestand
- Als je de foutmelding
SERPAPI_KEY environment variable not foundziet, betekent dit dat je applicatie de API-sleutel voor SerpAPI niet kan vinden. Maak een bestand.envaan in je projectroot (als dat nog niet bestaat) en voeg een regel toe zoalsSERPAPI_KEY=je_serpapi_sleutel_hier. Vervangje_serpapi_sleutel_hierdoor je echte sleutel van de SerpAPI-website.
- Als je de foutmelding
-
Module niet gevonden fouten
- Fouten zoals
ModuleNotFoundError: No module named 'httpx'geven aan dat een benodigde Python-package ontbreekt. Dit gebeurt meestal als je niet alle dependencies hebt geïnstalleerd. Los dit op door in je terminalpip install -r requirements.txtte draaien om alles te installeren wat je project nodig heeft.
- Fouten zoals
-
Verbindingsproblemen
- Als je een fout krijgt zoals
Error during client execution, betekent dit vaak dat de client geen verbinding kan maken met de server, of dat de server niet draait zoals verwacht. Controleer of zowel client als server compatibele versies zijn en datserver.pyaanwezig is en draait in de juiste map. Het herstarten van zowel server als client kan ook helpen.
- Als je een fout krijgt zoals
-
SerpAPI-fouten
- De melding
Search API returned error status: 401betekent dat je SerpAPI-sleutel ontbreekt, onjuist is of verlopen. Ga naar je SerpAPI-dashboard, controleer je sleutel en werk je.env-bestand bij indien nodig. Als je sleutel correct is maar je ziet deze fout nog steeds, controleer dan of je gratis tier niet is opgebruikt.
- De melding
Standaard logt de app alleen belangrijke informatie. Wil je meer details zien over wat er gebeurt (bijvoorbeeld om lastige problemen te diagnosticeren), dan kun je de DEBUG-modus inschakelen. Hiermee zie je veel meer over elke stap die de app neemt.
Voorbeeld: Normale output
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) ...
Voorbeeld: DEBUG-output
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) ...
Let op hoe de DEBUG-modus extra regels toont over HTTP-verzoeken, antwoorden en andere interne details. Dit is erg handig bij het oplossen van problemen.
Om de DEBUG-modus in te schakelen, stel je het logniveau in op DEBUG bovenaan je client.py of server.py:
# 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"
)Disclaimer:
Dit document is vertaald met behulp van de AI-vertalingsdienst Co-op Translator. Hoewel we streven naar nauwkeurigheid, dient u er rekening mee te houden dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in de oorspronkelijke taal moet als de gezaghebbende bron worden beschouwd. Voor cruciale informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor eventuele misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.