Domain-neutral MCP router: front many upstream MCP servers behind two meta-tools (search + dispatch) so an agent gets lazy, searchable tool discovery instead of a huge up-front tool payload.
Listed on its own since 2026-09-24. Until then it was part of dhis2w-mcp, where its earlier checks remain.
Wellknown found it in public sources; nobody has proven control of it yet. Claiming takes one click if the repository is under your GitHub account, or a small file on your domain otherwise. Verified owners get the badge, 15-minute checks, status alerts, edits that outrank crawled data, and a ranking boost.
Agents can do it too: POST https://wellknown.network/api/v1/claims with {"agent":"dhis2w-mcp-router","method":"well_known_file"} — machine-readable steps at claim.json, guide at /docs/claim.
Everything here was measured by our prober or read from a registry. Nothing is self-reported.
Attributed to the source that supplied each field. Treated as claims, not facts.
# dhis2w-mcp-router A **domain-neutral MCP router**: front many upstream MCP servers behind two meta-tools so an agent gets **lazy, searchable tool discovery** instead of a huge up-front tool payload. It is the portable, MCP-native equivalent of the Claude Agent SDK's ToolSearch — but it works with *any* MCP client (local models via LM Studio / Ollama / llama.cpp, or cloud agents), not just Claude's SDK. ## Why A big MCP server (e.g. ~337 dhis2-mcp tools) dumps ~49k tokens of tool schemas into context up front — which overflows small local models and costs cloud models on every call. The single-tool `dhis2_cli` bridge avoids that by collapsing everything behind one tool, but then the agent must *discover* a CLI (run `--help`, trial commands) — discovery overhead. The router is the middle ground: | | tool payload | discovery | typed schemas | guardable chokepoint | | --- | --- | --- | --- | --- | | full MCP server | huge (all schemas) | none | yes | per-tool | | single-tool bridge | tiny (1 tool) | high (learn a CLI) | no | yes (1 tool) | | **router (this)** | **tiny (2 meta-tools)** | **low (search)** | **yes (search returns schemas)** | **yes (1 dispatch)** | ## The two tools - `search_tools(query, limit)` — matching tools with their **namespaced** names (`server__tool`) and input schemas. - `call_tool(name, arguments)` — dispatch one tool to its upstream and return the result. `call_tool` is a single chokepoint, so a policy guard sits there — the same security property as the bridge, with typed discovery on top. ## Read-only mode Set `MCP_ROUTER_READONLY=1` (global) or mark a single upstream `"readonly": true` in the config to run read-only: write tools are **hidden from `search_tools`** and **refused by `call_tool`** (a `PermissionError`). Tools are classified by their `readOnlyHint` annotation when present, else by a read-verb heuristic on the tool name (fail-closed). This is how a local model safely drives the surface on a shared host — front `play` …
Mapped onto the structured taxonomy from declared text and observed tool names. Confidence shown for derived entries.
Every source is kept verbatim. Field changes are logged as events.