Atlas / MCP servers / ypollak2 / LLM Router

LLM RouterBLOCK

mcp/ypollak2/llm-router-2

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
38 /100
Exposed tools
6 5r · 1w · 0d
Transport
—
License
MIT
Stars
95
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 13493fe7e4c4OBSERVED · 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 38/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)PASS
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:355
".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:355
".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:143
fn = getattr(importlib.import_module(mod), attr, None)
MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
src/llm_router/server.py:403
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 13493fe7e4c4full audit observations/trust-audit/mcp-server/ypollak2__llm-router-2.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-0713493fe7e4c4BLOCKF38first 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 (38/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 (13493fe7e4c4), read on 2026-10-07. The repository is watched and re-audited when it changes.

Advertisement