Openrouter Admin

io.github.ovironPublished by GitHub account ovironv0.7.3Updated Oct 24, 2026

MCP server for OpenRouter management API: credits, key CRUD, activity drill-down, dashboard.

Overview

AI-generated overview

An MCP server that lets an assistant inspect and, when enabled, manage an OpenRouter account: credits, inference keys, guardrails, usage and model pricing.

What you can do
Read account credits, the current provisioning key, and all inference keys with limits and expiry, plus a one-shot overview dashboard of credits, active keys and today's burn by model. Drill into usage over the last 30 days with filters and aggregation by model, day, provider or key, and look up a single generation by its id. Browse the model catalog, per-model details, per-provider endpoints with pricing and uptime, and ZDR-compliant endpoints. List guardrails, their details and key/member assignments, and list organization members. When write tools are enabled, create, update and delete inference keys and guardrails, and bulk-assign or unassign guardrails to keys and members.
When to use it
Useful when you want to check OpenRouter spend, find which keys or models burned credits, compare model pricing and endpoints, or manage keys and spending guardrails from a chat client instead of the web dashboard.
Requirements
Runs locally over stdio via npx or a global npm install (Node.js required). Needs an OpenRouter Provisioning API key in the OPENROUTER_PROVISIONING_KEY environment variable; this key is distinct from inference keys. Write tools additionally require OPENROUTER_ADMIN_ALLOW_WRITE set to 1. Network access to the OpenRouter API over HTTPS.
Before you install
The provisioning key can manage the whole account, so treat it as sensitive; it is sent only to the OpenRouter API. Write tools are off by default to avoid prompt-injected key changes; enabling them allows creating, changing and permanently deleting keys and guardrails, and newly created key secrets are shown once and cannot be retrieved later. The server returns raw fields without flagging anomalies.

Installation

In SourceWeft

  1. Open Openrouter Admin in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

openrouter-admin-mcp

[npm version] [npm downloads] [CI] [MCP Registry] [Node] [License: MIT]

MCP server for the OpenRouter management API — programmatic control of credits, inference keys, guardrails, organization members, and usage analytics from inside Claude Code, Claude Desktop, Cursor, or any MCP-compatible client.

[demo]

Read-only by default. Destructive write operations are gated behind an opt-in env flag.

This is not an inference proxy. It uses an OpenRouter Provisioning API key, which can manage your account but cannot make completion calls.

Why

OpenRouter's UI is solid for one-off tweaks, but checking spend across keys, drilling into per-model/per-day usage, configuring account-wide guardrails, or rotating limits requires a lot of clicking. This server exposes those operations as MCP tools — Claude can answer "what burned my credits this week?", "create a temporary key with a $0.30 daily cap", or "bind the new prod key to our daily-$50 guardrail" in a single turn.

Features

26 tools wrapping the OpenRouter management API:

  • or_overview — one-shot dashboard: credits + active keys (with reset/expiration) + today's UTC burn by model.
  • Inference key CRUD including limit_reset (daily/weekly/monthly) and expires_at.
  • Guardrails CRUD — account-wide spending limits with provider/model allowlists, ZDR enforcement. Bulk-assign to keys or org members.
  • Activity drill-down — aggregate by_model, by_day, by_provider, or by_key. Token-level breakdown (prompt / completion / reasoning) per row.
  • Generation lookup — fetch any single inference call by gen-… id (cost, tokens, latency, finish reason).
  • Model & endpoint discovery — current pricing per 1M tokens, per-provider uptime, ZDR-compliant endpoints.

Plumbing: HTTP retry on 429/5xx with Retry-After support, in-session GET cache, write invalidation. Returns raw fields — interpretation is left to the agent.

Install

One-click

[Install in VS Code] [Install in Cursor]

Replace the placeholder sk-or-v1-... with your real key after install.

Manual

Run via npx (no install needed) or install globally:

bash
npx -y openrouter-admin-mcp# ornpm install -g openrouter-admin-mcp

Configuration

Create a Provisioning key at https://openrouter.ai/settings/provisioning, then add the server to your MCP client config.

Claude Code (~/.claude.json) or Claude Desktop (claude_desktop_config.json):

json
{  "mcpServers": {    "openrouter-admin": {      "command": "npx",      "args": ["-y", "openrouter-admin-mcp"],      "env": {        "OPENROUTER_PROVISIONING_KEY": "sk-or-v1-..."      }    }  }}

Restart your client to load the server. By default this gives read-only access — to enable key creation, mutation, and deletion, see Enabling write tools below.

Enabling write tools

Destructive operations (or_key_create, or_key_update, or_key_delete) are disabled by default to prevent accidental key mutation through prompt-injected tool calls. Add OPENROUTER_ADMIN_ALLOW_WRITE to your env block to enable them:

json
"env": {  "OPENROUTER_PROVISIONING_KEY": "sk-or-v1-...",  "OPENROUTER_ADMIN_ALLOW_WRITE": "1"}

The server logs which mode it started in:

openrouter-admin-mcp running on stdio (write tools: ENABLED)

Read tools (or_overview, or_credits, or_current_key, or_keys_list, or_key_get, or_activity) are always available regardless of this flag.

Tools

Read (always available)

