D
datolabs-io/mcp-toolsearch-proxy
MCP server that puts search_tools, describe_tool and the call tools in front of a large MCP tool catalog
View on GitHub ↗Link checked 2026-11-12 · HTTP 200 · opens the vendor's own site
We have neither an install command nor a public remote endpoint from this repository, so we do not print a config. A made-up one is worse than none. How each client wires MCP up →
- Star count
- 5 ★ · datolabs-io/mcp-toolsearch-proxy · read from the GitHub search API · (checked 2026-11-13 20:00:50)
- Source
- read directly from its GitHub page · type: open-source project
- Harvest history
- first seen 2026-11-04 · last seen 2026-11-14 · seen 11× · listed by 1 sources
- Score
- score 103 · 5 ★ · 1 sources · repo
FAQ (answers come from our records)
Who is it for?
We filed it under these tags: MCP 服务. The tags come from the entry itself, not a taxonomy we imposed.
Who maintains it?
repository
datolabs-io/mcp-toolsearch-proxy;first catalogued 2026-11-04;last seen 2026-11-14。There is no official certification or quality rating here — we record sources and dates only.# mcp-toolsearch-proxy
以下摘录自该仓库的 README(片段) · 在 GitHub 读完整 README →
mcp-toolsearch-proxy lets a model use hundreds or thousands of MCP tools without loading them. On 500 tools, each
request carries 97% fewer tokens of tool definitions, a task costs about half as much, and the model reaches the right
tool nearly as often as with every tool loaded (benchmarks).
It is an MCP server that puts five tools in front of an MCP server with far too many
to list to a model, such as a gateway that aggregates dozens of servers:
| Tool | Does |
| searchtools | finds the tools that can do what a query describes, with the input schemas of the best few, for up to 5 queries at once; with the built-in model, in English, Lithuanian or any of 100 other languages |
| describetool | returns the full description and input schema of up to 10 tools |
| callreadtool | calls a tool the upstream marks read-only, and refuses any other |
| callreadtools | calls up to 10 read-only tools at once, in parallel, with a result for each (-max-batch-calls; 0 leaves it out) |
| callwritetool | calls any tool, for those that may create, change or delete something |
A catalog of a thousand tools costs a model over 100,000 tokens of tool definitions before it does anything, and many
clients cap how many tools they load anyway. Behind the proxy, the model sees five, in 1,735 tokens.
A call whose arguments do not fit the tool's input schema (a required property missing, a wrong type, a value outside
an enum) is refused before it reaches the upstream, with what is wrong and the schema, so the model can fix it at once.
The same goes for an unknown name that is clearly a typo of one tool, and for an upstream that answers invalid params.
Calls come in separate tools so that a client can tell them apart: callreadtool and callreadtools are marked
read-only and can be allowed to run without asking, while callwritetool is marked destructive and can keep asking
every time. Writes are never batched, so each keeps its own approval. A tool counts as
read-only only when the upstream server marks it so (readOnlyHint); unmarked tools are writes, and so are any the
operator lists in -write-tools. Allowing callreadtool allows every read-only tool of every server behind the
upstream, including servers added later; docs/clients.md says what that grant covers and how to set
up claude.ai and Claude Code.
text
client ──▶ gateway /mcp/search ──▶ mcp-toolsearch-proxy ──▶ gateway /mcp/all ──▶ MCP servers
## How it works
The proxy has no credentials. Each request it sends upstream carries the caller's Authorization header and nothing
else, so the upstream server (usually the same gateway, on another route) authenticates and authorizes the caller as
if they had come directly. Whatever the caller isn't allowed to see or call, the proxy can't see or call either.
Each caller gets their own catalog: the tools the upstream lists for that caller. It is kept for ten minutes, then
listed again in the background while the old one is still used, and it is looked up by a hash of the token. A claim
inside the token, such as sub, would be easier to key on but can't be trusted without verifying the token, so the
proxy doesn't use one.
Search combines two rankings. BM25 matches words in tool names, descriptions and parameters, with Lithuanian and
request carries 97% fewer tokens of tool definitions, a task costs about half as much, and the model reaches the right
tool nearly as often as with every tool loaded (benchmarks).
It is an MCP server that puts five tools in front of an MCP server with far too many
to list to a model, such as a gateway that aggregates dozens of servers:
| Tool | Does |
| searchtools | finds the tools that can do what a query describes, with the input schemas of the best few, for up to 5 queries at once; with the built-in model, in English, Lithuanian or any of 100 other languages |
| describetool | returns the full description and input schema of up to 10 tools |
| callreadtool | calls a tool the upstream marks read-only, and refuses any other |
| callreadtools | calls up to 10 read-only tools at once, in parallel, with a result for each (-max-batch-calls; 0 leaves it out) |
| callwritetool | calls any tool, for those that may create, change or delete something |
A catalog of a thousand tools costs a model over 100,000 tokens of tool definitions before it does anything, and many
clients cap how many tools they load anyway. Behind the proxy, the model sees five, in 1,735 tokens.
A call whose arguments do not fit the tool's input schema (a required property missing, a wrong type, a value outside
an enum) is refused before it reaches the upstream, with what is wrong and the schema, so the model can fix it at once.
The same goes for an unknown name that is clearly a typo of one tool, and for an upstream that answers invalid params.
Calls come in separate tools so that a client can tell them apart: callreadtool and callreadtools are marked
read-only and can be allowed to run without asking, while callwritetool is marked destructive and can keep asking
every time. Writes are never batched, so each keeps its own approval. A tool counts as
read-only only when the upstream server marks it so (readOnlyHint); unmarked tools are writes, and so are any the
operator lists in -write-tools. Allowing callreadtool allows every read-only tool of every server behind the
upstream, including servers added later; docs/clients.md says what that grant covers and how to set
up claude.ai and Claude Code.
text
client ──▶ gateway /mcp/search ──▶ mcp-toolsearch-proxy ──▶ gateway /mcp/all ──▶ MCP servers
## How it works
The proxy has no credentials. Each request it sends upstream carries the caller's Authorization header and nothing
else, so the upstream server (usually the same gateway, on another route) authenticates and authorizes the caller as
if they had come directly. Whatever the caller isn't allowed to see or call, the proxy can't see or call either.
Each caller gets their own catalog: the tools the upstream lists for that caller. It is kept for ten minutes, then
listed again in the background while the old one is still used, and it is looked up by a hash of the token. A claim
inside the token, such as sub, would be easier to key on but can't be trusted without verifying the token, so the
proxy doesn't use one.
Search combines two rankings. BM25 matches words in tool names, descriptions and parameters, with Lithuanian and
Listed badge (optional)
Copy this line into the README if you want the listing mark. Optional, and it does not affect being listed.
[](https://anclum.com/en/s/datolabs-io-mcp-toolsearch-proxy/)
- Source
- github · https://github.com/datolabs-io/mcp-toolsearch-proxy
- Browse by field
- MCP servers
- Traction
- 5 ★
- added
- today
More like this
Filed under
Every tag opens the full list for that filter. Counts are the live catalogue figures.