Autonomous research agent with web search, source analysis, and report synthesis. Built on Pi agent core. Available as CLI, programmatic API, and MCP server. Features: - 4 built-in tools: web_search, read_url, save_note, synthesize_report - CLI with TUI and print modes - Programmatic API via ResearchAgent class - MCP server with 3 tools: research, quick_search, read_url - Skills system for custom research behavior - Automatic .env file loading for API keys - Configurable max turns, output formats (markdown/JSON/bullet) - Automatic report saving to research-output/
278 lines
9.2 KiB
Markdown
278 lines
9.2 KiB
Markdown
# MCP Integration Architecture
|
||
|
||
## Обзор
|
||
|
||
Pi Research Agent теперь поддерживает MCP (Model Context Protocol), что позволяет другим AI агентам вызывать его для глубокого исследования тем.
|
||
|
||
## Архитектура
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────┐
|
||
│ MCP Client (Claude, Cursor, etc.) │
|
||
│ │
|
||
│ - Claude Desktop │
|
||
│ - Cursor │
|
||
│ - Custom agents │
|
||
│ - Any MCP-compatible client │
|
||
└────────────────────────┬────────────────────────────────────┘
|
||
│ stdio (JSON-RPC)
|
||
▼
|
||
┌─────────────────────────────────────────────────────────────┐
|
||
│ Pi Research Agent MCP Server │
|
||
│ │
|
||
│ Tools: │
|
||
│ ├─ research(topic, maxTurns, format) │
|
||
│ │ └─ Full autonomous research with report generation │
|
||
│ │ │
|
||
│ ├─ quick_search(query, maxResults) │
|
||
│ │ └─ Fast web search via Tavily API │
|
||
│ │ │
|
||
│ └─ read_url(url, maxLength) │
|
||
│ └─ Extract content from web pages │
|
||
└─────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
## Компоненты
|
||
|
||
### 1. MCP Server (`src/mcp-server.ts`)
|
||
|
||
Создаёт MCP server с тремя tools:
|
||
|
||
```typescript
|
||
export function createResearchMcpServer(): McpServer {
|
||
const server = new McpServer({
|
||
name: "pi-research-agent",
|
||
version: VERSION,
|
||
});
|
||
|
||
server.registerTool("research", { ... });
|
||
server.registerTool("quick_search", { ... });
|
||
server.registerTool("read_url", { ... });
|
||
|
||
return server;
|
||
}
|
||
```
|
||
|
||
### 2. MCP CLI (`src/mcp-cli.ts`)
|
||
|
||
Entry point для запуска MCP server:
|
||
|
||
```typescript
|
||
#!/usr/bin/env node
|
||
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
||
import { loadEnvFile } from "./utils/env.ts";
|
||
import { createResearchMcpServer } from "./mcp-server.ts";
|
||
|
||
loadEnvFile();
|
||
|
||
const server = createResearchMcpServer();
|
||
const transport = new StdioServerTransport();
|
||
await server.connect(transport);
|
||
```
|
||
|
||
### 3. Research Agent (`src/agent.ts`)
|
||
|
||
Основной research agent который:
|
||
- Создаёт Pi Agent с research tools
|
||
- Выполняет автономное исследование
|
||
- Генерирует отчёт
|
||
- Сохраняет результаты на диск (опционально)
|
||
|
||
## Flow
|
||
|
||
### Research Tool Flow
|
||
|
||
```
|
||
1. Client вызывает research(topic, maxTurns, format)
|
||
↓
|
||
2. MCP server создаёт ResearchAgent
|
||
↓
|
||
3. ResearchAgent.prompt(topic)
|
||
↓
|
||
4. Agent loop:
|
||
- web_search(query) → Tavily API
|
||
- read_url(url) → fetch content
|
||
- save_note(topic, finding, source, confidence)
|
||
- synthesize_report(topic, format)
|
||
↓
|
||
5. Agent генерирует финальный отчёт
|
||
↓
|
||
6. MCP server возвращает:
|
||
{
|
||
content: [{
|
||
type: "text",
|
||
text: "# Research Report\n\n..."
|
||
}]
|
||
}
|
||
```
|
||
|
||
### Quick Search Flow
|
||
|
||
```
|
||
1. Client вызывает quick_search(query, maxResults)
|
||
↓
|
||
2. MCP server вызывает tavilySearch(query, options)
|
||
↓
|
||
3. Форматирует результаты
|
||
↓
|
||
4. Возвращает список результатов
|
||
```
|
||
|
||
### Read URL Flow
|
||
|
||
```
|
||
1. Client вызывает read_url(url, maxLength)
|
||
↓
|
||
2. MCP server вызывает fetchAndExtract(url, maxLength)
|
||
↓
|
||
3. Извлекает текст из HTML
|
||
↓
|
||
4. Возвращает контент
|
||
```
|
||
|
||
## Конфигурация
|
||
|
||
### Переменные окружения
|
||
|
||
```env
|
||
TAVILY_API_KEY=*** # Required for web search
|
||
OPENROUTER_API_KEY=*** # Required for LLM
|
||
LLM_MODEL=minimax/minimax-m3 # Optional, default model
|
||
```
|
||
|
||
### MCP Client Configuration
|
||
|
||
#### Claude Desktop
|
||
|
||
```json
|
||
{
|
||
"mcpServers": {
|
||
"research-agent": {
|
||
"command": "node",
|
||
"args": ["/path/to/pi-research/packages/research-agent/dist/mcp-cli.js"],
|
||
"env": {
|
||
"TAVILY_API_KEY": "***",
|
||
"OPENROUTER_API_KEY": "***"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
#### Cursor
|
||
|
||
```json
|
||
{
|
||
"mcpServers": {
|
||
"research-agent": {
|
||
"command": "node",
|
||
"args": ["./node_modules/@earendil-works/pi-research-agent/dist/mcp-cli.js"]
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
## Использование
|
||
|
||
### Из Claude Desktop
|
||
|
||
```
|
||
User: Исследуй последние разработки в квантовых вычислениях
|
||
|
||
Claude: [вызывает research tool]
|
||
- Ищет в интернете (5-10 запросов)
|
||
- Читает источники (5-10 URL)
|
||
- Сохраняет заметки (10-20 notes)
|
||
- Генерирует отчёт (2000-5000 слов)
|
||
- Возвращает результат с цитатами
|
||
```
|
||
|
||
### Из Cursor
|
||
|
||
```
|
||
User: @research-agent Найди информацию о Rust async
|
||
|
||
Cursor: [вызывает quick_search tool]
|
||
- Возвращает 10 результатов поиска
|
||
- Пользователь может выбрать URL для глубокого чтения через read_url
|
||
```
|
||
|
||
### Программно (TypeScript)
|
||
|
||
```typescript
|
||
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
||
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
|
||
|
||
const transport = new StdioClientTransport({
|
||
command: "node",
|
||
args: ["./dist/mcp-cli.js"],
|
||
});
|
||
|
||
const client = new Client({
|
||
name: "my-agent",
|
||
version: "1.0.0",
|
||
});
|
||
|
||
await client.connect(transport);
|
||
|
||
const result = await client.callTool({
|
||
name: "research",
|
||
arguments: {
|
||
topic: "Quantum computing 2026",
|
||
maxTurns: 10,
|
||
format: "markdown",
|
||
},
|
||
});
|
||
|
||
console.log(result.content[0].text);
|
||
```
|
||
|
||
## Преимущества MCP Integration
|
||
|
||
1. **Переиспользование**: Один research agent для всех клиентов
|
||
2. **Стандартизация**: MCP protocol обеспечивает совместимость
|
||
3. **Масштабируемость**: Легко добавить новые tools
|
||
4. **Изоляция**: Research agent работает в отдельном процессе
|
||
5. **Безопасность**: API keys изолированы в MCP server
|
||
|
||
## Ограничения
|
||
|
||
1. **Latency**: Полное исследование занимает 2-5 минут
|
||
2. **Context size**: Отчёты могут быть очень длинными
|
||
3. **Cost**: Tavily API и LLM API имеют стоимость
|
||
4. **Rate limits**: Tavily free tier — 1000 запросов/месяц
|
||
|
||
## Будущие улучшения
|
||
|
||
1. **Streaming**: Добавить поддержку streaming для длинных исследований
|
||
2. **Progress**: Добавить progress notifications через MCP
|
||
3. **Caching**: Кэшировать результаты поиска
|
||
4. **Batch**: Поддержка batch research (несколько тем одновременно)
|
||
5. **Custom skills**: Позволить клиентам передавать custom skills
|
||
|
||
## Тестирование
|
||
|
||
### Ручное тестирование
|
||
|
||
```bash
|
||
# Initialize
|
||
echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"1.0.0"}}}' | node dist/mcp-cli.js
|
||
|
||
# List tools
|
||
(echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"1.0.0"}}}'; echo '{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}') | node dist/mcp-cli.js
|
||
|
||
# Call tool
|
||
(echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"1.0.0"}}}'; echo '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"quick_search","arguments":{"query":"test","maxResults":5}}}') | node dist/mcp-cli.js
|
||
```
|
||
|
||
### Автоматическое тестирование
|
||
|
||
См. `examples/mcp-client.ts` для примера programmatic client.
|
||
|
||
## Ссылки
|
||
|
||
- [MCP Specification](https://modelcontextprotocol.io/)
|
||
- [MCP TypeScript SDK](https://github.com/modelcontextprotocol/typescript-sdk)
|
||
- [Pi Research Agent](./README.md)
|
||
- [MCP Server Documentation](./MCP_SERVER.md)
|