ToolPurpose
or_overviewOne-shot dashboard: credits + active keys + today's burn by model.
or_creditsAccount balance: total purchased, total used, remaining.
or_current_keyMetadata of the Provisioning key the server is using.
or_keys_listAll inference keys with usage, limits, reset cadence, expiration.
or_key_getDetailed view of one key by hash.
or_activityUsage for the last 30 UTC days. Filters: date, api_key_hash, user_id. Aggregations: none, by_model, by_day, by_provider, by_key.
or_generationFetch a single inference call by its gen-… id (cost, tokens, latency, finish reason).
or_modelsModel catalog with per-1M pricing, context length, modalities. Filterable.
or_model_getFull details for one model id.
or_model_endpointsPer-provider endpoints for a model: pricing, uptime, status.
or_models_userModels filtered by your account's privacy/guardrail settings.
or_zdr_endpointsZDR-compliant endpoints for privacy-constrained workflows.
or_guardrails_listAll guardrails: limit_usd, reset, allow/block lists, ZDR.
or_guardrail_getFull details for one guardrail.
or_guardrails_assignmentsComposite — which keys/members are bound to which guardrail.
or_org_membersMembers of the OpenRouter organization (Management-key + org account).

Write (opt-in via OPENROUTER_ADMIN_ALLOW_WRITE=1)

ToolPurpose
or_key_createCreate a new inference key. Returns the one-time secret.
or_key_updateUpdate name / disabled / limit / limit_reset / expires_at.
or_key_deletePermanently delete a key.
or_guardrail_createCreate a guardrail.
or_guardrail_updateUpdate a guardrail.
or_guardrail_deleteDelete a guardrail.
or_guardrail_assign_keys / _unassign_keysBulk-(un)assign a guardrail to inference keys.
or_guardrail_assign_members / _unassign_membersBulk-(un)assign a guardrail to org members.

Example — create a daily-capped temporary key

> Create a key called "scratch" with a $0.50 daily limit that expires in 30 days.
[Claude calls or_key_create with:  name="scratch",  limit=0.50,  limit_reset="daily",  expires_at="2026-05-25T00:00:00Z"]
Created key **scratch**Hash: f7a3...Limit: $0.5 (resets daily)Expires: 2026-05-25T00:00:00Z
Secret: `sk-or-v1-...`⚠️ This secret cannot be retrieved later — store it now.

Example — diagnose a cost spike

> Why did my OpenRouter spend jump yesterday?
[Claude calls or_activity with date="2026-04-24", aggregate="by_model"]
Activity: 47 rows | total $0.8570 | 305 reqBy model (top 5):- xiaomi/mimo-v2-flash      $0.5240 | 178 req | 24 rows- anthropic/claude-haiku-4.5 $0.2105 | 39 req  | 5 rows- ...

Example — bind a key to an account-wide guardrail

> Cap our prod-bot key at the daily-$50 guardrail.
[Claude calls or_guardrails_list, finds gr_prod_daily_50, then or_guardrail_assign_keys with id="gr_prod_daily_50", hashes=["…"]]
Assigned guardrail `gr_prod_daily_50` to 1 key(s).

Design

The server returns raw API fields. It does not flag what's "near limit", what's an "anomaly", or what the agent should do — that's the agent's job. Composite tools (or_overview, or_guardrails_assignments) merge multiple endpoints into one workflow response, but they don't interpret. Rationale: production MCP servers (Stripe, GitHub, Linear) follow the same pattern.

Data handling

  • The Provisioning key is read from the OPENROUTER_PROVISIONING_KEY environment variable and forwarded only to https://openrouter.ai/api/v1/* over HTTPS.
  • The server is stateless across restarts. An in-session GET cache (60s TTL on /credits, /key, /keys, /keys/{hash}) is held in memory only and dropped on shutdown.
  • The key never appears in error messages or tool output (verified by tests).

Development

bash
git clone https://github.com/oviron/openrouter-admin-mcp.gitcd openrouter-admin-mcpnpm installnpm run build      # compile TypeScript + chmod +x build/index.jsnpm test           # vitest, 84 unit tests, mocked fetch

Project layout:

src/  client.ts            # OpenRouterClient — fetch wrapper, retry, in-session cache  index.ts             # MCP server entry — registers tool groups  tools/    credits.ts         # or_credits, or_current_key    keys.ts            # or_keys_list, _get, _create, _update, _delete    activity.ts        # or_activity (5 modes incl. by_key)    overview.ts        # or_overview composite    generation.ts      # or_generation    models.ts          # or_models, _model_get, _model_endpoints, _models_user, _zdr_endpoints    guardrails.ts      # or_guardrails_list/_get/CRUD/bulk-assign + composite assignments    organization.ts    # or_org_memberstest/  client.test.ts, credits.test.ts, keys.test.ts,  activity.test.ts, overview.test.ts, generation.test.ts,  models.test.ts, guardrails.test.ts, organization.test.ts,  registration.test.ts, helpers.ts, smoke.test.ts

License

MIT — see LICENSE.

Source: README.md at commit 66e660a

Tools

0
SourceWeft has not started this package in its sandbox yet, so its tools are not known.

Version history

1
  1. v0.7.3LatestSep 16, 2026

Score

50% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts

    Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.

  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listed15 pts

    Answer tools/list without a credential, or ship a package that starts in a sandbox without one.

  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts