Web Eyes
Search, crawl, and summarize the web — exposed as both a REST API and an MCP server for LLM agents.
Powered by SearXNG, Crawl4AI, and NVIDIA NIM.
What it does
Web Eyes provides a pipeline of web intelligence tools:
- Search — query SearXNG for web results
- Crawl — extract clean text from URLs using a headless browser
- Summarize — distill content via an LLM (NVIDIA NIM)
- Ask — full pipeline: search → crawl → synthesize an answer with citations
- See — take screenshots and use a vision LLM to extract content from JS-heavy, canvas-rendered, or image-heavy pages
- Look — analyze any image directly via vision AI (no URL crawling needed)
These are exposed via a FastAPI REST API and an MCP (Model Context Protocol) server, so any MCP-compatible agent (Claude Desktop, Claude Code, Cursor, etc.) can use them directly.
Quick Start
1. Start SearXNG
docker compose up -d
2. Configure environment
cp .env.example .env
# Edit .env and set NIM_API_KEY (get one at https://build.nvidia.com/)
3. Install dependencies
pip install -r requirements.txt
4. Run
REST API + MCP together (port 3000):
python main.py
- REST API:
http://localhost:3000 - MCP endpoint:
http://localhost:3000/mcp - Interactive docs:
http://localhost:3000/docs
Standalone MCP server:
python run_mcp.py # stdio (default)
python run_mcp.py http # streamable-http on port 3001
python run_mcp.py sse # SSE on port 3001
REST API
| Method | Path | Description | |--------|------|-------------| | POST | /search | Search → crawl → summarize | | POST | /crawl | Crawl specific URLs | | POST | /summarize | Crawl + summarize specific URLs | | POST | /ask | Search → crawl → answer with citations | | POST | /see | Screenshot + vision extraction + summarize | | POST | /look | Analyze a base64-encoded image with vision AI |
Example:
curl -X POST http://localhost:3000/search \
-H "Content-Type: application/json" \
-d '{"query": "latest Rust release", "limit": 5}'
MCP Tools
| Tool | Parameters | Description | |------|-----------|-------------| | search_web | query, limit=10 | Search, crawl, and summarize | | crawl_pages | urls | Extract raw text from URLs | | summarize_pages | urls, instruction? | Crawl and summarize URLs | | ask_web | question, scrape_top=3 | Answer a question with web sources | | see_pages | urls, instruction?, extract_prompt? | Screenshot + vision extraction + summarize | | look_at_image | image_base64, instruction? | Analyze an image directly with vision AI |
Agent Configuration
Claude Desktop / Claude Code (mcp.json):
{
"mcpServers": {
"web-eyes": {
"command": "python",
"args": ["C:\\Users\\you\\web_eyes\\run_mcp.py", "stdio"]
}
}
}
Remote agents (HTTP transport):
http://localhost:3001/mcp
Configuration
All settings are in .env. See .env.example for defaults.
| Variable | Default | Description | |----------|---------|-------------| | NIM_API_KEY | — | NVIDIA NIM API key (required for summarize/ask) | | NIM_BASE_URL | https://integrate.api.nvidia.com/v1 | NIM API endpoint | | NIM_MODEL | google/gemma-3-27b-it | LLM model for summarization | | NIM_VISION_MODEL | google/gemma-3-27b-it | Vision model for screenshot extraction | | VISION_FALLBACK_ENABLED | true | Auto-fallback to vision when text extraction fails | | VISION_WORD_THRESHOLD | 30 | Minimum words before triggering vision fallback | | VISION_MAX_IMAGE_DIMENSION | 1280 | Max screenshot dimension before resize | | SEARXNG_HOST | localhost | SearXNG host | | SEARXNG_PORT | 8888 | SearXNG port | | API_HOST | 0.0.0.0 | REST API bind address | | API_PORT | 3000 | REST API port | | MCP_HOST | 0.0.0.0 | Standalone MCP bind address | | MCP_PORT | 3001 | Standalone MCP port |
Project Structure
web_eyes/
├── main.py FastAPI app (REST + mounted MCP)
├── mcp_server.py MCP server with 6 tools
├── run_mcp.py Standalone MCP entry point
├── controller.py Core pipeline logic
├── search.py SearXNG search client
├── crawler.py Crawl4AI web crawler
├── summarizer.py NIM LLM summarization + vision extraction
├── vision.py Image resize and message utilities
├── config.py Environment config
├── logger.py Rich logging
├── docker-compose.yml
├── requirements.txt
└── searxng/
└── settings.yml SearXNG configuration
License
MIT












