One MCP front door to every tool behind your gateway: agents see five tools instead of hundreds, and every write waits for a tap on your phone.
Parked. It works; I am not changing it now and may come back.
flowchart LR
agent[AI agent] -- "search · describe · read · write · more" --> sb[switchboard]
sb -- one session per scope --> gw[agentgateway]
gw --> s1[GitHub MCP]
gw --> s2[Telegram MCP]
gw --> s3[... every other MCP server]
sb -- "write? show every argument" --> tg[Telegram bot]
tg -- Approve / Deny --> sb
An agent connected to every MCP server I run reads hundreds of tool definitions before it reads the task, and any one of those tools can change something. I wanted the agent to look tools up instead of carrying them all, and I wanted a person, not the tool's own description of itself, to decide what may write.
- Five tools instead of hundreds.
searchfinds a tool,describereturns its arguments,readruns it,writeruns it after approval,morepages a long result. - Config decides what reads. A tool is
readonly if the config says so. A server with no entry is allwrite, and adestructiveHintalways forceswrite. - Approvals you can trust. Each write shows every argument on Telegram, with zero-width and bidi characters printed as visible escapes. Approvals are single-use, bound to exactly the arguments shown, denied on timeout and refused when Telegram is unreachable.
- Small results. Nulls dropped, an optional JMESPath
queryapplied, the first page capped at 6,000 characters. - An audit line per write, before and after the call, with a hash of the arguments, never the arguments.
Not here: client keys and allow-lists (the gateway owns them), stdio transport, more than one approver, anything on disk. What it does not do has the full list.
Warning
pip install switchboard installs an unrelated PyPI project. Use the container image or a clone.
Runs the smoke test CI runs: switchboard between a real agentgateway and a fake MCP server, with a fake Telegram approver. Needs Docker with Compose and uv.
git clone https://github.com/Egoushka/switchboard.git && cd switchboard
uv sync && uv run pytest
docker build -t switchboard:dev .
docker compose -f tests/smoke/compose.yaml up -d
uv run python tests/smoke/check.pyThe quickstart guide explains each step and what the output means.
Each scope in the config is an MCP endpoint at /mcp/<scope> holding one long-lived session to a gateway route.
search ranks that route's tools with BM25 over server name, description and tool name. write sends the tool,
its arguments and the agent's reason to Telegram and runs the call once if Approve arrives before the timeout
(50 s by default). An approved call runs to the end even if the client gives up.
How it works follows one request through every part.
| Value | Source | |
|---|---|---|
| Tools an agent sees | 5 (4 in a read-only scope) | test_integration.py checks both lists |
| Tests | 91, all offline, plus a smoke test against a real agentgateway | status |
| Users | 1, me | counted |
- Overview: who it is for, the tools, limits, status
- Quickstart: the smoke stack, step by step
- Deploy: config, environment, container, routing clients, measuring the savings
- Approvals: what the approver sees, what the agent gets back, the audit log
- How it works · Reference · Status and evidence
- Changelog
Made by Yehor Hrabovskyi · MIT licence.