Skip to main content
Glama
aaryanptl
by aaryanptl
README.md
# openrouter-mcp

An [mcp-use](https://github.com/mcp-use/mcp-use) **MCP App** that lets Claude / ChatGPT reason about OpenRouter's 300+ models — price, context, capabilities, cost and rankings — each tool paired with a React widget in one file, deployable on [Manufact](https://manufact.com).

Everything is powered by one public, key-less endpoint:

```
GET https://openrouter.ai/api/v1/models
```

It returns id, context length, per-token pricing, modalities, supported params and arena/benchmark scores for every model. We fetch it once, cache it 6h, and every tool is a pure transform over that array — **no auth, no pagination.**

## Tools

| Tool | Prompt | What it does |
|---|---|---|
| `model-card` | "what's claude-opus-4.8?" | Price, context, capabilities & arena ELO for one model |
| `compare-models` | "gpt-5 vs sonnet vs deepseek?" | 2–4 models side by side, best value marked per metric |
| `cheapest-for` | "cheapest vision model, 200K+ ctx?" | Filter by needs, sort by input price |
| `cost-estimator` | "cost for 2M in / 0.5M out?" | **Interactive** calculator — tweak tokens, watch the total recompute live |
| `usage-rankings` | "top coding models right now?" | Models ranked by design-arena ELO leaderboard |

## Run locally

```bash
npm install
npm run dev          # server on :3000 + Inspector
```

In the Inspector, call each tool:

```json
{ "model": "claude-opus-4.8" }
{ "models": ["gpt-5", "claude-sonnet-4.6", "deepseek-v4"] }
{ "needs": ["vision"], "minContext": 200000 }
{ "model": "deepseek-v4", "inputTokens": 2000000, "outputTokens": 500000 }
{ "arena": "coding", "limit": 10 }
```

## Structure

```
openrouter-mcp/
├── index.ts               # MCPServer + 5 server.tool(...) defs
├── src/openrouter.ts      # getModels() 6h cache + normalize() + findModel()
└── resources/
    ├── card.tsx           # model-card
    ├── compare.tsx        # compare-models
    ├── cheapest.tsx       # cheapest-for
    ├── cost.tsx           # cost-estimator (interactive React state)
    └── rankings.tsx       # usage-rankings
```

## Deploy on Manufact

1. Push this repo to GitHub.
2. Connect it on [manufact.com](https://manufact.com) via the Manufact GitHub App.
3. **No env vars needed** — the catalog API is public. (Add `OPENROUTER_API_KEY` only if you later add live inference / routing.)
4. Every push auto-deploys with a preview URL, SSL, logs and metrics.

## Notes

- Pricing is a **per-token decimal string** — multiply by `1e6` for $/1M (`src/openrouter.ts`).
- Not every model has arena ELO — widgets guard for `null`.
- `input_modalities` (not `modality`) is the reliable vision/audio signal.
- OpenRouter exposes no clean public JSON for token-share usage, so `usage-rankings` ranks by the real design-arena ELO carried in the same cached `/models` call.