Portable Docker MCP Gateway distribution for agent search/research.
One entry for any agent (Cursor, OpenClaw, Codex, cloud VPS):
mcp-search → http://<host>:8812/mcp
No routing facade — backends are exposed as their native MCP tools. Usage policy lives in AGENT.md.
| Layer | Role |
|---|---|
docker/mcp-gateway |
Single streamable-HTTP entry on :8812 |
SearXNG + xbeta/mcp-search |
Always on, no API key |
| Optional Hub MCP images | Tavily / Firecrawl cloud / Brave / ArXiv |
| Optional remotes | Context7, DeepWiki |
Firecrawl is cloud API only (mcp/firecrawl + FIRECRAWL_API_KEY). This stack does not self-host Firecrawl.
git clone git@github.com:atbeta/mcp-search.git
cd mcp-search
cp .env.example .env
# edit SEARXNG_SECRET at minimum
docker compose up -d --build
./scripts/doctor.shPoint the agent client at the gateway:
{
"mcpServers": {
"mcp-search": {
"type": "http",
"url": "http://127.0.0.1:8812/mcp"
}
}
}Default bind is 127.0.0.1:8812 (cloud-safe). For LAN lab only, set MCP_SEARCH_BIND=0.0.0.0 in .env.
# Core (default) — SearXNG only
MCP_SEARCH_SERVERS=searxng-mcp-local
# Full — add keys to .env first
MCP_SEARCH_SERVERS=searxng-mcp-local,tavily,firecrawl,brave,context7-docs,deepwiki,arxiv-mcp-serverThen docker compose up -d (recreate mcp-search if already running).
| Catalog name | Needs |
|---|---|
searxng-mcp-local |
nothing |
tavily |
TAVILY_API_KEY (+ tavily.api_key= same value) |
firecrawl |
FIRECRAWL_API_KEY (+ firecrawl.api_key=) |
brave |
BRAVE_API_KEY (+ brave.api_key=) |
context7-docs |
CONTEXT7_API_KEY |
deepwiki |
none |
arxiv-mcp-server |
docker volume arxiv-papers (compose defines it) |
Gateway secrets file is the same .env (dotted aliases included for Docker MCP Toolkit).
Develop on your laptop (OrbStack/Docker Desktop). Do not build on the server — push Hub, then pull on VPS/lab hosts.
The Hub image xbeta/mcp-search is the SearXNG MCP sidecar used by compose (linux/amd64; full entry is still docker compose up):
# on Mac (docker login as xbeta)
./scripts/push.sh # buildx --platform linux/amd64 --push → xbeta/mcp-search:latest
# on 101 / cloud
docker pull xbeta/mcp-search:latest
docker compose up -d --no-buildCI: see .github/workflows/image.yml.
catalog.yaml Gateway additional catalog
docker-compose.yml valkey + searxng + searxng-mcp + mcp-search
searxng/ SearXNG settings (JSON enabled)
searxng-mcp/ FastMCP HTTP adapter (Dockerfile)
AGENT.md Tool-selection policy for agents
scripts/doctor.sh Smoke tools/list + searxng_search
--allow-unauthenticatedis on for easy agent wiring. Do not expose:8812to the public internet without a reverse proxy + auth (or SSH tunnel).- Prefer loopback bind on VPS; tunnel from your laptop / agent host.
MIT