Skip to main content

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 read-only and local read-write in the same config.

Config

Point it at any MCP servers via a JSON config (env MCP_ROUTER_CONFIG, default mcp-router.json):

{
  "servers": [
    {"name": "dhis2", "command": "uv", "args": ["run", "--directory", "/repo", "dhis2w-mcp"],
     "env": {"DHIS2_PROFILE": "play42"}}
  ]
}

Run it as a stdio MCP server: uv run dhis2w-mcp-router.

Ranking

search_tools ranking is pluggable. The default KeywordRanker scores by query-term hits (no deps). Add an embeddings block (url + model, an OpenAI-compatible /v1/embeddings endpoint — e.g. a local embedder in LM Studio / Ollama) to rank by semantic similarity instead, which fixes keyword mis-ranks (e.g. "data element count" → metadata_count first). It is not a silver bullet on terse queries with a small local embedder; a larger embedder or a hybrid is the further upgrade.

Status

Published to PyPI from 1.2.0, in lockstep with the rest of the dhis2w-* workspace. The core (core.py) is domain-neutral (FastMCP + httpx only, no dhis2w-* imports), so the same code could also extract to a standalone mcp-router repo without a rewrite. Whether the router should become the default MCP surface for all clients (not just small local models) is still gated on the bench-router numbers — see the roadmap.

Release files for dhis2w-mcp-router 1.18.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for dhis2w-mcp-router 1.18.0
File Size Uploaded
dhis2w_mcp_router-1.18.0.tar.gz 9.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for dhis2w-mcp-router 1.18.0
File Interpreter ABI Platform
dhis2w_mcp_router-1.18.0-py3-none-any.whl Python 3 none any Details

Total release size: 21.5 kB

Release files / dhis2w_mcp_router-1.18.0.tar.gz

Download URL dhis2w_mcp_router-1.18.0.tar.gz
Size 9.1 kB
Tags Source
SHA-256 checksum
How to use checksums
08ecbc68b43a960f8790b2cfc19e2be8899bc70c26249afbdc657509216ce74e
BLAKE2b-256 checksum
How to use checksums
742e9e3537ffd603aa959bcd99657af8184bb87cea1d9a0e28dd54075a7f6cc2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 11, 2026.

Transparency log

Release files / dhis2w_mcp_router-1.18.0-py3-none-any.whl

Download URL dhis2w_mcp_router-1.18.0-py3-none-any.whl
Size 12.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
a91c3431b899ee9c60c451622aa46a604a38d20cce5e2778e2b205047f7d2c00
BLAKE2b-256 checksum
How to use checksums
204db03b45b5548d2059b4b93f90a0d4701e0c994b3f8e1bceaeb17cc862ff19
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 11, 2026.

Transparency log

Release history Release notifications | RSS feed

1.24.1

2 release files

1.24.0

2 release files

1.23.0

2 release files

1.22.0

2 release files

1.21.0

2 release files

1.20.0

2 release files

1.19.0

2 release files

This release

1.18.0 This release

2 release files

1.17.0

2 release files

1.16.0

2 release files

1.15.0

2 release files

1.14.0

2 release files

1.9.0

2 release files

1.8.3

2 release files

1.8.2

2 release files

1.8.1

2 release files

1.8.0

2 release files

1.7.0

2 release files

1.6.0

2 release files

1.5.0

2 release files

1.3.0

2 release files

1.2.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page