Switchback MCP
# Switchback MCP
> MCP server for [Switchback](https://github.com/VibeKit-Bot/vibekit-switchback) — classify AI agent turns by complexity and pick the cheapest model that can handle them. Drop-in for Claude Desktop, Cursor, Cline, and any MCP client.
[](https://www.npmjs.com/package/vibekit-switchback-mcp)
[](https://vibekit.bot/switchback)
> Built by [VibeKit](https://vibekit.bot) — same cascade router that powers every "Auto" turn in our hosted product. [Learn more →](https://vibekit.bot/switchback)
## What it does
Exposes two tools over the Model Context Protocol:
- **`classify_turn`** — given a user message, returns `{tier: 0|1|2, why, fallback, durationMs}`. Use it when you're deciding whether to spend on a flagship model or stay on a cheap one for the next agent step.
- **`recommend_model`** — given a user message + a ladder of models (cheap → flagship), returns the cheapest model on the ladder that can plausibly handle it. Convenience wrapper around `classify_turn`.
Both tools fire a single small-model call via OpenRouter (default: `openai/gpt-5.4-mini`, ~$0.0001/call). Fail-soft: any error returns tier 1 with `fallback: true` rather than blocking your agent.
## Install
```bash
npm install -g vibekit-switchback-mcp
```
## Configure
Set your OpenRouter key (get one at https://openrouter.ai/keys):
```bash
export OPENROUTER_API_KEY=sk-or-...
```
Optional: override the classifier model:
```bash
export SWITCHBACK_CLASSIFIER_MODEL=anthropic/claude-haiku-4.5
```
### Claude Desktop
Add to your `~/Library/Application Support/Claude/claude_desktop_config.json`:
```json
{
"mcpServers": {
"switchback": {
"command": "npx",
"args": ["-y", "vibekit-switchback-mcp"],
"env": {
"OPENROUTER_API_KEY": "sk-or-..."
}
}
}
}
```
### Cursor / Cline / others
Any MCP client that supports stdio servers. Same `npx` invocation.
## Example calls
**classify_turn:**
```json
{
"userMessage": "rebuild the auth flow with passkeys"
}
```
returns:
```json
{
"tier": 2,
"why": "architectural rework + new auth method",
"fallback": false,
"durationMs": 412
}
```
**recommend_model:**
```json
{
"userMessage": "fix typo in README",
"ladder": [
"openai/gpt-5.4-mini",
"openai/gpt-5.4",
"openai/gpt-5.5"
]
}
```
returns:
```json
{
"recommended_model": "openai/gpt-5.4-mini",
"tier": 0,
"ladder_size": 3,
"classifier": { "tier": 0, "why": "trivial copy edit", "fallback": false, "durationMs": 318 }
}
```
## When to use it
- **Multi-step agents** where you can swap models between rounds.
- **BYOK-style products** where you want to keep all routing inside the user's chosen brand — pass a brand-locked ladder per user.
- **Cost-conscious orchestrators** that want to avoid spending flagship rates on trivial turns.
## When NOT to use it
- **One-shot chat completions** where you can't change models after the first call — use OpenRouter's `auto` or NotDiamond/Martian instead.
- **Latency-critical sub-200ms-first-token UX** — the classifier adds 200-500ms.
## License
MIT. See [LICENSE](./LICENSE).
Built by [VibeKit](https://vibekit.bot). The core library is [`vibekit-switchback`](https://www.npmjs.com/package/vibekit-switchback) — this package is the MCP wrapper.
TDQS
Scored across 2 tools
The two tools both relate to routing user requests to models, so an agent could confuse classifying a turn with recommending a model. However, the inputs and outputs are distinct enough—one returns a tier, the other returns a specific model—to be workable with clear descriptions.
Both tools follow a consistent verb_noun snake_case pattern: classify_turn and recommend_model. Naming is predictable and clearly indicates the action and object.
With only two tools, the server feels thin, but the scope is narrow enough that both tools can earn their place. The count is borderline rather than egregiously insufficient.
The server covers the core routing workflow: classifying complexity and selecting a cost-appropriate model. Minor gaps exist, such as no combined route tool or ladder management, but agents can work around these using the provided inputs.