Spiderswitch
БесплатноНе проверенMCP server that enables agents to dynamically switch between multiple AI models (OpenAI, Anthropic, Google, etc.) with unified protocol-driven configuration and
Описание
MCP server that enables agents to dynamically switch between multiple AI models (OpenAI, Anthropic, Google, etc.) with unified protocol-driven configuration and capability discovery.
README
MCP (Model Context Protocol) server that enables agents to dynamically switch AI models from the ai-lib ecosystem.
Features
- Protocol-Driven: All model configurations loaded from ai-protocol manifests (ARCH-001)
- Multi-Provider Support: Switch between OpenAI, Anthropic, Google, DeepSeek, and more
- Runtime-Agnostic: Uses ai-lib-python SDK for unified model interaction
- MCP-Compliant: Implements standard MCP tools over stdio transport
- Capability Discovery: Query available models and their capabilities
- Runtime Profile Signal: Exposes runtime capability profile for upper-layer routing policy engines
- Local Readiness Hints:
list_modelsincludes API key presence and proxy readiness per provider - Explicit Exit Path:
exit_switcherresets switcher runtime/state for clean fallback - Auto Protocol Setup: Auto-detects local
ai-protocolpath and setsAI_PROTOCOL_PATHfor current process - Official Dist Sync: Best-effort sync of official
dist/v1/*.jsonsnapshot into localai-protocol/dist/v1
Quick Start
Installation
# Clone the repository
git clone https://github.com/ailib-official/spiderswitch.git
cd spiderswitch
# Install dependencies
pip install -e .
Environment Setup
Set up your API keys:
export OPENAI_API_KEY="sk-..."
export ANTHROPIC_API_KEY="sk-ant-..."
export GOOGLE_API_KEY="..."
Recommended provider key mapping:
| Provider | Environment Variable |
|---|---|
| openai | OPENAI_API_KEY |
| anthropic | ANTHROPIC_API_KEY |
GOOGLE_API_KEY or GEMINI_API_KEY |
|
| deepseek | DEEPSEEK_API_KEY |
| cohere | COHERE_API_KEY |
| mistral | MISTRAL_API_KEY |
Security note:
- Prefer environment variables over passing
api_keyin tool arguments. - The server redacts sensitive fields in logs, but passing secrets in arguments still increases exposure risk in client traces.
Optional runtime env controls:
SPIDERSWITCH_SYNC_ON_INIT=1to enable dist sync during runtime initialization (default: disabled).SPIDERSWITCH_SYNC_DIST=0to disable dist sync when it is explicitly invoked.AI_PROTOCOL_DIST_BASE_URLto override raw dist source (default official GitHub raw URL).AI_PROTOCOL_DIST_API_BASE_URLto override GitHub API listing source for models/providers dist json.SPIDERSWITCH_LIST_CACHE_TTL_SECforlist_modelscache TTL (default:5).SPIDERSWITCH_STATUS_CACHE_TTL_SECforget_statuscache TTL (default:2).SPIDERSWITCH_ROUTING_MODE—local(default) orgateway(Charter M3: Control API route registration).SPIDERSWITCH_GATEWAY_CONTROL_URL— Prism Gateway base URL whenrouting_mode=gateway(e.g.https://api.ailib.info).SPIDERSWITCH_GATEWAY_API_KEY— deployment Bearer token for Control API whenrouting_mode=gateway.AI_HTTP_TRUST_ENV=1so ai-lib-python (used afterswitch_model) forwards standard proxy env vars to its HTTP client; without this,HTTP_PROXY/HTTPS_PROXYmay be ignored by the SDK (see ai-lib-python transport docs).
Gateway routing mode (Charter M3)
When SPIDERSWITCH_ROUTING_MODE=gateway, switch_model calls Prism Gateway POST /v1/route/decide and records the returned model / provider_id / reason in MCP state. It does not mutate Host process environment or create a local ai-lib client — effective_scope is control (recommendation / registration only). Host inference still uses your existing client path (L3 Gateway or DATA-OWN).
export SPIDERSWITCH_ROUTING_MODE=gateway
export SPIDERSWITCH_GATEWAY_CONTROL_URL="https://api.ailib.info"
export SPIDERSWITCH_GATEWAY_API_KEY="your-deployment-token"
list_models and get_status include routing_context with routing_mode, effective_scope, and (after a gateway switch) last_route_decision.
One-Click Install (Plugin-Market Style)
bash scripts/install_one_click.sh
Then generate MCP client config template:
spiderswitch init --client cursor --output ~/.cursor/mcp.spiderswitch.json --force
spiderswitch doctor --json
Offline Install (air-gapped/intranet)
Install from local wheel or local source directory:
bash scripts/install_offline.sh /path/to/spiderswitch-0.4.0-py3-none-any.whl
# or
bash scripts/install_offline.sh /path/to/spiderswitch-source
Configuration
Add to your MCP client configuration:
For OpenCode
Configuration file: ~/.config/opencode/opencode.json
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"spiderswitch": {
"type": "local",
"command": ["python3", "-m", "spiderswitch.server"],
"enabled": true,
"environment": {
"AI_PROTOCOL_PATH": "/path/to/ai-protocol",
"OPENAI_API_KEY": "sk-your-key",
"ANTHROPIC_API_KEY": "sk-ant-your-key",
"DEEPSEEK_API_KEY": "sk-your-key"
}
}
}
}
For Claude Desktop / Cursor
Configuration file: ~/.config/claude-desktop/config.json or ~/.cursor/mcp.json
{
"mcpServers": {
"spiderswitch": {
"command": "python3",
"args": ["-m", "spiderswitch.server"],
"env": {
"AI_PROTOCOL_PATH": "/path/to/ai-protocol"
}
}
}
}
Verification (OpenCode)
# List loaded MCP servers
opencode mcp list
# Expected output:
# ✓ spiderswitch connected
# python3 -m spiderswitch.server
Usage
In your agent, call MCP tools:
# List available models
models = await mcp_client.call_tool("list_models", {})
# Switch to Claude 3.5 Sonnet
await mcp_client.call_tool(
"switch_model",
{"model": "anthropic/claude-3-5-sonnet"}
)
# Check current status
status = await mcp_client.call_tool("get_status", {})
Available MCP Tools
1. switch_model
Switches to a different AI model/provider.
Parameters:
model(string, required): Model identifier (e.g.,openai/gpt-4o,anthropic/claude-3-5-sonnet)api_key(string, optional): Explicit API key (overrides environment variable; not recommended for production)base_url(string, optional): Custom base URL for testing/mockruntime_id(string, optional): Runtime target selected by upper-layer policy
Returns:
{
"status": "success",
"data": {
"id": "anthropic/claude-3-5-sonnet",
"provider": "anthropic",
"capabilities": ["streaming", "tools", "vision"],
"proxy_status": {
"provider": "anthropic",
"proxy_required_guess": false,
"proxy_configured": false,
"configured_proxy_env_vars": [],
"hint": null
},
"warnings": []
},
"message": "Successfully switched to anthropic/claude-3-5-sonnet"
}
2. list_models
Lists all available models from registered providers.
Parameters:
filter_provider(string, optional): Filter by provider IDfilter_capability(string, optional): Filter by capability (streaming,tools,vision,embeddings,audio)runtime_id(string, optional): Runtime target selected by upper-layer policy
Returns:
{
"status": "success",
"data": {
"count": 2,
"runtime_profile": {
"runtime_id": "python-runtime",
"language": "python",
"supports": ["model_switching", "capability_filtering", "provider_manifest_loading"]
},
"models": [
{
"id": "openai/gpt-4o",
"provider": "openai",
"capabilities": ["streaming", "tools", "vision"],
"api_key_status": {
"provider": "openai",
"has_api_key": true,
"expected_env_vars": ["OPENAI_API_KEY"],
"configured_env_vars": ["OPENAI_API_KEY"]
},
"proxy_status": {
"provider": "openai",
"proxy_required_guess": true,
"proxy_configured": false,
"configured_proxy_env_vars": [],
"hint": "This provider may require proxy access in your network region. Set HTTPS_PROXY/HTTP_PROXY in the MCP server process environment if needed."
}
},
{
"id": "anthropic/claude-3-5-sonnet",
"provider": "anthropic",
"capabilities": ["streaming", "tools", "vision"]
}
],
"filtered": {
"require_api_key": false,
"provider": null,
"capability": null
}
}
}
3. get_status
Gets current model status and configuration.
Parameters:
runtime_id(string, optional): Query status in a specific runtime scope
Returns:
{
"status": "success",
"data": {
"provider": "anthropic",
"model": "claude-3-5-sonnet",
"capabilities": ["streaming", "tools", "vision"],
"runtime_profile": {
"runtime_id": "python-runtime",
"language": "python",
"supports": ["model_switching", "capability_filtering", "provider_manifest_loading"]
},
"is_configured": true,
"connection_epoch": 3,
"last_switched_at": "2026-03-02T09:00:00+00:00"
}
}
4. exit_switcher
Explicitly reset spiderswitch state and runtime client.
Parameters:
runtime_id(string, optional): Runtime id for scoped resetscope(string, optional):all(default) orruntime
Returns:
{
"status": "success",
"data": {
"exited": true,
"status": {
"provider": null,
"model": null,
"is_configured": false
}
}
}
API Key Guidance and Troubleshooting
When switch_model fails due to missing credentials, the response includes:
provider: which provider is missing credentialsexpected_env_vars: accepted environment variable nameshint: actionable setup instruction
Typical setup flow:
- Configure provider key in your MCP server process environment.
- Restart the MCP server process if your client does not support hot env reload.
- Call
switch_model. - Verify with
get_status.
Connection Coordination with Agent Runtime
This MCP server manages model client lifecycle internally. To avoid conflicts with an agent's own connection manager:
- Treat MCP switcher as the control plane for model selection.
- Let the agent side observe
get_status.connection_epoch. - Rebuild agent-side cached sessions only when
connection_epochincreases.
This pattern prevents stale session reuse after model switches and supports deterministic synchronization.
Runtime Routing Boundary
spiderswitch only executes routing actions with explicit runtime signals:
- Runtime capability model is exposed via
runtime_profile(runtime-neutral schema). - Runtime selection policy remains in upper-layer applications.
- Built-in registry/resolver only resolves
runtime_idand does not implement cost/quality/business strategy.
Architecture
spiderswitch/
├── src/
│ ├── server.py # MCP server main entry point
│ ├── tools/ # MCP tool implementations
│ │ ├── switch.py # switch_model tool
│ │ ├── list.py # list_models tool
│ │ ├── status.py # get_status tool
│ │ └── reset.py # exit_switcher tool
│ ├── runtime/ # Runtime abstraction layer
│ │ ├── base.py # Base runtime interface
│ │ ├── python_runtime.py # ai-lib-python implementation
│ │ └── loader.py # ProtocolLoader wrapper
│ └── state.py # State management
├── tests/ # Test suite
└── pyproject.toml # Project configuration
Development
Running Tests
# Install test dependencies
pip install -e ".[dev]"
# Run tests
pytest
# Run with coverage
pytest --cov=src/spiderswitch
Testing with Mock Server
Use ai-protocol-mock:
# Start mock server
docker-compose up -d ai-protocol-mock
# Run with mock
MOCK_HTTP_URL=http://localhost:4010 python -m spiderswitch.server
Code Style
# Format code
ruff format src tests
# Lint
ruff check src tests
# Type check
mypy src
Protocol-Driven Design (ARCH-001)
This server follows the ai-lib design principle:
一切逻辑皆算子,一切配置皆协议
All provider configurations are loaded from ai-protocol manifests. No provider-specific logic is hardcoded. Adding a new provider requires only a manifest file in ai-protocol.
Routing boundary:
- spiderswitch exposes runtime/model capability signals only.
- Routing strategy policy (cost/latency/circuit-breaker/business rules) belongs to upper-layer applications.
Deterministic routing contract:
- runtime resolution order is fixed as
request runtime_id -> active state runtime_id -> default runtime. - reset supports scoped behavior (
scope=runtime) to clear a target runtime without global teardown. - contract tests in
tests/test_runtime.pyverify resolver order and scoped reset stability.
Related Projects
- ai-protocol - Protocol specification
- ai-lib-python - Python runtime SDK
- ai-lib-rust - Rust runtime SDK
- ai-lib-ts - TypeScript runtime SDK
License
This project is licensed under either of:
- Apache License, Version 2.0 (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
- MIT License (LICENSE-MIT or http://opensource.org/licenses/MIT)
at your option.
Contributing
Contributions are welcome! Please ensure:
- Code follows PEP 8 and passes
ruff check - Type hints pass
mypy --strict - Tests are included for new features
- Documentation is updated
spiderswitch - Where MCP meets ai-lib. 🤖🔀
Установка Spiderswitch
У этого сервера нет опубликованного пакета — он собирается из исходников. Открой репозиторий и следуй инструкции в README.
▸ github.com/hiddenpath/spiderswitchFAQ
Spiderswitch MCP бесплатный?
Да, Spiderswitch MCP бесплатный — установка в пару кликов через Unyly без оплаты.
Нужен ли API-ключ для Spiderswitch?
Нет, Spiderswitch работает без API-ключей и переменных окружения.
Spiderswitch — hosted или self-hosted?
Доступен hosted-вариант: Unyly запускает сервер в облаке, локальная установка не обязательна.
Как установить Spiderswitch в Claude Desktop, Claude Code или Cursor?
Открой Spiderswitch на unyly.org, выбери вкладку своего клиента (Claude Desktop, Claude Code, Cursor) и нажми Install — конфиг сгенерируется автоматически, без правки JSON.
Похожие MCP
Fetch
Web content fetching and conversion for efficient LLM usage.
AWS KB Retrieval
Retrieval from AWS Knowledge Base using Bedrock Agent Runtime.
автор: modelcontextprotocolSpring AI MCP Server
Provides auto-configuration for setting up an MCP server in Spring Boot applications.
llm-analysis-assistant
A very streamlined mcp client that supports calling and monitoring stdio/sse/streamableHttp, and can also view request responses through the /logs page. It also
автор: xuzexin-hzCompare Spiderswitch with
Не уверен что выбрать?
Найди свой стек за 60 секунд
Автор?
Embed-бейдж для README
Похожее
Все в категории ai
