Claude API i MCP - budowanie agentów AI z narzędziami
Kompletny przewodnik po tworzeniu inteligentnych agentów AI z Claude API. Dowiedz się jak wykorzystać function calling, MCP servers i structured output do budowania zaawansowanych aplikacji.
👁 126 przeczytań
- MCP (Model Context Protocol) to standard Anthropic łączący Claude z zewnętrznymi narzędziami, bazami danych, systemami CRM i urządzeniami IoT w czasie rzeczywistym.
- Do budowania agentów AI używa się trzech modeli: Opus 4.6 do wymagających zadań, Sonnet 4.5 jako rozwiązania uniwersalnego oraz Haiku 4.5 do szybkich i tanich operacji.
- Structured Output wymaga zdefiniowania schematu danych w system prompt i pozwala odbierać odpowiedzi Claude w formacie JSON lub XML, co ułatwia integrację z systemami zewnętrznymi.
Wprowadzenie do Claude API i MCP
Model Context Protocol (MCP) to rewolucyjny standard Anthropic, który otwiera przed Claude dostęp do zewnętrznych narzędzi i źródeł danych. W połączeniu z Claude API pozwala na budowanie prawdziwie użytecznych agentów AI, które mogą wykonywać złożone zadania w realnym świecie. W tym tutorialu nauczysz się krok po kroku tworzyć takie systemy, wykorzystując Python SDK oraz najnowsze możliwości Claude Opus 4.6.
MCP działa jako pomost między modelem językowym a zewnętrznymi aplikacjami. Claude może w czasie rzeczywistym łączyć się z bazami danych, systemami CRM, narzędziami programistycznymi czy nawet urządzeniami IoT. To oznacza koniec ery chatbotów ograniczonych tylko do tekstu - tworzymy asystentów zdolnych do rzeczywistej pracy.
Przygotowanie środowiska Python
Rozpoczynamy od instalacji niezbędnych bibliotek. Claude API wymaga najnowszej wersji oficjalnego SDK oraz dodatkowych pakietów do obsługi MCP. Instalacja jest prosta, ale kluczowe jest zachowanie odpowiednich wersji kompatybilnych z najnowszymi funkcjonalnościami.
pip install pydantic>=2.0.0 asyncio-mqtt sqlite3
import anthropic
import asyncio
from mcp_client import MCPClient
from pydantic import BaseModel
from typing import Dict, List, Optional
Po instalacji pakietów konieczne jest utworzenie konta w Anthropic Console i wygenerowanie klucza API. Claude API oferuje różne modele - Opus 4.6 do najbardziej wymagających zadań, Sonnet 4.5 jako uniwersalne rozwiązanie, oraz Haiku 4.5 do szybkich i tanich operacji. Wybór modelu wpływa zarówno na jakość odpowiedzi, jak i koszty.
✅ Przechowuj klucz API w zmiennej środowiskowej ANTHROPIC_API_KEY zamiast hardkodować go w skryptach - to podstawa bezpieczeństwa.
Podstawy function calling w Claude
Function calling to mechanizm pozwalający Claude’owi wywoływać zewnętrzne funkcje na podstawie analizy kontekstu rozmowy. Model samodzielnie decyduje, kiedy i z jakimi parametrami uruchomić daną funkcję, co czyni go prawdziwie autonomicznym agentem.
api_key=”your-api-key-here”
)
# Definicja narzędzia do sprawdzania pogody
weather_tool = {
„name”: „get_weather”,
„description”: „Pobiera aktualną pogodę dla podanego miasta”,
„input_schema”: {
„type”: „object”,
„properties”: {
„city”: {„type”: „string”, „description”: „Nazwa miasta”},
„units”: {„type”: „string”, „enum”: [„celsius”, „fahrenheit”]}
},
„required”: [„city”]
}
}
Schemat narzędzia definiuje jego sygnaturę - nazwę, opis oraz parametry wejściowe. Claude analizuje te informacje i używa ich do podejmowania decyzji o wywołaniu funkcji. Kluczowe jest precyzyjne opisanie zachowania narzędzia oraz typów parametrów - im bardziej szczegółowy opis, tym lepiej Claude rozumie, kiedy danej funkcji użyć.
# Symulacja API pogodowego
weather_data = {
„Warszawa”: {„temp”: 15, „condition”: „słonecznie”},
„Kraków”: {„temp”: 12, „condition”: „pochmurnie”}
}
if city in weather_data:
data = weather_data[city]
return f”W {city}: {data[’temp’]}°{’C’ if units == 'celsius’ else 'F’}, {data[’condition’]}”
else:
return f”Brak danych pogodowych dla miasta {city}”
# Wywołanie z function calling
response = client.messages.create(
model=”claude-3-opus-20240229″,
max_tokens=1024,
tools=[weather_tool],
messages=[{„role”: „user”, „content”: „Jaka jest pogoda w Warszawie?”}]
)
Structured Output - kontrola formatu odpowiedzi
Structured Output to funkcjonalność pozwalająca na wymuszenie określonego formatu odpowiedzi od Claude’a. Zamiast parsować niestrukturalny tekst, możemy otrzymywać dane w postaci JSON, XML czy innych ustandaryzowanych formatów. To kluczowe dla integracji z systemami zewnętrznymi.
from typing import List
class TaskAnalysis(BaseModel):
priority: str # „high”, „medium”, „low”
category: str
estimated_hours: float
required_skills: List[str]
dependencies: List[str]
system_prompt = „””
Analizujesz zadania projektowe i zwracasz ustrukturalizowane dane.
Odpowiadaj WYŁĄCZNIE w formacie JSON zgodnym ze schematem TaskAnalysis.
Nie dodawaj komentarzy ani dodatkowego tekstu.
„””
user_message = „Stwórz aplikację mobilną do zarządzania budżetem domowym z synchronizacją w chmurze”
response = client.messages.create(
model=”claude-3-sonnet-20240229″,
max_tokens=512,
system=system_prompt,
messages=[{„role”: „user”, „content”: user_message}]
)
Structured Output wymaga precyzyjnego zdefiniowania schematu danych oraz jasnych instrukcji w system prompt. Claude musi dokładnie wiedzieć, jakiego formatu oczekujemy oraz jakie wartości są dozwolone w poszczególnych polach. Wykorzystanie biblioteki Pydantic znacznie ułatwia walidację otrzymanych danych.
Konfiguracja MCP Server
MCP Server to komponent odpowiedzialny za udostępnianie narzędzi i zasobów dla Claude’a. Może to być prosty serwer HTTP obsługujący konkretne API, lub złożony system zarządzający bazami danych i integracjami zewnętrznymi. Konfiguracja wymaga zdefiniowania dostępnych narzędzi oraz sposobu komunikacji.
from mcp_client import MCPClient
# Konfiguracja MCP Server
mcp_config = {
„servers”: {
„database_server”: {
„command”: „python”,
„args”: [„mcp_servers/database_server.py”],
„env”: {„DATABASE_URL”: „sqlite:///app.db”}
},
„file_server”: {
„command”: „python”,
„args”: [„mcp_servers/file_server.py”],
„env”: {„WORKSPACE_PATH”: „/workspace”}
}
}
}
# Inicjalizacja klienta MCP
async def init_mcp_client():
client = MCPClient()
await client.connect(„database_server”)
await client.connect(„file_server”)
return client
MCP umożliwia podłączenie wielu serwerów jednocześnie, każdy oferujący różne zestawy narzędzi. Database server może obsługiwać zapytania SQL, file server operacje na plikach, a API server komunikację z zewnętrznymi serwisami. Claude automatycznie wybiera odpowiednie narzędzia na podstawie kontekstu zadania.
✅ Zawsze testuj połączenia MCP w izolowanym środowisku przed wdrożeniem produkcyjnym - błędy konfiguracji mogą powodować nieprzewidywalne zachowania agenta.
Budowanie agenta do analizy danych
Praktyczny przykład agenta wykorzystującego wszystkie omówione technologie. Nasz agent będzie analizował dane sprzedażowe, generował raporty i odpowiadał na pytania biznesowe, korzystając z bazy danych oraz zewnętrznych API.
def __init__(self, anthropic_client, mcp_client):
self.claude = anthropic_client
self.mcp = mcp_client
self.tools = [
{
„name”: „query_sales_data”,
„description”: „Wykonuje zapytania SQL do bazy danych sprzedażowych”,
„input_schema”: {
„type”: „object”,
„properties”: {
„query”: {„type”: „string”, „description”: „Zapytanie SQL”},
„date_range”: {„type”: „string”, „description”: „Zakres dat (YYYY-MM-DD to YYYY-MM-DD)”}
},
„required”: [„query”]
}
},
{
„name”: „generate_chart”,
„description”: „Tworzy wykresy na podstawie danych”,
„input_schema”: {
„type”: „object”,
„properties”: {
„chart_type”: {„type”: „string”, „enum”: [„bar”, „line”, „pie”]},
„data”: {„type”: „array”, „description”: „Dane do wizualizacji”},
„title”: {„type”: „string”, „description”: „Tytuł wykresu”}
},
„required”: [„chart_type”, „data”, „title”]
}
}
]
Agent wykorzystuje dwa główne narzędzia - dostęp do bazy danych oraz generator wykresów. Claude analizuje pytania użytkownika i automatycznie decyduje, które narzędzia wykorzystać oraz w jakiej kolejności. Może najpierw pobrać dane z bazy, następnie przeanalizować je i wygenerować odpowiedni wykres.
system_prompt = „””
Jesteś ekspertem od analizy danych sprzedażowych.
Masz dostęp do bazy danych i narzędzi do wizualizacji.
Gdy otrzymasz pytanie:
1. Zastanów się jakie dane są potrzebne
2. Wykonaj odpowiednie zapytania SQL
3. Przeanalizuj wyniki
4. Wygeneruj wizualizacje jeśli to pomoże
5. Przedstaw wnioski w czytelny sposób
Zawsze uzasadniaj swoje analizy konkretnymi danymi.
„””
response = await self.claude.messages.create(
model=”claude-3-opus-20240229″,
max_tokens=2048,
system=system_prompt,
tools=self.tools,
messages=[{„role”: „user”, „content”: question}]
)
return response
Obsługa błędów i walidacja
Robustność agenta zależy od właściwej obsługi błędów oraz walidacji danych. Claude może popełniać błędy w wywołaniach funkcji, zewnętrzne API mogą być niedostępne, a dane wejściowe mogą być nieprawidłowe. Kompleksowy system obsługi błędów jest nieodzowny w aplikacjach produkcyjnych.
from typing import Optional
class ErrorHandlingAgent:
def __init__(self, claude_client, max_retries=3):
self.claude = claude_client
self.max_retries = max_retries
self.logger = logging.getLogger(__name__)
async def safe_function_call(self, function_name: str, parameters: dict) -> Optional[dict]:
„””Bezpieczne wywołanie funkcji z obsługą błędów”””
for attempt in range(self.max_retries):
try:
# Walidacja parametrów przed wywołaniem
validated_params = self.validate_parameters(function_name, parameters)
result = await self.execute_function(function_name, validated_params)
return result
except ValidationError as e:
self.logger.error(f”Błąd walidacji parametrów: {e}”)
return {„error”: f”Nieprawidłowe parametry: {str(e)}”}
except TimeoutError:
self.logger.warning(f”Timeout przy próbie {attempt + 1}”)
if attempt == self.max_retries - 1:
return {„error”: „Przekroczono limit czasu wykonania”}
await asyncio.sleep(2 ** attempt) # Exponential backoff
except Exception as e:
self.logger.error(f”Nieoczekiwany błąd: {e}”)
return {„error”: f”Błąd wykonania: {str(e)}”}
System retry z exponential backoff pozwala na radzenie sobie z przejściowymi problemami sieciowymi. Walidacja parametrów przed wywołaniem funkcji zapobiega błędom w API. Szczegółowe logowanie ułatwia debugowanie problemów w środowisku produkcyjnym.
Zaawansowane wzorce - Chain of Thought
Chain of Thought to technika pozwalająca Claude’owi na przedstawienie procesu myślowego podczas rozwiązywania złożonych problemów. Agent krok po kroku wyjaśnia swoje rozumowanie, co czyni jego decyzje bardziej transparentnymi i pozwala na lepszą kontrolę nad procesem.
Jesteś agentem do planowania projektów. Gdy otrzymasz opis zadania:
1. Przeanalizuj wymagania i zidentyfikuj główne komponenty
2. Określ zależności między zadaniami
3. Oszacuj czas wykonania poszczególnych etapów
4. Zidentyfikuj potencjalne ryzyka i wąskie gardła
5. Zaproponuj harmonogram z buforami czasowymi
Następnie przedstaw szczegółowy plan z uzasadnieniem każdego kroku.
Korzystaj z dostępnych narzędzi do zarządzania projektami.
Pamiętaj: lepiej przewidzieć więcej czasu niż nie dotrzymać terminów.
„””
user_query = „Zaplanuj migrację 500 użytkowników z systemu legacy do nowej platformy CRM”
response = await client.messages.create(
model=”claude-3-opus-20240229″,
max_tokens=3000,
system=chain_of_thought_prompt,
tools=project_management_tools,
messages=[{„role”: „user”, „content”: user_query}]
)
Tagi XML jak „ strukturyzują proces myślowy Claude’a i zmuszają go do systematycznego podejścia do problemu. Taka konstrukcja promptu znacznie poprawia jakość planowania oraz pozwala na łatwiejsze śledzenie logiki agenta.
✅ Użyj Chain of Thought dla złożonych zadań wymagających wieloetapowego rozumowania - jakość odpowiedzi znacznie wzrasta kosztem nieco dłuższego czasu generowania.
class ReasoningAgent:
async def solve_complex_problem(self, problem: str):
steps = [
„analysis”, # Analiza problemu
„planning”, # Planowanie rozwiązania
„execution”, # Wykonanie kroków
„validation” # Walidacja wyników
]
context = {„problem”: problem, „intermediate_results”: []}
for step in steps:
step_prompt = self.generate_step_prompt(step, context)
response = await self.claude.messages.create(
model=”claude-3-sonnet-20240229″,
max_tokens=1024,
system=step_prompt,
tools=self.get_tools_for_step(step),
messages=self.build_context_messages(context)
)
context[„intermediate_results”].append({
„step”: step,
„result”: response.content[0].text,
„tool_calls”: [call for call in response.content if call.type == „tool_use”]
})
return context
Monitoring i optymalizacja wydajności
Agenci AI w środowisku produkcyjnym wymagają stałego monitoringu wydajności oraz kosztów. Claude API oferuje szczegółowe metryki użycia, które pozwalają na optymalizację zarówno pod kątem szybkości działania, jak i kosztów operacyjnych.
import asyncio
from dataclasses import dataclass
from typing import List
@dataclass
class PerformanceMetrics:
request_count: int
total_tokens: int
total_cost: float
average_response_time: float
error_rate: float
class MonitoringAgent:
def __init__(self, claude_client):
self.claude = claude_client
self.metrics = PerformanceMetrics(0, 0, 0.0, 0.0, 0.0)
self.response_times = []
self.error_count = 0
async def tracked_request(self, model: str, messages: list, tools: list = None):
start_time = time.time()
try:
response = await self.claude.messages.create(
model=model,
max_tokens=1024,
messages=messages,
tools=tools or []
)
# Aktualizacja metryk
response_time = time.time() - start_time
self.response_times.append(response_time)
self.metrics.request_count += 1
self.metrics.total_tokens += response.usage.input_tokens + response.usage.output_tokens
self.metrics.total_cost += self.calculate_cost(response.usage, model)
self.metrics.average_response_time = sum(self.response_times) / len(self.response_times)
return response
except Exception as e:
self.error_count += 1
self.metrics.error_rate = self.error_count / (self.metrics.request_count + self.error_count)
raise e
Monitoring obejmuje śledzenie wykorzystania tokenów, kosztów API, czasów odpowiedzi oraz częstotliwości błędów. Te dane są kluczowe dla optymalizacji - pozwalają identyfikować bottlenecki wydajnościowe oraz przewidywać koszty skalowania systemu.
Google · Twoje źródłaPromptowy wyżej w Twoim Google - jednym kliknięciemDodaj do preferowanych źródeł →Podsumowanie
Claude API w połączeniu z MCP otwiera ogromne możliwości budowania inteligentnych agentów AI zdolnych do rzeczywistej pracy. Kluczem do sukcesu jest właściwe wykorzystanie function calling dla integracji z zewnętrznymi narzędziami, structured output dla kontroli formatów danych, oraz Chain of Thought dla złożonych procesów myślowych. Pamiętaj o implementacji robust error handling oraz ciągłym monitorowaniu wydajności - to fundamenty aplikacji produkcyjnych. Warto zacząć od prostych przypadków użycia, stopniowo dodając kolejne narzędzia i funkcjonalności. Eksperymentuj z różnymi modelami Claude’a w zależności od wymagań - Opus dla najbardziej złożonych zadań, Sonnet jako uniwersalne rozwiązanie, Haiku dla szybkich operacji.
Cały tydzień w AI, w jednym mailu
Wybrane premiery, narzędzia i analizy. Raz w tygodniu, prosto do skrzynki.
Zapisz się za darmo →Najczęstsze pytania
Co to jest Model Context Protocol i do czego służy w Claude API?
MCP to standard stworzony przez Anthropic, który pozwala Claude łączyć się z zewnętrznymi aplikacjami i źródłami danych. Dzięki niemu agent może w czasie rzeczywistym korzystać z baz danych, systemów CRM, narzędzi programistycznych czy urządzeń IoT.
Jak zainstalować środowisko Python do pracy z Claude API i MCP?
Wystarczy uruchomić pip install anthropic>=0.18.0 mcp-client>=2.1.0 oraz pip install pydantic>=2.0.0 asyncio-mqtt sqlite3. Po instalacji należy wygenerować klucz API w Anthropic Console i przechowywać go w zmiennej środowiskowej ANTHROPIC_API_KEY.
Jak działa function calling w Claude i kiedy model wywołuje funkcje?
Claude samodzielnie decyduje, kiedy i z jakimi parametrami uruchomić daną funkcję, analizując kontekst rozmowy oraz schemat narzędzia zawierający jego nazwę, opis i typy parametrów. Im bardziej szczegółowy opis narzędzia, tym lepiej model rozumie, kiedy go użyć.
Ile serwerów MCP można podłączyć jednocześnie do agenta AI?
Można podłączyć wiele serwerów MCP jednocześnie, na przykład database server do zapytań SQL, file server do operacji na plikach i API server do komunikacji z zewnętrznymi serwisami. Claude automatycznie wybiera odpowiednie narzędzia na podstawie kontekstu zadania.



