OpenRouter

Access over 400 AI models from OpenRouter's collection.

Documentation

OpenRouter MCP server

This project connects agents to OpenRouter through two front doors: an agent-first command-line interface and a strict stateless MCP server. Both use the same operation layer and stable response shapes. The MCP server exposes thirteen focused tools and one API-key usage resource.

Version 3.0 targets MCP 2026-07-28 only. Each HTTP POST is independent. The server does not accept initialize, create Mcp-Session-Id sessions, expose a GET event stream, or run a legacy fallback.

What changed in 3.0

  • list_models sends pagination, filters, and sorting to OpenRouter instead of downloading the full catalog.
  • get_model calls OpenRouter's direct model endpoint. It replaces get_model_info; there is no alias.
  • list_model_endpoints returns provider price, context, uptime, latency, throughput, and supported parameters.
  • list_providers exposes provider geography, policy links, and service-status metadata without a browser.
  • list_model_rankings and list_app_rankings expose bounded versions of OpenRouter's public rankings pages.
  • get_credits and list_activity expose account data with a separate management-key boundary.
  • get_analytics_schema and query_analytics expose the current Activity Explore analytics contract with explicit time ranges and bounded results.
  • chat_with_model and compare_models return a generation_id and the resolved model.
  • get_generation uses that ID to fetch exact provider, token, latency, and cost metadata.
  • The openrouter-mcp CLI exposes the same operations directly, emits JSON automatically when piped, and never prompts.
  • Browser inspection informed the surface contract, but no browser, cookie, HAR file, or browser session is required at runtime.
  • openrouter://models and openrouter://pricing were removed. Their unbounded catalog payloads are not retained as fallbacks.
  • Unknown fields added by OpenRouter are stripped at the API boundary. The MCP output schemas remain stable.
  • Static discovery responses declare a one-hour public cache hint. API-key usage remains private with a five-second hint.
  • Model comparisons run at most three OpenRouter calls at once. Paid calls are never retried automatically.
  • Custom OpenRouter base URLs must use HTTPS. Plain HTTP is accepted only for loopback development.

See docs/API.md for the complete tool contract, docs/CLI.md for direct CLI use, and docs/MCP-2026-07-28.md for wire-level behavior.

Requirements

  • Node.js 24 LTS
  • pnpm 12.0.0, exactly as pinned in package.json
  • An OpenRouter API key for rankings, inference, generation metadata, and key-usage data
  • An OpenRouter management key for credit totals, account activity, and analytics

OpenRouter currently serves public model and provider discovery without a key. That anonymous behavior may be rate-limited or changed upstream.

Install

git clone https://github.com/th3nolo/openrouter-mcp.git
cd openrouter-mcp
pnpm install
pnpm run check

pnpm-workspace.yaml waits 72 hours before resolving a release. It also blocks exotic transitive sources and trust downgrades. Only esbuild@0.28.2 may run a dependency lifecycle script.

On Windows, pnpm@12.0.0 does not carry an Authenticode signature. Windows may label it "Unknown publisher." Install it with a method from pnpm's installation guide, and do not weaken Defender or PowerShell execution policy to suppress the warning.

Copy .env.example to .env, then set:

OPENROUTER_API_KEY=your_openrouter_api_key_here
# Optional; required only for get_credits and list_activity
OPENROUTER_MANAGEMENT_KEY=your_openrouter_management_key_here

Keep .env out of Git.

Use the CLI

Build once, then call the same operations without starting an MCP client:

pnpm run build
node dist/cli.js schema
node dist/cli.js models list --q claude --limit 5
node dist/cli.js providers list --datacenter DE
node dist/cli.js rankings models --limit 10
node dist/cli.js account credits
node dist/cli.js analytics schema

Interactive terminals receive compact text or tables. Redirected output is JSON automatically; --json makes that behavior explicit. Diagnostics use stderr, usage failures exit with status 2, operation failures exit with status 1, and commands never prompt. Run the strict stateless server through the same binary with node dist/cli.js serve --transport stdio.

Use with Claude over stdio

stdio is the default transport for local Claude integrations.

