Spiderswitch — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Spiderswitch (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
MCP (Model Context Protocol) server that enables agents to dynamically switch AI models from the ai-lib ecosystem.
list_models includes API key presence and proxy readiness per providerexit_switcher resets switcher runtime/state for clean fallbackai-protocol path and sets AI_PROTOCOL_PATH for current processdist/v1/*.json snapshot into local ai-protocol/dist/v1# Clone the repository
git clone https://github.com/ailib-official/spiderswitch.git
cd spiderswitch
# Install dependencies
pip install -e .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:
api_key in tool arguments.Optional runtime env controls:
SPIDERSWITCH_SYNC_ON_INIT=1 to enable dist sync during runtime initialization (default: disabled).SPIDERSWITCH_SYNC_DIST=0 to disable dist sync when it is explicitly invoked.AI_PROTOCOL_DIST_BASE_URL to override raw dist source (default official GitHub raw URL).AI_PROTOCOL_DIST_API_BASE_URL to override GitHub API listing source for models/providers dist json.SPIDERSWITCH_LIST_CACHE_TTL_SEC for list_models cache TTL (default: 5).SPIDERSWITCH_STATUS_CACHE_TTL_SEC for get_status cache TTL (default: 2).AI_HTTP_TRUST_ENV=1 so ai-lib-python (used after switch_model) forwards standard proxy env vars to its HTTP client; without this, HTTP_PROXY / HTTPS_PROXY may be ignored by the SDK (see ai-lib-python transport docs).bash scripts/install_one_click.shThen generate MCP client config template:
spiderswitch init --client cursor --output ~/.cursor/mcp.spiderswitch.json --force
spiderswitch doctor --jsonInstall 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-sourceAdd 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"
}
}
}
}# List loaded MCP servers
opencode mcp list
# Expected output:
# ✓ spiderswitch connected
# python3 -m spiderswitch.serverIn 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", {})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 policyReturns:
{
"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"
}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 policyReturns:
{
"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
}
}
}Gets current model status and configuration.
Parameters:
runtime_id (string, optional): Query status in a specific runtime scopeReturns:
{
"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"
}
}Explicitly reset spiderswitch state and runtime client.
Parameters:
runtime_id (string, optional): Runtime id for scoped resetscope (string, optional): all (default) or runtimeReturns:
{
"status": "success",
"data": {
"exited": true,
"status": {
"provider": null,
"model": null,
"is_configured": false
}
}
}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 instructionTypical setup flow:
switch_model.get_status.This MCP server manages model client lifecycle internally. To avoid conflicts with an agent's own connection manager:
get_status.connection_epoch.connection_epoch increases.This pattern prevents stale session reuse after model switches and supports deterministic synchronization.
spiderswitch only executes routing actions with explicit runtime signals:
runtime_profile (runtime-neutral schema).runtime_id and does not implement cost/quality/business strategy.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# Install test dependencies
pip install -e ".[dev]"
# Run tests
pytest
# Run with coverage
pytest --cov=src/spiderswitchUse 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# Format code
ruff format src tests
# Lint
ruff check src tests
# Type check
mypy srcThis 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:
Deterministic routing contract:
request runtime_id -> active state runtime_id -> default runtime.scope=runtime) to clear a target runtime without global teardown.tests/test_runtime.py verify resolver order and scoped reset stability.This project is licensed under either of:
at your option.
Contributions are welcome! Please ensure:
ruff checkmypy --strictspiderswitch - Where MCP meets ai-lib. 🤖🔀
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.