Skip to main content

Intelligent multi-provider agent routing MCP server โ€” transparently switch between AI providers and models

Project description

Switchboard ๐ŸŽ›๏ธ

Never let your AI coding agent hit a dead end again.

PyPI version Python 3.10+ License: MIT Tests CLI Demo

A multi-provider AI routing layer that gives any MCP-compatible coding agent (Claude Code, Cursor, Windsurf) unlimited flow by transparently switching between AI providers when rate limits hit or when a better model exists for the task.


The Problem

It's 2am. You're deep in a coding session with Claude Code. You've got 80 messages of context, the agent is about to write the perfect solution โ€” and then:

"You've reached your message limit. Please upgrade your plan or wait."

The agent stops dead. Your flow is gone. You're staring at an error message instead of working code.

This shouldn't happen. Your coding agent should never hit a wall because one provider said no.

Switchboard fixes this. It sits between your coding agent and the AI providers, watching for rate limits, picking the best model for each task, and silently falling back to alternatives โ€” all without the agent (or you) ever knowing a switch happened.


How It Works

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    YOUR WORKSTATION                               โ”‚
โ”‚                                                                  โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                                                 โ”‚
โ”‚  โ”‚ Your Agent  โ”‚   Claude Code / Cursor / Windsurf               โ”‚
โ”‚  โ”‚ (Claude etc)โ”‚                                                 โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜                                                 โ”‚
โ”‚         โ”‚  MCP tool calls only                                    โ”‚
โ”‚         โ–ผ                                                        โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”        โ”‚
โ”‚  โ”‚           SWITCHBOARD (The Whisperer)                 โ”‚        โ”‚
โ”‚  โ”‚                                                      โ”‚        โ”‚
โ”‚  โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”‚        โ”‚
โ”‚  โ”‚  โ”‚ Layer 1  โ”‚โ”€โ”€โ–ถโ”‚  Layer 2  โ”‚โ”€โ”€โ–ถโ”‚   Fallback   โ”‚    โ”‚        โ”‚
โ”‚  โ”‚  โ”‚ Rules    โ”‚   โ”‚ Classifierโ”‚   โ”‚   Chain      โ”‚    โ”‚        โ”‚
โ”‚  โ”‚  โ”‚ (fast)   โ”‚   โ”‚ (DistilBERT)โ”‚  โ”‚ + Health     โ”‚    โ”‚        โ”‚
โ”‚  โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ”‚        โ”‚
โ”‚  โ”‚                                        โ”‚             โ”‚        โ”‚
โ”‚  โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚             โ”‚        โ”‚
โ”‚  โ”‚  โ”‚ Context Serializer (Handoff)     โ”‚โ”€โ”€โ”˜             โ”‚        โ”‚
โ”‚  โ”‚  โ”‚ Structured state โ‰  raw history   โ”‚                โ”‚        โ”‚
โ”‚  โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                โ”‚        โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜        โ”‚
โ”‚                          โ”‚                                       โ”‚
โ”‚         โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                     โ”‚
โ”‚         โ–ผ                โ–ผ                โ–ผ                     โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                  โ”‚
โ”‚  โ”‚ Anthropicโ”‚    โ”‚OpenRouterโ”‚    โ”‚ Direct   โ”‚                  โ”‚
โ”‚  โ”‚ (Claude) โ”‚    โ”‚(14 modelsโ”‚    โ”‚ APIs     โ”‚                  โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                  โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Routing Decision Flow

Request arrives at Switchboard
       โ”‚
       โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  Layer 1: Rules  โ”‚  โ† Checks in order:
โ”‚  (instant)       โ”‚     1. User preferences (cheap/fast)?
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜     2. Context > 60K tokens?
         โ”‚                3. Simple task (explain, autocomplete)?
    conclusive?           4. Latency-sensitive?
         โ”‚                5. Budget cap?
    โ”Œโ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”
    โ”‚         โ”‚
   YES        NO
    โ”‚         โ”‚
    โ–ผ         โ–ผ
 Route to   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
 chosen     โ”‚ Layer 2:         โ”‚  โ† Hybrid classifier:
 model      โ”‚ Classifier       โ”‚     60% semantic (sentence-transformers)
            โ”‚ (all-MiniLM-L6)  โ”‚     40% keyword overlap
            โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                     โ”‚
                     โ–ผ
              Best model for task category
                     โ”‚
                     โ–ผ
            โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
            โ”‚  Fallback Chain  โ”‚  โ† If model fails:
            โ”‚  (health-aware)  โ”‚     1. Try next in priority list
            โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜     2. Skip degraded/rate-limited
                     โ”‚               3. Fall to free-tier models
                     โ–ผ               4. Never hard-stop
              Response back to agent
              (switch is invisible)

Quick Start

Install

pip install switchboard-mcp

Set your API keys

export ANTHROPIC_API_KEY="sk-ant-..."
export OPENROUTER_API_KEY="sk-or-..."

Add to your MCP client

Every MCP client speaks the same stdio transport protocol. Your server runs as a subprocess, the client connects, discovers the 4 tools, and starts calling them. Switchboard is completely client-agnostic.

The core config block is always the same โ€” just the root key changes per client:

{
  "command": "switchboard",
  "env": {
    "ANTHROPIC_API_KEY": "sk-ant-...",
    "OPENROUTER_API_KEY": "sk-or-..."
  }
}

Here's exactly where it goes for each client. Find yours, copy, paste.


Client Configuration Reference

Client Config File / Location Root Key Notes
Cursor ~/.cursor/mcp.json "mcpServers" Or via GUI: Settings โ†’ Features โ†’ MCP
VS Code (Copilot) .vscode/mcp.json "servers" Workspace-level
Claude Code ~/.claude/settings.json "mcpServers" Global
Windsurf Settings โ†’ MCP Servers "mcpServers" Same JSON structure as Cursor
JetBrains Settings โ†’ AI Assistant โ†’ MCP "mcpServers" GUI paste or auto-configure
Antigravity / Google ADK CLI config stdio One config, multiple agents
GitKraken MCP settings "mcpServers" Same as Cursor

Cursor

File: ~/.cursor/mcp.json (or Settings โ†’ Features โ†’ MCP โ†’ Add Server)

{
  "mcpServers": {
    "switchboard": {
      "command": "switchboard",
      "env": {
        "ANTHROPIC_API_KEY": "sk-ant-...",
        "OPENROUTER_API_KEY": "sk-or-..."
      }
    }
  }
}

Restart Cursor. Your agent now has unlimited flow.

VS Code (Copilot)

File: .vscode/mcp.json (workspace-level)

Note: VS Code uses "servers" as the root key, not "mcpServers".

{
  "servers": {
    "switchboard": {
      "command": "switchboard",
      "env": {
        "ANTHROPIC_API_KEY": "sk-ant-...",
        "OPENROUTER_API_KEY": "sk-or-..."
      }
    }
  }
}

Reload the window (Ctrl+Shift+P โ†’ "Developer: Reload Window").

Claude Code

File: ~/.claude/settings.json

{
  "mcpServers": {
    "switchboard": {
      "command": "switchboard",
      "env": {
        "ANTHROPIC_API_KEY": "sk-ant-...",
        "OPENROUTER_API_KEY": "sk-or-..."
      }
    }
  }
}

Next claude invocation picks it up automatically.

Windsurf

Location: Settings โ†’ MCP Servers โ†’ Add Server

Use the same JSON structure as Cursor:

{
  "mcpServers": {
    "switchboard": {
      "command": "switchboard",
      "env": {
        "ANTHROPIC_API_KEY": "sk-ant-...",
        "OPENROUTER_API_KEY": "sk-or-..."
      }
    }
  }
}
JetBrains

Location: Settings โ†’ Tools โ†’ AI Assistant โ†’ Model Context Protocol (MCP) โ†’ Add โ†’ "As JSON ChatForest"

Paste this config:

{
  "mcpServers": {
    "switchboard": {
      "command": "switchboard",
      "env": {
        "ANTHROPIC_API_KEY": "sk-ant-...",
        "OPENROUTER_API_KEY": "sk-or-..."
      }
    }
  }
}

Tip: JetBrains can also auto-configure external clients from the IDE side. If you're already using other MCP servers, just add Switchboard alongside them.

Antigravity / Google ADK

Uses the same stdio config. Configure once, use across multiple agents:

{
  "mcpServers": {
    "switchboard": {
      "command": "switchboard",
      "env": {
        "ANTHROPIC_API_KEY": "sk-ant-...",
        "OPENROUTER_API_KEY": "sk-or-..."
      }
    }
  }
}
GitKraken

Location: MCP Settings โ†’ Add Server

Same JSON structure as Cursor:

{
  "mcpServers": {
    "switchboard": {
      "command": "switchboard",
      "env": {
        "ANTHROPIC_API_KEY": "sk-ant-...",
        "OPENROUTER_API_KEY": "sk-or-..."
      }
    }
  }
}

Using a Virtual Environment

If switchboard isn't on your PATH (you installed from source or in a venv), use the full path:

{
  "mcpServers": {
    "switchboard": {
      "command": "/path/to/your/venv/bin/switchboard",
      "env": {
        "ANTHROPIC_API_KEY": "sk-ant-...",
        "OPENROUTER_API_KEY": "sk-or-..."
      }
    }
  }
}

Or with python -m:

{
  "mcpServers": {
    "switchboard": {
      "command": "python",
      "args": ["-m", "server"],
      "cwd": "/path/to/switchboard/package",
      "env": {
        "ANTHROPIC_API_KEY": "sk-ant-...",
        "OPENROUTER_API_KEY": "sk-or-..."
      }
    }
  }
}

That's it. Your agent now has unlimited flow. When Claude hits a rate limit, Switchboard silently routes to DeepSeek, GPT-4o, or Gemini โ€” your agent never knows.


Model Registry

14 models across 3 tiers, from premium to free fallback:

Model Provider Cost/1K Context Best For Tier
claude-sonnet-4 Anthropic $0.003 200K code gen, review, arch Paid
claude-opus-4 Anthropic $0.015 200K review, security, arch Paid
claude-haiku-3.5 Anthropic $0.0008 200K explanation, autocomplete Paid
claude-sonnet-4 OpenRouter $0.003 200K code gen, review Paid
deepseek-v3 OpenRouter $0.00014 128K code gen, debugging Paid
deepseek-r1 OpenRouter $0.0005 128K debugging, review Paid
gpt-4o OpenRouter $0.0025 128K code gen, review Paid
gpt-4o-mini OpenRouter $0.00015 128K autocomplete, explanation Paid
o3-mini OpenRouter $0.0011 200K debugging, code gen Paid
gemini-1.5-pro OpenRouter $0.00125 2M code gen, architecture Paid
gemini-2.0-flash OpenRouter $0.0001 1M explanation, autocomplete Paid
qwen-2.5-coder OpenRouter $0.00018 128K code gen, autocomplete Paid
llama-3.3-70b:free OpenRouter $0 128K explanation, autocomplete Free
qwen-2.5-72b:free OpenRouter $0 32K explanation, autocomplete Free

Full definitions in config/models.yaml. Add your own models by editing this file.


Routing Logic

Hybrid Approach: Rules First, Classifier Second

Layer 1 (Rule Engine) runs in < 1ms. It checks:

Signal Action
prefer_cheap is set Route to cheapest available model
prefer_fast is set Route to fastest available model
Context > 60K tokens Route to large-window model (Gemini 1.5 Pro: 2M)
Simple task keywords (explain, autocomplete, rename) Route to cheapest model
Latency-sensitive (autocomplete, suggest, stream) Route to fast model
max_cost_per_request budget Filter to affordable models

Layer 2 (Classifier) runs when rules are inconclusive. A sentence-transformer (all-MiniLM-L6-v2, 22MB) classifies the task into 7 categories and picks the best model for that task type:

Category Preferred Models
code_generation Sonnet, DeepSeek-V3, GPT-4o
code_review Opus, GPT-5
debugging DeepSeek-R1, o3-mini
explanation Haiku, Gemini Flash
architecture Opus, GPT-5
autocomplete Haiku, GPT-4o-mini, Qwen-Coder
security_audit Opus, GPT-5

Fallback Priority

When a model fails, Switchboard walks down this chain:

  1. claude-sonnet-4 (Anthropic direct)
  2. anthropic/claude-sonnet-4 (OpenRouter)
  3. deepseek/deepseek-v3
  4. openai/gpt-4o
  5. google/gemini-1.5-pro
  6. qwen/qwen-2.5-coder-32b-instruct
  7. meta-llama/llama-3.3-70b-instruct:free โ† free tier
  8. qwen/qwen-2.5-72b-instruct:free โ† free tier (final safety net)

The agent NEVER hard-stops. Steps 7-8 are always free.


Context Serialization: Why This Isn't LiteLLM

When you switch models mid-conversation, most routers just forward the entire message history. That's wasteful and often breaks things (different models have different context windows and system prompt expectations).

Switchboard maintains a structured ConversationState:

GOAL: Build a REST API for a todo app
ACTIVE FILES:
  - app/main.py
  - app/models.py
CHANGES MADE SO FAR:
  + Added FastAPI setup
  + Created Todo model
KEY DECISIONS:
  - Used SQLite for persistence
CURRENT SUBTASK: Add authentication
Recent conversation:
[user]: Add JWT authentication
[assistant]: I'll add middleware...

This handoff prompt is 60-90% smaller than forwarding raw history, and the new model gets everything it actually needs to continue.


Configuration

Environment Variables

Variable Required Description
ANTHROPIC_API_KEY Recommended Direct access to Claude models
OPENROUTER_API_KEY Recommended Access to 12+ models via OpenRouter
OPENAI_API_KEY Optional Future direct OpenAI support

Runtime Preferences

Set at runtime via set_routing_preferences:

{
  "prefer_cheap": true,
  "prefer_fast": false,
  "max_cost_per_request": 0.50,
  "blacklist_providers": ["openrouter"]
}

Customizing Models

Edit config/models.yaml to add models or adjust costs:

models:
  - id: your/custom-model
    provider: openrouter
    cost_per_1k_tokens: 0.001
    context_window: 128000
    strengths: [code_generation, debugging]
    speed: fast
    tier: paid

Logs

All routing decisions are logged to ~/.switchboard/routing.log in JSONL format:

tail -f ~/.switchboard/routing.log | jq .

Dry Run

See what Switchboard would do without making any API calls:

switchboard --dry-run

Or via CLI tester:

python cli_test.py dry_run

CLI Tester

The CLI tester demonstrates every routing scenario with beautiful Rich-formatted output. No API keys needed โ€” all HTTP is mocked.

pip install switchboard-mcp[dev]
python cli_test.py dry_run

Available Scenarios

Command What It Shows
python cli_test.py dry_run All 7 task categories routed โ€” zero API keys
python cli_test.py task_routing Full routing table with classifications
python cli_test.py rate_limit 429 handling and fallback
python cli_test.py context_switch Structured handoff vs raw history comparison
python cli_test.py provider_health Error injection, degradation, recovery
python cli_test.py stress 20 concurrent requests, mixed tasks
python cli_test.py all Run all scenarios

This is the zero-setup way to experience Switchboard. Someone finds this repo, runs python cli_test.py dry_run, sees the routing decisions in a pretty table โ€” that's the "oh this is real" moment.


Contributing

Quick Start

git clone https://github.com/yourname/switchboard-mcp.git
cd switchboard-mcp
python3 -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
pytest tests/ -v

Adding a New Provider

  1. Create providers/your_provider.py extending providers/base.py
  2. Implement chat_complete() and health_check()
  3. Register in config/models.yaml with the correct provider name
  4. Add tests to tests/test_integration.py

Adding a New Model

Just edit config/models.yaml. No code changes needed:

- id: provider/model-name
  provider: openrouter     # or 'anthropic'
  cost_per_1k_tokens: 0.001
  context_window: 128000
  strengths: [code_generation, debugging]
  speed: fast
  tier: paid

Improving the Classifier

The classifier uses hybrid semantic + keyword scoring. To improve it:

  1. Add keywords to CATEGORY_KEYWORDS in router/classifier.py
  2. The semantic embeddings will automatically adapt to new text
  3. Run pytest tests/test_router.py::TestClassifierStability to verify

PR Checklist

  • All tests pass (pytest tests/ -v)
  • New models added to config/models.yaml
  • CHANGELOG.md updated
  • No TODOs or stubs left in new code

See CONTRIBUTING.md for full details.


Roadmap

Version Feature
v0.1.0 Initial release โ€” hybrid router, 14 models, context handoff, health tracking
v0.2.0 Web dashboard for routing analytics and cost tracking
v0.3.0 Fine-tuned classifier trained on real routing data
v0.4.0 Cost analytics โ€” per-session, per-project cost tracking and budgets
v0.5.0 Community model marketplace โ€” share routing rules and model configs

What Makes This Different

Feature Switchboard LiteLLM / OpenRouter Router
MCP-native โœ… Zero-code-change for Claude Code, Cursor โŒ Requires SDK integration
Semantic context โœ… Structured handoff, not raw history โŒ Raw message forwarding only
Task-aware routing โœ… Understands debug vs review vs gen โŒ Cost/availability only
Feedback loop โœ… report_outcome tool โŒ None
Free-tier fallback โœ… Always 2+ free models โš ๏ธ Depends on plan
License โœ… MIT, for individual devs โš ๏ธ Hosted service / Enterprise

License

MIT โ€” built for individual developers, not enterprise.

Made with โ˜• at 2am because the rate limit wall needed to go.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

switchboard_mcp-0.1.0.tar.gz (43.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

switchboard_mcp-0.1.0-py3-none-any.whl (70.1 kB view details)

Uploaded Python 3

File details

Details for the file switchboard_mcp-0.1.0.tar.gz.

File metadata

  • Download URL: switchboard_mcp-0.1.0.tar.gz
  • Upload date:
  • Size: 43.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.6

File hashes

Hashes for switchboard_mcp-0.1.0.tar.gz
Algorithm Hash digest
SHA256 338c49a1f2f2ea21241de3b64c0e2d04c362c84af5574a02b63904c7fcbbf6ad
MD5 4b506340a297fe5b65c99bba95f796ca
BLAKE2b-256 068a3b03ea286463f5afe7688e6d4f97cbd9d575eb45a05c857ab1618ffad586

See more details on using hashes here.

File details

Details for the file switchboard_mcp-0.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for switchboard_mcp-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 e684b0f167216a6a249bda78e5147b9fbb0e269f8f1e1a021c646379b614bb73
MD5 114441f1e2f83eee6c058cda6a3c6191
BLAKE2b-256 d35eed5e0f57f8d53f6a3427f46943665c278a3b50655fedb3e1d746309759f4

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page