dxt-openrouter-router
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@dxt-openrouter-routerroute research_long_context low energy"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
DXT OpenRouter Router
A tiny MCP (stdio) server that returns a ready-to-send OpenRouter request body from a named preset and your current energy budget:
| Model slug becomes | Meaning |
|
| cheapest provider serving that model |
|
| the model's default provider |
|
| highest-throughput provider |
Two things make this different from a normal cost router:
It routes on energy, not just cost. The input is a fact about you, not about the task. "Cheap" and "fast" are the same axis viewed from different energy levels.
Zero Data Retention is the default. Every body ships
provider.data_collection: "deny", so a preset has to explicitly opt out of privacy rather than opt in to it.
It builds the request. It does not send it — so it never needs your API key in-process, and never sees a response.
Install
npm install -g dxt-openrouter-routerOr run it without installing:
npx dxt-openrouter-routerRelated MCP server: mcp-openrouter
Register it with an MCP host
Claude Desktop (claude_desktop_config.json) or any MCP client:
{
"mcpServers": {
"openrouter-router": {
"command": "npx",
"args": ["-y", "dxt-openrouter-router"],
"env": {
"ROUTING_PRESETS_PATH": "C:\\path\\to\\routing.presets.json"
}
}
}
}ROUTING_PRESETS_PATH is optional — omit it and the bundled routing.presets.json is used. The file is re-read on every call, so you can edit presets without restarting the host.
The routeLLM tool
Argument | Required | Description |
| ✅ | A key from |
|
| |
| The user message to place in the body | |
| Overrides the preset's own system prompt | |
| Extra body fields merged in last, e.g. |
Example
// call
{ "preset": "research_long_context", "energy": "low", "user_prompt": "Synthesize these sources..." }// result
{
"url": "https://openrouter.ai/api/v1/chat/completions",
"method": "POST",
"headers": {
"Authorization": "Bearer $OPENROUTER_API_KEY", // literal placeholder — never your real key
"Content-Type": "application/json"
},
"api_key_configured": true,
"body": {
"temperature": 0.2,
"model": "meta-llama/llama-3.1-70b-instruct:floor",
"messages": [
{ "role": "system", "content": "You are a careful research synthesist. ..." },
{ "role": "user", "content": "Synthesize these sources..." }
],
"provider": { "data_collection": "deny" }
}
}Presets
routing.presets.json is a plain map of name → preset:
{
"presets": {
"daily_driver": {
"model": "google/gemini-3.6-flash", // no :floor/:nitro here — energy adds that
"description": "Default workhorse — unit tests, refactors, docs, CLI loops.",
"system": "Optional default system prompt.",
"provider": { "data_collection": "deny" }, // merged over the ZDR default
"response_format": { "type": "json_object" }, // passed straight through
"params": { "temperature": 0.4 } // any other OpenRouter body field
}
}
}Bundled presets mirror a simple decision tree:
Preset | Model | Reach for it when |
|
| formats, clarifications, vibe checks |
|
| ~80% of volume — tests, refactors, docs |
|
| math, symbolic logic, formal reasoning |
|
| architecture, nuanced review, agentic work |
|
| long-context synthesis across sources |
|
| extraction that must return parseable JSON |
Slugs were verified against https://openrouter.ai/api/v1/models on 2026-07-22. OpenRouter slugs change as models ship — re-check before relying on them.
Secrets
🔒 This package contains no API key, and the tool output never includes one.
OPENROUTER_API_KEYis read from the environment, and only ever reported as the booleanapi_key_configured.The
Authorizationheader is emitted as the literal stringBearer $OPENROUTER_API_KEY, so tool output is safe to paste into a chat log, an issue, or a commit.Copy
.env.example→.envfor local use..envis gitignored.
Use as a library
The pure core is exported, so you can build bodies without MCP:
import { buildRequestBody, loadPresets } from "dxt-openrouter-router";
const presets = loadPresets("./routing.presets.json");
const body = buildRequestBody(presets, { preset: "daily_driver", energy: "low" });Develop
npm install
npm run build # tsc -> dist/
npm test # node --test test/License
MIT © Sasha Philius
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/sphilius/dxt-openrouter-router'
If you have feedback or need assistance with the MCP directory API, please join our Discord server