使用说明
Module 4: Multi-Agent Systems з MCP та A2A
Production-ready multi-agent система що демонструє дві ключові інтеграції:
- News Analysis Pipeline — 5 агентів CrewAI + MCP Sequential Thinking
- A2A Filesystem Agent — Agent-to-Agent сервер з MCP Filesystem інструментами
Архітектура
Pipeline 1: News Analysis (5 агентів + MCP)
┌─────────────────┐
│ BBC Researcher │─┐ DuckDuckGo
└─────────────────┘ │ Search
├──► ┌──────────────────┐ ┌─────────────────┐
┌─────────────────┐ │ │ Senior Analyst │ │ MCP Sequential │
│ CNN Researcher │─┤ │ (з MCP tools) │◄──────┤ Thinking Server │
└─────────────────┘ │ └──────────────────┘ └─────────────────┘
│ ▼ (npx server)
┌─────────────────┐ │ ┌──────────────────┐
│Reuters Researcher│─┘ │ Report Synthesizer│
└─────────────────┘ └──────────────────┘
Pipeline 2: A2A Filesystem Agent
┌────────────────┐ HTTP/JSON-RPC ┌──────────────────┐
│ A2A Client │◄═══════════════►│ A2A Server │
│ (a2a_test_ │ │ (port 10002) │
│ client.py) │ └────────┬─────────┘
└────────────────┘ │
┌────────▼─────────┐
│ AgentExecutor │
│ (CrewAI + LLM) │
└────────┬─────────┘
│ stdio
┌────────▼─────────┐
│ MCP Filesystem │
│ Server (14 tools) │
└──────────────────┘
Структура проекту
module4/
├── config.py # Конфігурація (env vars, валідація)
├── parallel_agent_with_mcp.py # Pipeline 1: News Analysis (5 агентів + MCP Thinking)
├── mcp_examples.py # Інтерактивні приклади 5 MCP серверів
│
├── a2a_server.py # Pipeline 2: A2A Filesystem Agent (HTTP сервер)
├── a2a_agent_executor.py # AgentExecutor: міст A2A <-> CrewAI + MCP Filesystem
├── a2a_test_client.py # Тестовий A2A клієнт
│
├── requirements.txt # Python залежності
├── .env.example # Шаблон конфігурації
└── a2a/a2a-samples/ # Git submodule: приклади A2A (reference)
Встановлення
Крок 1: Node.js (для MCP серверів)
node --version # v18+ рекомендовано
npx --version
Якщо немає Node.js: https://nodejs.org/
Крок 2: Python virtual environment
Важливо: потрібен Python >=3.10, <3.14 (CrewAI не підтримує 3.14).
# Створити venv (якщо Python 3.14 — використайте conda або pyenv для 3.13)
python3 -m venv .venv
source .venv/bin/activate
# Встановити залежності
pip install -r requirements.txt
Крок 3: Конфігурація
cp .env.example .env
Відредагуйте .env:
# Обов'язково
OPENAI_API_KEY=your-openai-api-key-here
# Пошук: DuckDuckGo (API ключ не потрібен)
# Опціонально
DEFAULT_MODEL=gpt-4o-mini
TEMPERATURE=0.7
ENABLE_MCP_THINKING=true
MAX_SEARCH_RESULTS=3
Використання
Pipeline 1: News Analysis
python parallel_agent_with_mcp.py
5 агентів: 3 researcher-и шукають новини через DuckDuckGo, аналітик робить 5-кроковий аналіз через MCP Sequential Thinking (+ може дошукати факти через DuckDuckGo), синтезатор створює фінальний звіт.
Програмне використання:
from parallel_agent_with_mcp import run_advanced_analysis
result = run_advanced_analysis(topic="quantum computing breakthrough")
print(result['result'])
print(f"Duration: {result['duration']:.2f}s")
Pipeline 2: A2A Filesystem Agent
Термінал 1 — запуск сервера:
python a2a_server.py --allowed-dir /tmp
# або кілька директорій:
python a2a_server.py --allowed-dir /tmp --allowed-dir /home/user/docs --port 10002
Термінал 2 — перевірка AgentCard:
curl http://localhost:10002/.well-known/agent-card.json | python -m json.tool
Термінал 2 — відправка запиту:
python a2a_test_client.py --query "List all files in /tmp"
python a2a_test_client.py --query "Read the contents of /tmp/myfile.txt"
python a2a_test_client.py --query "Create a directory called /tmp/reports"
MCP Examples (інтерактивний)
python mcp_examples.py
Оберіть приклад: Sequential Thinking, Filesystem, Fetch, Git, або Memory.
Як працює MCP інтеграція
MCPServerAdapter — підключення до MCP сервера
from crewai_tools import MCPServerAdapter
from mcp import StdioServerParameters
server_params = StdioServerParameters(
command="npx",
args=["-y", "@modelcontextprotocol/server-sequential-thinking"]
)
with MCPServerAdapter(server_params, connect_timeout=60) as mcp_tools:
# mcp_tools — list[CrewAI Tool], автоматично конвертовані з MCP
agent = Agent(tools=mcp_tools, ...)
crew = Crew(agents=[agent], tasks=[...])
crew.kickoff()
# MCP сервер зупиняється при виході з with
Важливо: вся робота з агентами має бути всередині with блоку.
Комбінація звичайних tools + MCP tools
Аналітик отримує обидва типи інструментів в одному списку:
combined_tools = [search_news] + list(mcp_tools)
agent = Agent(tools=combined_tools, ...)
Sanitization MCP схем для OpenAI
MCP інструменти генерують JSON Schema з проблемами (null enum, missing types, additionalProperties: true). _sanitize_mcp_tools() в a2a_agent_executor.py перебудовує схеми через чисті Pydantic-моделі:
- Top-level модель:
extra="ignore"— CrewAI передає додаткові kwargs - Nested моделі:
extra="forbid"— OpenAI вимагаєadditionalProperties: false
Як працює A2A інтеграція
AgentCard — візитка агента
skill = AgentSkill(
id='filesystem_assistant',
name='Filesystem Assistant',
description='Manages files using natural language',
examples=['List all .py files in /tmp'],
)
agent_card = AgentCard(name='Filesystem Agent', skills=[skill], ...)
Доступна за /.well-known/agent-card.json. Клієнти дізнаються можливості агента.
AgentExecutor — обробка запитів
class FilesystemAgentExecutor(AgentExecutor):
async def execute(self, context, event_queue):
query = context.get_user_input()
result = await asyncio.to_thread(self._run_crew, query) # async <-> sync bridge
await event_queue.enqueue_event(new_agent_text_message(result))
asyncio.to_thread() — міст між async A2A сервером і sync CrewAI.
Офіційні MCP сервери
| Сервер | Пакет | Опис |
|---|---|---|
| Sequential Thinking (*) | @modelcontextprotocol/server-sequential-thinking |
Покрокове мислення |
| Filesystem (*) | @modelcontextprotocol/server-filesystem /path |
Робота з файлами (14 інструментів) |
| Fetch | @modelcontextprotocol/server-fetch |
Завантаження веб-контенту |
| Git | @modelcontextprotocol/server-git --repository /path |
Аналіз Git репозиторіїв |
| Memory | @modelcontextprotocol/server-memory |
Knowledge graph пам'ять |
(*) — використовуються в цьому проекті
Як додати інший MCP сервер
server_params = StdioServerParameters(
command="npx",
args=["-y", "@modelcontextprotocol/server-НАЗВА"]
)
with MCPServerAdapter(server_params, connect_timeout=60) as mcp_tools:
agent = Agent(role='Your Role', tools=mcp_tools, ...)
Повний список: Офіційні MCP сервери | Від спільноти
Залежності
| Пакет | Версія | Призначення |
|---|---|---|
crewai |
>=0.80.0 | Multi-agent framework |
crewai-tools[mcp] |
>=1.3.0 | MCP адаптер для CrewAI |
mcp |
>=1.6.0 | Model Context Protocol |
ddgs |
>=9.0.0 | DuckDuckGo Search (без API ключа) |
a2a-sdk |
>=0.3.0 | Agent-to-Agent Protocol SDK |
uvicorn |
>=0.30.0 | ASGI HTTP сервер |
click |
>=8.0.0 | CLI інтерфейс |
httpx |
>=0.27.0 | Async HTTP клієнт |
langchain |
>=1.0.0 | LLM orchestration |
langchain-openai |
>=1.0.0 | OpenAI integration |
python-dotenv |
>=1.0.0 | Environment variables |
Troubleshooting
"No matching distribution found for crewai"
Проблема: Python 3.14+ (CrewAI підтримує тільки <3.14)
Рішення:
conda create -n myenv python=3.13
conda activate myenv
pip install -r requirements.txt
"OpenAI API key not found"
OPENAI_API_KEY=your-api-key-here # в .env
export OPENAI_API_KEY="your-key" # або через export
"command not found: npx"
brew install node # macOS
# або https://nodejs.org/
"unexpected extra inputs" в A2A agent
Проблема: extra="forbid" на top-level Pydantic моделі відхиляє kwargs від CrewAI
Рішення: top-level модель повинна мати extra="ignore", nested — extra="forbid". Вже виправлено в a2a_agent_executor.py.
Timeout при підключенні до MCP
with MCPServerAdapter(server_params, connect_timeout=120) as mcp_tools:
Корисні посилання
- CrewAI Documentation
- CrewAI MCP Integration
- Model Context Protocol
- MCP Servers Repository
- A2A Protocol
- OpenAI API Reference
License
MIT License