Eyes-MCP
A research MCP server that enables AI agents to query the internet using multiple sources like SearXNG, GitHub, Reddit, and YouTube, and returns synthesized answers with citations.
README
Eyes-MCP
Research MCP for AI agents. Docker-packaged. Swarm-ready. Zero required secrets.
A Model Context Protocol server that does the boring part of "go look this up on the internet" for any MCP-compatible agent. Callers send a question + a few parameters, Eyes-MCP fans out across SearXNG, Crawl4AI, GitHub, Reddit, YouTube, and more, and returns a synthesized answer with citations.
What we're building
flowchart TD
Caller[Caller] -->|"prompt, depth, max_shards"| MainAgent
subgraph MainAgent ["[main agent] - the only LLM"]
MA1[1. Read available sources]
MA2[2. Decompose prompt into N sub-tasks]
end
MainAgent -->|"N shards"| SubAgents
subgraph SubAgents ["[N sub-agents] - async coroutines, no LLM"]
SA1[search - SearXNG / GitHub / Reddit / YouTube / ...]
SA2[fetch - Crawl4AI / API call]
SA3[write raw output to disk - artifact pattern]
end
SubAgents -->|shard_id, path| Parse1
subgraph Parse1 ["[parse layer 1] - bloat strip, depth-driven"]
P1[strip HTML, nav, ads, boilerplate]
end
Parse1 --> Parse2
subgraph Parse2 ["[parse layer 2] - chunk + per-shard dedup"]
P2[chunk by structure then size cap 500 tokens]
P3[simhash dedup within shard]
end
Parse2 -->|chunks grouped by shard_id| Review
subgraph Review ["[main agent] - reviews and decides"]
R1{synthesize or spawn more shards?}
end
Review -->|"synthesized answer"| Caller
Review -->|"loop with gap-fill shards"| SubAgents
Decisions locked in:
- Only the main agent is an LLM. Sub-agents = async coroutines.
- Sub-agents write raw output to disk. Main agent sees pointers + chunks, not raw.
- Parse layer 1 = bloat strip. Aggressiveness driven by the
depthparam. - No ranking. Every chunk goes to the main agent.
- Themes = shards. Main agent's decomposition defines the themes. No re-clustering.
- Crawl4AI's output is trusted for URL-fetched content — no re-stripping.
Why this is different
There are at least five "SearXNG + Crawl4AI + MCP" wrappers already (see 02-existing-landscape.md). What makes Eyes-MCP not the 6th me-too entry:
| Differentiator | What it means |
|---|---|
| Zero-friction install | docker compose up works with no API keys. LLM is optional. |
| Shared service | Streamable HTTP, stateful sessions, multi-tenant. Designed to be a service, not a personal daemon. |
| Source-aware adapters | GitHub, Reddit, YouTube, academic — each has a dedicated adapter, not a generic search-then-scrape path. |
| Swarm-ready | Main agent + sub-agents + two parse layers wired from day one (swarm flag-gated in v1). |
| Artifact pattern | Sub-agents write to disk, main agent reads chunks. Token cost is bounded by EYES_TOKEN_BUDGET. |
Install
git clone https://github.com/your-org/eyes-mcp.git
cd eyes-mcp
cp .env.example .env # edit GEMINI_API_KEY if you have one
docker compose up
The first run pulls three images: searxng/searxng, unclecode/crawl4ai, redis. Build pulls node:20-alpine. Total cold start: ~2 minutes.
Important: before exposing SearXNG to the network, replace secret_key in searxng/settings.yml:
openssl rand -hex 32
Configure
All configuration is via environment variables. See .env.example for the full list with defaults. Highlights:
| Variable | Default | Purpose |
|---|---|---|
EYES_HTTP_PORT |
8787 |
HTTP listen port |
GEMINI_API_KEY |
(empty) | Optional. If unset, server runs in heuristic-only mode. |
GEMINI_MODEL |
gemma-4-31b-it |
Model served by the Gemini-compatible API |
SEARXNG_URL |
http://searxng:8080 |
Internal SearXNG endpoint |
CRAWL4AI_URL |
http://crawl4ai:11235 |
Internal Crawl4AI endpoint |
GITHUB_TOKEN |
(empty) | Bumps GitHub REST rate limit 60/hr → 5000/hr |
REDDIT_CLIENT_ID / REDDIT_CLIENT_SECRET |
(empty) | PRAW auth (optional) |
EYES_MAX_SHARDS |
5 |
Max shards per request (cap 20) |
EYES_MAX_ITERATIONS |
2 |
Max refinement iterations (cap 5) |
EYES_TOKEN_BUDGET |
80000 |
Token budget for the main agent's context |
EYES_TIME_BUDGET_SEC |
120 |
Wall-clock budget per request |
Usage
The server speaks the MCP streamable HTTP transport on /mcp and a plain health probe on /health.
curl http://localhost:8787/health
# {"status":"ok","version":"0.1.0","uptime":12,"dependencies":{...}}
MCP clients that work out of the box
- Claude Desktop — add to
claude_desktop_config.json:{ "mcpServers": { "eyes": { "type": "http", "url": "http://localhost:8787/mcp" } } } - Cursor — same config under MCP servers.
- MCP Inspector — point at
http://localhost:8787/mcpto call tools interactively. - Any other MCP client supporting streamable HTTP.
Project layout
Eyes-MCP/
├── src/
│ ├── index.ts ← HTTP server, /health, /mcp, signal handling (THIS SUBAGENT)
│ ├── health.ts ← dependency probe (THIS SUBAGENT)
│ ├── util/logger.ts ← winston logger (THIS SUBAGENT)
│ ├── tools/ ← MCP tool registration (subagent B)
│ ├── main-agent/ ← orchestrator + LLM client (subagent B)
│ ├── llm/ ← Gemini/Gemma client (subagent B)
│ ├── dispatcher/ ← shard fan-out + scheduling (subagent B)
│ ├── adapters/ ← GitHub/Reddit/YouTube/etc. (subagent C)
│ └── parse/ ← bloat strip + chunking (subagent C)
├── searxng/ ← SearXNG config
├── data/ ← runtime artifacts (gitignored)
├── docker-compose.yml
├── Dockerfile
├── package.json
├── tsconfig.json
├── .env.example
├── LICENSE ← MIT
└── README.md ← you are here
Status
Build in progress. This repo is the result of a parallel subagent build:
- Subagent A (this) — skeleton, Docker, entrypoint, health, logger. ✅
- Subagent B — main agent, LLM client, dispatcher, tool registration. ⏳
- Subagent C — source adapters, parse layers. ⏳
After wire-up, see 03-architecture-main-and-swarm.md for the full design.
License
MIT. See LICENSE.
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
Neon Database
MCP server for interacting with Neon Management API and databases
E2B
Using MCP to run code via e2b.
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.