One MCP server that can call any MCP server.
Stop hand-configuring servers one by one. mcp-anything indexes the MCP registries locally — tens of thousands of servers — and gives your model five small meta-tools to search, inspect, and execute any of them on the fly. Your context window never sees more than that.
npx mcp-anything serve
user › what's the weather in Tel Aviv? save it to a note ⚒ search_mcp_servers({ query: "weather forecast" }) → io.github.acme/weather score 144.4 · streamable-http · ★ 1.2k ⚒ list_mcp_tools({ server: "io.github.acme/weather" }) → get_forecast(city, days) · 2 more tools ⚒ call_mcp_tool({ server: "…/weather", tool: "get_forecast", arguments: { city: "Tel Aviv" } }) ⚡ connected on demand — session pooled for reuse → 31°C, clear skies, humidity 68% assistant › Saved. 31°C and clear in Tel Aviv — note created.
Constant context cost, unbounded reach
Loading many MCP servers into a host burns the context window: every tool schema rides along on every request. mcp-anything inverts that. The model sees five meta-tools — nothing else — and discovers capabilities in two phases: search the local index first, then fetch the real schemas for just the one server it needs.
The index is built from four catalogs, deduplicated by repository and package identity, and ranked by BM25 relevance with a log-scaled popularity boost — so the maintained implementation of a capability outranks the hundredth abandoned clone.
search_mcp_serversBM25 + popularity search over the whole indexdescribe_mcp_servertransports, env vars, secrets, policy verdictlist_mcp_toolslive connect — real tools with JSON schemascall_mcp_toolexecute; sessions pooled and reusedsync_registryrefresh the index (auto-refreshed on TTL)Dangerous by nature, conservative by default
Letting a model reach arbitrary servers from a public catalog is a real attack surface. Every relaxation in mcp-anything is explicit and yours to make:
SSRF guard · on by default
Registry entries pointing at loopback, private ranges, or cloud metadata endpoints (169.254.169.254) are refused. Plain http too.
No arbitrary code execution · stdio off by default
Spawning npm/pypi packages is disabled until you enable it — and then only for an explicit per-package allowlist, version-pinned.
Secrets stay yours · never indexed
API keys live in your local config only, injected at connect time. Never cached, never searchable, never shown to the model.
Untrusted output, labeled · always
Downstream results and tool descriptions are marked as third-party data — a mitigation for tool-poisoning, not a cure. Read SECURITY.md.
Two commands, then just ask
# Claude Code claude mcp add anything -- npx -y mcp-anything serve # Claude Desktop / Cursor / any MCP host — add to your MCP config: { "mcpServers": { "anything": { "command": "npx", "args": ["-y", "mcp-anything", "serve"] } } } # Optional: widen the index beyond the official registry (~/.config/mcp-anything/config.json) { "sources": ["official", "pulsemcp", "npm", "glama"] }
Then ask your model for a capability, not a server: "find something that can query Postgres and run a schema dump." Discovery is its job now.
How this differs from what exists
- Gateways like MetaMCP aggregate servers you already configured. mcp-anything discovers servers you've never heard of.
- Hosted routers like Composio's Rube route to their own curated cloud catalog. mcp-anything is local-first, catalog-neutral, and works against a private registry too.
- Native tool search in hosts searches tools already connected. mcp-anything extends the same two-phase pattern to the entire public ecosystem.