loading…
Search for a command to run...
loading…
A deep-research MCP server exposing a single task-augmented tool that runs GPT-Researcher with Tavily search, Anthropic Claude, and OpenAI embeddings, streaming
A deep-research MCP server exposing a single task-augmented tool that runs GPT-Researcher with Tavily search, Anthropic Claude, and OpenAI embeddings, streaming progress via MCP tasks and Upjack entity stream.
mpak NimbleBrain Discord License: MIT
Deep-research MCP app. Exposes one task-augmented tool (start_research) that runs GPT-Researcher against Tavily (web search), Anthropic Claude (planner + writer LLM), and OpenAI (embeddings only), and streams progress back through both the MCP tasks protocol and the Upjack entity stream. Fully compliant with the MCP 2025-11-25 draft tasks utility via FastMCP 3.
View on mpak registry | Built by NimbleBrain
Install via mpak into your NimbleBrain workspace:
mpak install @nimblebraininc/synapse-research
Set the three required credentials in your host's shell (Bun auto-loads .env, or export directly):
export ANTHROPIC_API_KEY=sk-ant-...
export TAVILY_API_KEY=tvly-...
export OPENAI_API_KEY=sk-...
Run a research task from your agent chat:
"Research what's new with Model Context Protocol in 2026"
The agent fires start_research, the worker streams progress into the chat UI and into the Synapse sidebar dashboard, and you get back a markdown report in ~30s–3min.
chat: "research X"
│
▼
NimbleBrain engine ──┐
│ tools/call (task-augmented)
▼
FastMCP server (this app)
│
├─► creates research_run entity (status=working)
├─► spawns worker (asyncio)
│ │
│ ├─► ctx.report_progress ──► notifications/tasks/status ──► engine
│ └─► app.update_entity ──► filesystem ──► Synapse UI live stream
│
└─► returns CreateTaskResult immediately
(engine polls tasks/get, retrieves via tasks/result when terminal)
Two independent channels update in lockstep:
The sidebar's "Retry with same query" button uses useCallToolAsTask("start_research") from the Synapse SDK (≥ 0.7.0). The task handle returns a taskId in under a second; the new research_run entity materialises shortly after (the worker creates it as its first action), and the UI navigates to the new detail page off the entity channel — not by waiting on the task's terminal result, which arrives minutes later. Second click on the button while "Starting…" routes through handle.cancel().
Legacy hosts (platform builds prior to the tasks-capability advertisement) cause callToolAsTask to throw. The UI catches that case and falls back to synapse.callTool fire-and-forget, so the feature keeps working with older deploys — only the starting-state indicator and the cancel handle degrade.
user_config in manifest.json)The host runtime prompts for these at install time or resolves them from a workspace-scoped store, then injects them into the bundle subprocess via mcp_config.env:
| Config key | Env var exposed | Purpose |
|---|---|---|
anthropic_api_key |
ANTHROPIC_API_KEY |
Claude LLM — planning + report writing |
tavily_api_key |
TAVILY_API_KEY |
Web search |
openai_api_key |
OPENAI_API_KEY |
Embeddings only (text-embedding-3-small) |
All three are required and marked sensitive: true.
mcp_config.env)Not tenant-tunable in v1 — set directly in the manifest:
RETRIEVER=tavily
FAST_LLM=anthropic:claude-haiku-4-5
SMART_LLM=anthropic:claude-sonnet-4-6
STRATEGIC_LLM=anthropic:claude-sonnet-4-6
EMBEDDING=openai:text-embedding-3-small
To change an LLM or retriever, edit manifest.json and reinstall the bundle. Promoting any of these to user_config is a one-line change if per-workspace tuning is needed.
asyncio.wait_for. Longer runs are marked failed with a timeout error.One entity: research_run. Lives under:
$UPJACK_ROOT/apps/research/data/research_runs/{id}.json
Data-root resolution priority:
UPJACK_ROOT env varMPAK_WORKSPACE env var~/.synapse-research (fallback)Each workspace spawns its own server process with its own root. There is no cross-workspace state inside the server.
uv sync
cd ui && npm install && npm run build && cd ..
uv run python -m mcp_research.server
uv run uvicorn mcp_research.server:app --port 8002
uv run pytest tests/ -v
The spec-compliance suite (tests/test_spec_compliance.py) exercises every MUST from the MCP tasks draft: capability advertisement, execution.taskSupport gating, tasks/get|result|cancel|list, TTL behaviour, progress notifications, workspace isolation. The worker suite (tests/test_worker.py) covers happy path, cancel, failure, monotonic progress, and source streaming. All tests use a FakeGPTR monkeypatch so real providers are never called in CI.
| Tool | Task support | Description |
|---|---|---|
start_research |
optional |
The only custom tool. Runs the research worker end-to-end. |
get_research_run |
n/a | Auto-generated entity tool (read by id). |
list_research_runs |
n/a | Auto-generated entity tool. |
search_research_runs |
n/a | Auto-generated entity tool. |
delete_research_run |
n/a | Auto-generated entity tool (soft delete). |
Cancellation is handled at the MCP protocol level via tasks/cancel. The worker catches asyncio.CancelledError, flips the entity to cancelled, and re-raises so FastMCP transitions the task to its cancelled terminal state.
See CLAUDE.md for the architecture walkthrough, commands, conventions, and build pipeline.
Quality gates (run before opening a PR):
uv run ruff check src/ tests/
uv run ruff format --check src/ tests/
uv run ty check src/
uv run pytest tests/ -v
cd ui && npm ci && npm run build
CI enforces the same gates — see .github/workflows/ci.yml.
MIT — see LICENSE.
Run in your terminal:
claude mcp add synapse-research -- npx Security
Low riskAutomated heuristic from public metadata — not a security guarantee.