llm-routerBLOCK
Universal LLM router for AI coding tools. Works with Claude Code, Cursor, Codex, Gemini CLI, Copilot and more. Free-first fallback chain cuts costs 35-80%.
Overview
From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.
llm-router
Stop spending your Claude Pro/Max quota on questions a free model can answer.
llm-router hooks into your coding tool's own lifecycle, reads each prompt before the model does, and drafts an answer on a free or local model first. No API keys needed on a Claude subscription — routing runs through MCP tools and local models.
One caveat: routed answers are advisory by default — Claude still takes the turn unless LLMROUTERZEROCLAUDE=1. By default some tool calls wait until a prompt is routed; LLMROUTER_ENFORCE=off turns that off. Draft-rate and acceptance figures live in docs/MEASUREMENT.md, with their n, window and conditions.
13c11eba40eaOBSERVED · 2026-10-07Connect
Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.
claude mcp add llm-routing --env ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY} --env DEEPSEEK_API_KEY=${DEEPSEEK_API_KEY} --env GEMINI_API_KEY=${GEMINI_API_KEY} --env GOOGLE_API_KEY=${GOOGLE_API_KEY} -- npx -y [email protected]{
"mcpServers": {
"llm-routing": {
"command": "npx",
"args": [
"-y",
"[email protected]"
],
"env": {
"ANTHROPIC_API_KEY": "${ANTHROPIC_API_KEY}",
"DEEPSEEK_API_KEY": "${DEEPSEEK_API_KEY}",
"GEMINI_API_KEY": "${GEMINI_API_KEY}",
"GOOGLE_API_KEY": "${GOOGLE_API_KEY}"
}
}
}
}Exposed tools (6)
5 read · 1 write · 0 destructive.
| Tool | Risk | Description |
|---|---|---|
agoragentic_browse | read | Browse available services on the Agoragentic marketplace. |
agoragentic_status | read | Get llm-router agent status on Agoragentic. |
agoragentic_task | write | Execute a task on the Agoragentic capability marketplace. |
agoragentic_wallet | read | Check Agoragentic wallet balance and status. |
bash | read | y |
router | read | llm-router: the last 10 routing decisions (time, model, why, outcome) |
Trust audit
BLOCKgrade F · trust 43/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.
| Layer | What it checks | Result |
|---|---|---|
| L0 | Provenance & inventory | PASS |
| L1 | Static analysis of the code | FAIL |
| L2 | Instruction surface (what it tells the agent) | WARN |
| L3 | Class-specific surface | PASS |
| L4 | Behavioural (sandbox) | SKIPPED |
What the source does
- Filesystem
- declared (12 observation(s))
- Network
- declared (16 observation(s))
- Shell
- declared (7 observation(s))
- Dependencies
- pinned
- Secrets in source
- found
Findings (25)
"id_rsa", "id_ed25519", ".npmrc", ".pypirc", ".netrc",
".env" ... urllib.request
".env" ... urlopen
".env" ... urlopen
dict(os.environ) ... urllib.request
"169.254.169.254", "metadata.google.internal", "metadata",
if host.startswith("169.254.") or host.startswith("fe80:") or "169.254.169.254" in host:a value can (`{"postgresql://u:pw@h/db": "unreachable"}` is a real shapemod = __import__(f"llm_router.invoice_reconciliation.{provider}", fromlist=["pull_monthly_invoice"])fn = getattr(importlib.import_module(mod), attr, None)
importlib.import_module(name)
evidence: float # Σw / (Σw + κ): neighbour share of the score, 0-1
("anthropic_key", "token sk-ant-abcdefghij1234567890abcdefg"),out = force_local_for_pii(chain, "my key is sk-ant-abcdefghij1234567890abcdefg")
"Bearer sk-ant-oat01-Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7"
"Bearer sk-ant-oat01-Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7"
"Bearer sk-ant-oat01-Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7"
"aws_key_id": "AKIAAUDITCANARY00000",
"aws": "AKIA1234567890ABCDEF",
| external webhook (`LLM_ROUTER_ALERT_WEBHOOK`) | n/a (leaves the machine) | Postgres DSN with password | `detail.error` | HTTP POST body captured: `{"event":"budget_postgres_fallback",...,"detail":{""DATABASE_URL": "postgres://u:p@h/db",
DSN = "postgresql://svcuser:[email protected]:5432/prod"
"postgresql://u:pw@h:5432/d",
secret = "sk-proj-MUSTNOTAPPEAR1234567890abcdef"
secret = "sk-ant-DONOTLEAKabcdefghijklmnopqrst"
Gates applied: no_behavioural_pass.
13c11eba40eafull audit observations/trust-audit/mcp-server/ypollak2__llm-router.json · Report an issue / request a re-scanAudit history
Every audit this server has had. A grade with a past is a grade somebody is still checking.
| Date | Source | Verdict | Grade | Score | Change |
|---|---|---|---|---|---|
| 2026-10-07 | 13c11eba40ea | BLOCK | F | 43 | first audit |
Questions
What is the llm-router MCP server?
Universal LLM router for AI coding tools. Works with Claude Code, Cursor, Codex, Gemini CLI, Copilot and more. Free-first fallback chain cuts costs 35-80%.
What tools does llm-router expose?
6 in total: 5 read-only, 1 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.
Is llm-router safe to connect to an agent?
No — not without reading the findings first. The audit graded it F (43/100) and found 8 critical or high issues in the source. Each one is listed on this page with the file and line it is on.
What credentials does llm-router need?
It reads ANTHROPIC_API_KEY, DEEPSEEK_API_KEY, GEMINI_API_KEY, GOOGLE_API_KEY, HELICONE_API_KEY, LLM_ROUTER_BROKER_SECRET_FILE, LLM_ROUTER_CP_ED25519_PRIVATE_KEY, LLM_ROUTER_CP_SIDECAR_TOKEN, LLM_ROUTER_DISABLE_CONTINUATION_BYPASS, LLM_ROUTER_ESCALATE_MIN_PROMPT_TOKENS, LLM_ROUTER_GATEWAY_TOKEN and LLM_ROUTER_HF_TOKENIZERS from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.
How current is this page?
The grade is for one exact copy of the source (13c11eba40ea), read on 2026-10-07. The repository is watched and re-audited when it changes.