find_toolsLABSCO SUMMARY
Trades a lookup call for a smaller context window.
Every MCP server you add taxes every turn, whether or not the task needs it. Routing turns that fixed cost into a variable one: the client carries a handful of broker tools, and the full inventory is queried only when a task actually calls for it. The cost is a hop — the model asks which tool, then calls it — and a dependency stack, since the good selection path wants a container runtime and a vector database running alongside.
What it is
A router for MCP servers. It spawns your child servers, embeds their tool definitions into a vector store, and presents them to a client through a single connection — either proxying every tool under a namespace, or answering natural-language queries about which tool fits the task so the client only ever sees the relevant few.
What you get
- A meta-tool that takes a plain-English
queryand amax_results, and returns the most relevant tools as name, description and owning server — you then call them directly —find_tools - Every child tool still reachable by name, published under a namespaced form that folds a dotted server-and-tool name into one legal MCP identifier and truncates to the 64-character limit the protocol mandates
- Three selection strategies behind that one call: vector similarity over embeddings (the default), selection by a local LLM, and RAG-based selection that pulls in indexed child-server documentation before choosing
- Configuration reuse rather than a second inventory — the servers file takes the same
mcpServersshape your client config already uses, so you can point it straight at your existing Claude Desktop config and re-expose the same children through the routing layer - Resilient startup: if the embedding service, the vector store or the LLM fails to initialize, it logs a warning and keeps going — child tools stay reachable even with nothing else running
- A separate dashboard process with a web UI for watching child-server health and debugging why a given query selected the tools it did
Requirements
No account and no key. Python 3.11+ and uv, which supplies the uvx command the documented config uses. Docker or Apple Container is needed to run Qdrant, which backs vector-based tool selection — optional if you point at an already-running Qdrant or skip routing entirely. LM Studio is optional for local embeddings and LLM-based selection; without it the server falls back to a bundled sentence-transformers model automatically. The project is mcpdeck (version 0.3.0), launched from git with uvx and pointed at your servers file with --mcp-servers-json. Note the split: the stdio path for MCP clients keeps the web UI disabled even if your config enables it, because the dashboard prints to stdout and would corrupt the JSON-RPC channel — use the dashboard command when you want the UI.
Setup effort
One command — uv tool install git+https://github.com/anirudhlath/mcpdeck
USE CASES
Running a dozen MCP servers without paying for all of them every turn
Point the router at your existing client config and let it expose one connection, so tool definitions load on demand instead of at session start.
Finding the right tool in an inventory you no longer remember
Describe the task in plain language and get back the handful of tools that match, with the server each one came from.
Debugging why a tool was or was not selected
Run the dashboard process instead of the stdio server and inspect selection results and child-server health in the web UI.
2 tools
Listed in project docs. Your client may show a different list.
{server_name}__{tool_name}BEFORE YOU INSTALL
What to know first
Tools you get
2 tools named in the project's documentation. Only find_tools belongs to this server; every other tool is a child server's tool named {server_name}__{tool_name}, so the count depends on your mcp-servers.json.
Requires
Python 3.11+
Where it runs
Both documented clients run the server on your machine.
INSTALLATION
Connect your client
Server setup
Prerequisites: Python 3.11+, uv (pipx install uv if needed), and Docker or Apple Container to run Qdrant (optional if you use --no-setup against an existing Qdrant or skip tool-selection routing); LM Studio optional for local embeddings
MCP client path (serve): add the mcpServers block below to claude_desktop_config.json / .mcp.json — uvx fetches the package from git on demand, so there is no separate install step
Create an mcp-servers.json listing the child servers, or point --mcp-servers-json at your existing Claude Desktop config
Restart Claude Desktop / Claude Code after editing the config
Dashboard path (start): uvx --from git+https://github.com/anirudhlath/mcpdeck mcpdeck — or uv tool install git+https://github.com/anirudhlath/mcpdeck then run mcpdeck; web UI at http://localhost:8080
Docker alternative for the dashboard: docker-compose up -d (runs Qdrant + the mcpdeck dashboard built from the repo Dockerfile)
MCP Clients
Claude Desktop, Claude Code
{
"mcpServers": {
"mcpdeck": {
"command": "uvx",
"args": [
"--from",
"git+https://github.com/anirudhlath/mcpdeck",
"mcpdeck",
"serve",
"--mcp-servers-json",
"<YOUR_PATH_TO_MCP_SERVERS>"
]
}
}
}