pnpm run build
claude mcp add --transport stdio --scope user \
  --env OPENROUTER_API_KEY=your_openrouter_api_key_here \
  openrouter -- node /absolute/path/to/openrouter-mcp/dist/server.js

The equivalent Claude Desktop configuration is in examples/claude-config.json.

Use with Claude over local HTTP

Start the loopback-only server:

pnpm run build
OPENROUTER_API_KEY=your_openrouter_api_key_here pnpm run start:http

On PowerShell:

$env:OPENROUTER_API_KEY = "your_openrouter_api_key_here"
pnpm run start:http

Then register its URL:

claude mcp add --transport http --scope user openrouter http://127.0.0.1:3000/mcp

HTTP mode listens only on 127.0.0.1 and validates the Host and Origin headers. It does not implement a bearer-token shortcut.

Do not expose this listener directly to the internet. Put an HTTPS gateway that implements the MCP OAuth 2.1 resource-server flow in front of it.

Tools

ToolPurposeExternal effect
list_modelsSearch, filter, sort, and page the live model catalogRead-only OpenRouter request
get_modelRead one exact model, variant, or aliasRead-only OpenRouter request
list_model_endpointsCompare the providers serving one modelRead-only OpenRouter request
list_providersFilter providers by name, headquarters, or datacenterRead-only public request
list_model_rankingsRead one completed UTC day of model rankingsRead-only API-key request
list_app_rankingsRead popular or trending public appsRead-only API-key request
get_creditsRead purchased, used, and remaining creditsRead-only management request
list_activityRead endpoint-level daily account activityRead-only management request
get_analytics_schemaDiscover current analytics metrics, dimensions, operators, and granularitiesRead-only management request
query_analyticsQuery bounded Activity Explore aggregates over an explicit time rangeRead-only management request
chat_with_modelGenerate one response and return its generation IDCan consume API credits
compare_modelsGenerate with two to eight models, three calls at a timeCan consume API credits per model
get_generationRead provider, tokens, latency, and cost for one generation IDRead-only authenticated request

Each tool returns a text block and structuredContent. Zod rejects invalid input before the handler runs. The SDK converts upstream failures into MCP tool errors.

Resource

URIDataCache hint
openrouter://usageUsage and limits for the configured API keyPrivate, five seconds

Model and pricing catalogs are tools rather than resources so every response can be filtered and bounded.

Verify the live API

pnpm run test:live

The command always checks live model pagination, direct model lookup, model endpoints, and provider discovery. If OPENROUTER_API_KEY is configured, it also checks both ranking datasets, sends one short request through openrouter/free, and resolves the returned generation metadata. If OPENROUTER_MANAGEMENT_KEY is configured, it checks credits, bounded activity, analytics schema discovery, and a small seven-day analytics query. The report never prints a credential or generation ID.

Environment

VariableDefaultMeaning
OPENROUTER_API_KEYnoneOpenRouter key for rankings, inference, generation metadata, and openrouter://usage
OPENROUTER_MANAGEMENT_KEYOPENROUTER_API_KEYOpenRouter management key for credits, account activity, and analytics
OPENROUTER_BASE_URLhttps://openrouter.ai/api/v1HTTPS OpenRouter API base URL; HTTP is loopback-only
OPENROUTER_SITE_URLnoneOptional HTTP-Referer app attribution
OPENROUTER_APP_NAMEOpenRouter MCP ServerX-OpenRouter-Title attribution
OPENROUTER_TIMEOUT_MS60000Per-request timeout
MCP_TRANSPORTstdiostdio or http
MCP_HTTP_PORT3000Local HTTP port

Command-line --transport and --port values override their environment variables.

Development

pnpm run typecheck
pnpm run lint
pnpm run test
pnpm run build

# Complete release gate
pnpm run check

The deterministic tests cover modern HTTP without initialize, strict legacy rejection, real stdio negotiation, CLI schema output, cache hints, credential separation, upstream and local pagination, direct API routes, generation handles, comparison concurrency, cancellation, schema drift, bounded errors, and HTTPS enforcement. The live contract test is separate because it depends on current network and OpenRouter availability.

Sources

License

MIT