Ten rozdział pokazuje, jak zbudować praktycznego agenta AI, który integruje się z zewnętrznymi API, obsługuje różnorodne typy danych, zarządza błędami i koordynuje wiele narzędzi — wszystko w formacie gotowym do produkcji. Zobaczysz:
- Integrację z zewnętrznymi API wymagającymi uwierzytelniania
- Obsługę różnych typów danych z wielu punktów końcowych
- Solidne strategie obsługi błędów i logowania
- Orkiestrację wielu narzędzi w jednym serwerze
Na koniec zdobędziesz praktyczne doświadczenie z wzorcami i najlepszymi praktykami niezbędnymi w zaawansowanych aplikacjach AI i opartych na LLM.
W tej lekcji nauczysz się, jak zbudować zaawansowany serwer i klient MCP, który rozszerza możliwości LLM o dane z sieci w czasie rzeczywistym, korzystając z SerpAPI. To kluczowa umiejętność do tworzenia dynamicznych agentów AI, które mają dostęp do aktualnych informacji z internetu.
Po ukończeniu tej lekcji będziesz potrafił:
- Bezpiecznie integrować zewnętrzne API (takie jak SerpAPI) z serwerem MCP
- Implementować wiele narzędzi do wyszukiwania w sieci, wiadomości, produktów oraz Q&A
- Parsować i formatować dane strukturalne dla potrzeb LLM
- Skutecznie obsługiwać błędy i zarządzać limitami API
- Budować i testować zarówno zautomatyzowanych, jak i interaktywnych klientów MCP
Ta sekcja przedstawia architekturę i funkcje serwera MCP do wyszukiwania w sieci. Zobaczysz, jak FastMCP i SerpAPI współpracują, by rozszerzyć możliwości LLM o dane z internetu w czasie rzeczywistym.
Implementacja zawiera cztery narzędzia, które pokazują zdolność MCP do bezpiecznego i efektywnego obsługiwania różnorodnych zadań opartych na zewnętrznych API:
- general_search: do szerokich wyników wyszukiwania w sieci
- news_search: do najnowszych nagłówków wiadomości
- product_search: do danych e-commerce
- qna: do fragmentów pytań i odpowiedzi
- Przykłady kodu: Zawiera bloki kodu specyficzne dla języka Python (łatwe do rozszerzenia na inne języki) z użyciem pivotów kodu dla przejrzystości
# 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)Przed uruchomieniem klienta warto zrozumieć, co robi serwer. Plik server.py implementuje serwer MCP, udostępniając narzędzia do wyszukiwania w sieci, wiadomości, produktów i Q&A poprzez integrację z SerpAPI. Obsługuje przychodzące żądania, zarządza wywołaniami API, parsuje odpowiedzi i zwraca klientowi uporządkowane wyniki.
Pełną implementację możesz przejrzeć w server.py.
Poniżej krótki przykład, jak serwer definiuje i rejestruje narzędzie:
# 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()- Integracja z zewnętrznym API: Pokazuje bezpieczne zarządzanie kluczami API i zapytaniami zewnętrznymi
- Parsowanie danych strukturalnych: Przekształcanie odpowiedzi API na formaty przyjazne dla LLM
- Obsługa błędów: Solidna obsługa błędów z odpowiednim logowaniem
- Interaktywny klient: Zawiera zarówno testy automatyczne, jak i tryb interaktywny do testowania
- Zarządzanie kontekstem: Wykorzystuje MCP Context do logowania i śledzenia żądań
Zanim zaczniesz, upewnij się, że środowisko jest poprawnie skonfigurowane, wykonując poniższe kroki. Zapewni to instalację wszystkich zależności i poprawną konfigurację kluczy API, co umożliwi płynny rozwój i testowanie.
- Python 3.8 lub nowszy
- Klucz API SerpAPI (zarejestruj się na SerpAPI — dostępny darmowy plan)
Aby rozpocząć, wykonaj następujące kroki, aby skonfigurować środowisko:
- Zainstaluj zależności za pomocą uv (zalecane) lub pip:
# Using uv (recommended)
uv pip install -r requirements.txt
# Using pip
pip install -r requirements.txt- Utwórz plik
.envw katalogu głównym projektu z Twoim kluczem SerpAPI:
SERPAPI_KEY=your_serpapi_key_here
Serwer MCP do wyszukiwania w sieci to główny komponent, który udostępnia narzędzia do wyszukiwania w sieci, wiadomości, produktów i Q&A, integrując się z SerpAPI. Obsługuje przychodzące żądania, zarządza wywołaniami API, parsuje odpowiedzi i zwraca uporządkowane wyniki klientowi.
Pełną implementację możesz przejrzeć w server.py.
Aby uruchomić serwer MCP, użyj następującego polecenia:
python server.pySerwer będzie działał jako MCP oparty na stdio, do którego klient może się bezpośrednio podłączyć.
Klient (client.py) obsługuje dwa tryby interakcji z serwerem MCP:
- Tryb normalny: Uruchamia automatyczne testy, które sprawdzają wszystkie narzędzia i weryfikują ich odpowiedzi. Przydatne do szybkiego sprawdzenia, czy serwer i narzędzia działają poprawnie.
- Tryb interaktywny: Uruchamia interfejs menu, w którym możesz ręcznie wybierać i wywoływać narzędzia, wpisywać własne zapytania i na bieżąco oglądać wyniki. Idealny do eksploracji możliwości serwera i eksperymentowania z różnymi danymi wejściowymi.
Pełną implementację możesz przejrzeć w client.py.
Aby uruchomić testy automatyczne (uruchomi to automatycznie serwer):
python client.pyLub uruchom w trybie interaktywnym:
python client.py --interactiveIstnieje kilka sposobów testowania i interakcji z narzędziami udostępnianymi przez serwer, w zależności od Twoich potrzeb i sposobu pracy.
Możesz też tworzyć własne skrypty testowe, korzystając z 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 resultW tym kontekście „skrypt testowy” oznacza niestandardowy program w Pythonie, który piszesz, aby działać jako klient serwera MCP. Zamiast formalnego testu jednostkowego, ten skrypt pozwala programowo łączyć się z serwerem, wywoływać dowolne narzędzia z wybranymi parametrami i analizować wyniki. To podejście jest przydatne do:
- Prototypowania i eksperymentowania z wywołaniami narzędzi
- Weryfikacji, jak serwer reaguje na różne dane wejściowe
- Automatyzacji powtarzających się wywołań narzędzi
- Budowania własnych przepływów pracy lub integracji na bazie serwera MCP
Możesz używać skryptów testowych do szybkiego wypróbowania nowych zapytań, debugowania zachowania narzędzi lub jako punktu wyjścia do bardziej zaawansowanej automatyzacji. Poniżej przykład użycia MCP Python SDK do stworzenia takiego skryptu:
Możesz korzystać z poniższych narzędzi udostępnianych przez serwer do wykonywania różnych typów wyszukiwań i zapytań. Każde narzędzie opisano poniżej wraz z parametrami i przykładowym użyciem.
Ta sekcja zawiera szczegóły dotyczące każdego dostępnego narzędzia i ich parametrów.
Wykonuje ogólne wyszukiwanie w sieci i zwraca sformatowane wyniki.
Jak wywołać to narzędzie:
Możesz wywołać general_search ze swojego skryptu, korzystając z MCP Python SDK, lub interaktywnie za pomocą Inspektora albo trybu interaktywnego klienta. Oto przykład kodu z użyciem 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)Alternatywnie, w trybie interaktywnym wybierz general_search z menu i wpisz zapytanie, gdy zostaniesz o to poproszony.
Parametry:
query(string): zapytanie wyszukiwania
Przykładowe zapytanie:
{
"query": "latest AI trends"
}Wyszukuje najnowsze artykuły wiadomości związane z zapytaniem.
Jak wywołać to narzędzie:
Możesz wywołać news_search ze swojego skryptu, korzystając z MCP Python SDK, lub interaktywnie za pomocą Inspektora albo trybu interaktywnego klienta. Oto przykład kodu z użyciem 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)Alternatywnie, w trybie interaktywnym wybierz news_search z menu i wpisz zapytanie, gdy zostaniesz o to poproszony.
Parametry:
query(string): zapytanie wyszukiwania
Przykładowe zapytanie:
{
"query": "AI policy updates"
}Wyszukuje produkty pasujące do zapytania.
Jak wywołać to narzędzie:
Możesz wywołać product_search ze swojego skryptu, korzystając z MCP Python SDK, lub interaktywnie za pomocą Inspektora albo trybu interaktywnego klienta. Oto przykład kodu z użyciem 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)Alternatywnie, w trybie interaktywnym wybierz product_search z menu i wpisz zapytanie, gdy zostaniesz o to poproszony.
Parametry:
query(string): zapytanie wyszukiwania produktów
Przykładowe zapytanie:
{
"query": "best AI gadgets 2025"
}Uzyskuje bezpośrednie odpowiedzi na pytania z wyszukiwarek.
Jak wywołać to narzędzie:
Możesz wywołać qna ze swojego skryptu, korzystając z MCP Python SDK, lub interaktywnie za pomocą Inspektora albo trybu interaktywnego klienta. Oto przykład kodu z użyciem 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)Alternatywnie, w trybie interaktywnym wybierz qna z menu i wpisz pytanie, gdy zostaniesz o to poproszony.
Parametry:
question(string): pytanie, na które chcesz uzyskać odpowiedź
Przykładowe zapytanie:
{
"question": "what is artificial intelligence"
}Ta sekcja zawiera fragmenty kodu i odniesienia do implementacji serwera i klienta.
Pełne szczegóły implementacji znajdziesz w server.py i client.py.
# Example snippet from server.py:
import os
import httpx
# ...existing code...Zanim zaczniesz budować, oto kilka ważnych zaawansowanych koncepcji, które pojawią się w całym rozdziale. Ich zrozumienie pomoże Ci lepiej śledzić materiał, nawet jeśli są dla Ciebie nowe:
- Orkiestracja wielu narzędzi: Oznacza uruchamianie kilku różnych narzędzi (takich jak wyszukiwanie w sieci, wiadomości, produkty i Q&A) w jednym serwerze MCP. Pozwala to serwerowi obsługiwać różnorodne zadania, a nie tylko jedno.
- Obsługa limitów API: Wiele zewnętrznych API (np. SerpAPI) ogranicza liczbę zapytań w określonym czasie. Dobry kod sprawdza te limity i radzi sobie z nimi w sposób łagodny, aby aplikacja nie przestała działać po przekroczeniu limitu.
- Parsowanie danych strukturalnych: Odpowiedzi API są często złożone i zagnieżdżone. Ta koncepcja polega na przekształcaniu tych odpowiedzi w czyste, łatwe do użycia formaty, przyjazne dla LLM lub innych programów.
- Odzyskiwanie po błędach: Czasem coś idzie nie tak — może zawiedzie sieć lub API nie zwróci oczekiwanych danych. Odzyskiwanie po błędach oznacza, że Twój kod potrafi poradzić sobie z tymi problemami i nadal dostarczyć użyteczne informacje, zamiast się zawiesić.
- Walidacja parametrów: Chodzi o sprawdzanie, czy wszystkie dane wejściowe do narzędzi są poprawne i bezpieczne w użyciu. Obejmuje to ustawianie wartości domyślnych i upewnianie się, że typy są właściwe, co pomaga zapobiegać błędom i nieporozumieniom.
Ta sekcja pomoże Ci diagnozować i rozwiązywać typowe problemy, które mogą się pojawić podczas pracy z serwerem MCP do wyszukiwania w sieci. Jeśli napotkasz błędy lub nieoczekiwane zachowanie, ta część zawiera rozwiązania najczęstszych problemów. Przejrzyj te wskazówki przed szukaniem dalszej pomocy — często szybko rozwiązują problemy.
Podczas pracy z serwerem MCP do wyszukiwania w sieci mogą się zdarzyć problemy — to normalne przy pracy z zewnętrznymi API i nowymi narzędziami. Ta sekcja zawiera praktyczne rozwiązania najczęstszych problemów, dzięki czemu szybko wrócisz do pracy. Jeśli napotkasz błąd, zacznij tutaj: poniższe wskazówki dotyczą problemów, z którymi najczęściej spotykają się użytkownicy i często pozwalają rozwiązać problem bez dodatkowej pomocy.
Poniżej znajdziesz najczęściej występujące problemy wraz z jasnymi wyjaśnieniami i krokami do ich rozwiązania:
-
Brak SERPAPI_KEY w pliku .env
- Jeśli pojawi się błąd
SERPAPI_KEY environment variable not found, oznacza to, że aplikacja nie może znaleźć klucza API potrzebnego do dostępu do SerpAPI. Aby to naprawić, utwórz plik.envw katalogu głównym projektu (jeśli jeszcze go nie ma) i dodaj linięSERPAPI_KEY=twoj_klucz_serpapi. Pamiętaj, aby zastąpićtwoj_klucz_serpapifaktycznym kluczem z serwisu SerpAPI.
- Jeśli pojawi się błąd
-
Błędy typu Module not found
- Błędy takie jak
ModuleNotFoundError: No module named 'httpx'oznaczają, że brakuje wymaganego pakietu Pythona. Zwykle dzieje się tak, gdy nie zainstalowano wszystkich zależności. Aby to naprawić, uruchom w terminalupip install -r requirements.txt, aby zainstalować wszystkie potrzebne pakiety.
- Błędy takie jak
-
Problemy z połączeniem
- Jeśli pojawi się błąd
Error during client execution, często oznacza to, że klient nie może połączyć się z serwerem lub serwer nie działa poprawnie. Sprawdź, czy klient i serwer mają kompatybilne wersje oraz czy plikserver.pyjest obecny i uruchomiony w odpowiednim katalogu. Pomocne może być też ponowne uruchomienie serwera i klienta.
- Jeśli pojawi się błąd
-
Błędy SerpAPI
- Komunikat
Search API returned error status: 401oznacza, że klucz SerpAPI jest nieobecny, nieprawidłowy lub wygasł. Wejdź na swoje konto SerpAPI, zweryfikuj klucz i w razie potrzeby zaktualizuj plik.env. Jeśli klucz jest poprawny, a błąd nadal występuje, sprawdź, czy nie wyczerpał się limit darmowego planu.
- Komunikat
Domyślnie aplikacja loguje tylko ważne informacje. Jeśli chcesz zobaczyć więcej szczegółów o tym, co się dzieje (
Aby włączyć tryb DEBUG, ustaw poziom logowania na DEBUG na początku pliku client.py lub 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"
)Zastrzeżenie:
Niniejszy dokument został przetłumaczony przy użyciu usługi tłumaczenia AI Co-op Translator. Mimo że dążymy do dokładności, prosimy mieć na uwadze, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w języku źródłowym powinien być uznawany za źródło autorytatywne. W przypadku informacji krytycznych zalecane jest skorzystanie z profesjonalnego tłumaczenia wykonanego przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z korzystania z tego tłumaczenia.