Atlas / MCP servers / ypollak2 / llm-router

llm-routerBLOCK

mcp/ypollak2/llm-router

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%.

Verdict
BLOCK
Grade
F
Trust score
43 /100
Exposed tools
6 5r · 1w · 0d
Transport
—
License
MIT
Stars
94
01

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.

Read from source at commit 13c11eba40eaOBSERVED · 2026-10-07
Advertisement
02

Connect

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-code
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]
claude-desktop
{
  "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}"
      }
    }
  }
}
03

Exposed tools (6)

5 read · 1 write · 0 destructive.

ToolRiskDescription
agoragentic_browsereadBrowse available services on the Agoragentic marketplace.
agoragentic_statusreadGet llm-router agent status on Agoragentic.
agoragentic_taskwriteExecute a task on the Agoragentic capability marketplace.
agoragentic_walletreadCheck Agoragentic wallet balance and status.
bashready
routerreadllm-router: the last 10 routing decisions (time, model, why, outcome)
04

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.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)WARN
L3Class-specific surfacePASS
L4Behavioural (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)

HIGHFilesystem / path · fs.credential_store · CWE-22, CWE-59
src/llm_router/capabilities.py:278
"id_rsa", "id_ed25519", ".npmrc", ".pypirc", ".netrc",
Why it matters. touches a credential store
HIGHNetwork egress · net.env_exfil · CWE-200, CWE-319
.claude/hooks/auto-route.py:33
".env" ... urllib.request
Why it matters. reads secrets in the same file that sends data out
HIGHNetwork egress · net.env_exfil · CWE-200, CWE-319
hooks/auto-route.py:342
".env" ... urlopen
Why it matters. reads secrets in the same file that sends data out
HIGHNetwork egress · net.env_exfil · CWE-200, CWE-319
src/llm_router/hooks/auto-route.py:342
".env" ... urlopen
Why it matters. reads secrets in the same file that sends data out
HIGHNetwork egress · net.env_exfil · CWE-200, CWE-319
src/llm_router/seats.py:287
dict(os.environ) ... urllib.request
Why it matters. reads secrets in the same file that sends data out
HIGHNetwork egress · net.metadata_ip · CWE-200, CWE-319
src/llm_router/config.py:125
"169.254.169.254", "metadata.google.internal", "metadata",
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
HIGHNetwork egress · net.metadata_ip · CWE-200, CWE-319
src/llm_router/config.py:130
if host.startswith("169.254.") or host.startswith("fe80:") or "169.254.169.254" in host:
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
HIGHHard-coded secrets · secret.db_uri · CWE-798, CWE-321
src/llm_router/alerts.py:46
a value can (`{"postgresql://u:pw@h/db": "unreachable"}` is a real shape
MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
src/llm_router/commands/invoice.py:65
mod = __import__(f"llm_router.invoice_reconciliation.{provider}", fromlist=["pull_monthly_invoice"])
MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
src/llm_router/proxy/backends.py:142
fn = getattr(importlib.import_module(mod), attr, None)
MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
src/llm_router/server.py:402
importlib.import_module(name)
MEDIUMObfuscation / stealth · obf.homoglyph · CWE-506, CWE-94
src/llm_router/complexity_knn.py:221
evidence: float  # Σw / (Σw + κ): neighbour share of the score, 0-1
MEDIUMHard-coded secrets · secret.anthropic · CWE-798, CWE-321
_quarantined_tests/test_signals.py:9
("anthropic_key", "token sk-ant-abcdefghij1234567890abcdefg"),
MEDIUMHard-coded secrets · secret.anthropic · CWE-798, CWE-321
_quarantined_tests/test_signals.py:55
out = force_local_for_pii(chain, "my key is sk-ant-abcdefghij1234567890abcdefg")
MEDIUMHard-coded secrets · secret.anthropic · CWE-798, CWE-321
tests/fixtures/proxy/golden_off.json:96
"Bearer sk-ant-oat01-Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7"
MEDIUMHard-coded secrets · secret.anthropic · CWE-798, CWE-321
tests/fixtures/proxy/golden_off.json:228
"Bearer sk-ant-oat01-Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7"
MEDIUMHard-coded secrets · secret.anthropic · CWE-798, CWE-321
tests/fixtures/proxy/golden_off.json:360
"Bearer sk-ant-oat01-Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7Gx7"
MEDIUMHard-coded secrets · secret.aws · CWE-798, CWE-321
tests/test_r1_scrub_before_persistence.py:37
"aws_key_id":  "AKIAAUDITCANARY00000",
MEDIUMHard-coded secrets · secret.aws · CWE-798, CWE-321
tests/test_sec01_shared_scrubber.py:31
"aws": "AKIA1234567890ABCDEF",
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
audit/12_PRIVACY_AUDIT.md:53
| 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":{"
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
tests/security/test_agentic_env_isolation.py:34
"DATABASE_URL": "postgres://u:p@h/db",
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
tests/test_r2_nothing_leaves_unscrubbed.py:27
DSN = "postgresql://svcuser:[email protected]:5432/prod"
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
tests/test_r2_nothing_leaves_unscrubbed.py:127
"postgresql://u:pw@h:5432/d",
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
tests/qa/test_integrity.py:278
secret = "sk-proj-MUSTNOTAPPEAR1234567890abcdef"
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
tests/qa/test_integrity.py:286
secret = "sk-ant-DONOTLEAKabcdefghijklmnopqrst"

Gates applied: no_behavioural_pass.

Audited 2026-10-07 · audit v0.4.1 · source sha 13c11eba40eafull audit observations/trust-audit/mcp-server/ypollak2__llm-router.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-0713c11eba40eaBLOCKF43first audit
06

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.

Advertisement