← Discover MCPs and Agents
s
MCPData & AnalyticsGitHub

switchboard

One MCP server to rule them all. Aggregates GitHub, Datadog, Linear, Sentry, Slack, and Metabase behind a single search/execute interface.

Links

README

From the repo.

Switchboard

A source-available MCP gateway that connects any MCP client to your tools behind one endpoint. Run it locally with a built-in web UI, or use Switchboard Hosted for a private-data tunnel and other team features.

Switchboard sits under Cursor, Claude Code, Codex, and any other MCP client. Your agent searches for a capability and executes it. Compaction strips unused fields before responses reach the model, typically cutting token usage by about 90%.

Local Switchboard dashboard with connected integrations, token savings, and activity

The local dashboard tracks connected tools and how much LLM context Switchboard kept off the wire.

Local Switchboard integrations page with Google Workspace, connected services, and available adapters

Connect GitHub, Datadog, Linear, Slack, Google Workspace, and more from the local UI.

Switchboard Hosted

Need agents to reach Postgres or Kubernetes behind a firewall? Switchboard Hosted adds a private-data tunnel, plus organizations, SSO, policies, audit logs, and dedicated runtimes. Same MCP clients and integrations as this repo.

Features

  • One MCP endpoint for GitHub, Datadog, Linear, Slack, Google Workspace, AWS, and more
  • Local web UI to connect integrations, check health, and watch token savings
  • Search + execute so agents discover tools instead of loading every schema
  • ~90% fewer tokens via compaction, columnar reshape, and markdown rendering
  • Any MCP client, any model — Cursor, Claude Code, Codex, Windsurf, and others
  • Bring your own integrations with the Go mcp.Integration interface or Wasm plugins

Installation

Homebrew (macOS / Linux)

brew install daltoniam/tap/switchboard

Scoop (Windows)

scoop bucket add daltoniam https://github.com/daltoniam/scoop-bucket
scoop install switchboard

Debian / Ubuntu (.deb)

# Download the latest .deb from GitHub releases
curl -LO "https://github.com/daltoniam/switchboard/releases/latest/download/switchboard_$(curl -s https://api.github.com/repos/daltoniam/switchboard/releases/latest | grep tag_name | cut -d '"' -f4 | tr -d v)_linux_amd64.deb"
sudo dpkg -i switchboard_*.deb

Fedora / RHEL (.rpm)

# Download the latest .rpm from GitHub releases
curl -LO "https://github.com/daltoniam/switchboard/releases/latest/download/switchboard_$(curl -s https://api.github.com/repos/daltoniam/switchboard/releases/latest | grep tag_name | cut -d '"' -f4 | tr -d v)_linux_amd64.rpm"
sudo rpm -i switchboard_*.rpm

Arch Linux (AUR)

yay -S switchboard-bin

Alpine Linux (.apk)

# Download the latest .apk from GitHub releases
curl -LO "https://github.com/daltoniam/switchboard/releases/latest/download/switchboard_$(curl -s https://api.github.com/repos/daltoniam/switchboard/releases/latest | grep tag_name | cut -d '"' -f4 | tr -d v)_linux_amd64.apk"
sudo apk add --allow-untrusted switchboard_*.apk

Go Install

go install github.com/daltoniam/switchboard/cmd/server@latest

Download Binary

Pre-built binaries for macOS, Linux, and Windows (amd64/arm64) are available on the GitHub Releases page.

Context Optimization

API responses are large. A single GitHub issue carries ~100 fields (nested users, permissions, node IDs, avatar URLs) when an LLM needs ~10 to decide what to do next. Multiply by 30 issues per page and a list call can consume 150KB of context for information the model will never use.

Switchboard solves this automatically. Integrations declare compaction specs that describe which fields matter for each tool. The server strips everything else after every execute call, before responses reach the LLM.

List and search responses are compact by default. When the LLM identifies a specific item and calls a single-item get tool, it gets the full response back for drill-down.

Quick Start

Project Catalog tools (project.*) and project:// resources are on the main /mcp endpoint by default. See docs/project-catalog.md.

Compiled tools can use the strongly typed AWM gRPC API over loopback h2c (default 127.0.0.1:3847) or an optional Unix-domain socket. Its generated services mirror the Project Catalog and AWM MCP operations without generic JSON arguments or results. The typed surface includes Projects, Resources, ResourceBindings, WorkProfiles, AgentProfiles, and WorkSessions. A Rust client crate lives in rust/switchboard-awm.

# Run (default — HTTP/MCP + native AWM gRPC on 127.0.0.1:3847)
switchboard

# Custom port, still loopback
switchboard --port 8080

# Opt in to a non-loopback TCP bind (also exposes HTTP/MCP)
switchboard --listen-host 0.0.0.0 --port 3847

# Native AWM gRPC only on a Unix socket (HTTP/MCP stay on TCP)
switchboard --grpc-socket /tmp/switchboard-awm.sock

# Stdio mode (for Cursor/Claude Desktop)
switchboard --stdio

# Check version
switchboard --version

# Debug logging (search/execute requests, compaction savings)
switchboard --verbose

# Open config UI
open http://localhost:3847

Architecture

┌─────────────┐     stdio / SSE      ┌──────────────────────┐
│  AI Client   │ ◄──────────────────► │  Unified MCP Server   │
│ (Cursor, etc)│                      │                       │
└─────────────┘                      │  ┌─────────────────┐  │
                                     │  │  Tool Router     │  │
       ┌──────────────────┐          │  └────────┬────────┘  │
       │  Web UI (3847)   │◄─ HTTP ─►│           │           │
       │  config/creds    │          │  ┌────────▼────────┐  │
       └──────────────────┘          │  │  Adapters        │  │
                                     │  │  ├─ GitHub       │  │
                                     │  │  ├─ Datadog      │  │
                                     │  │  ├─ Linear       │  │
                                     │  │  ├─ Slack        │  │
                                     │  │  └─ more         │  │
                                     │  └─────────────────┘  │
                                     └──────────────────────┘

Configuration

Config lives at ~/.config/switchboard/config.json. The web UI is a convenience layer over this file — you can also edit it by hand.

{
  "integrations": {
    "github": {
      "enabled": true,
      "credentials": {
        "token": "ghp_..."
      }
    },
    "datadog": {
      "enabled": true,
      "credentials": {
        "api_key": "...",
        "app_key": "..."
      }
    }
  }
}

Forgejo (forgejo)

Connect a Forgejo instance with a personal access token (PAT). Both base_url and token are required. Use the instance URL, including any deployment subpath (for example https://git.example.com/forgejo), not the /api/v1 endpoint.

{
  "integrations": {
    "forgejo": {
      "enabled": true,
      "credentials": {
        "base_url": "https://git.example.com/forgejo",
        "token": "your-personal-access-token"
      }
    }
  }
}

Forgejo is disabled by default; enable it explicitly in config or the web UI. You can supply credentials via FORGEJO_BASE_URL and FORGEJO_TOKEN instead. Tools cover repositories, the authenticated user and organizations, issues and comments, pull requests (including diffs, files, reviews, and merge), branches, commits, content, releases, and labels.

Slack official hosted MCP (slackmcp)

Separate from the native slack session-token adapter. Proxies Slack's hosted MCP at https://mcp.slack.com (optional credentials.base_url override; Switchboard appends /mcp).

Each named identity needs a user OAuth access token (access_token, typically xoxp-...). An app/bot may host the agent, but xoxb- bot tokens cannot authenticate Slack's hosted MCP endpoint.

{
  "integrations": {
    "slackmcp": {
      "enabled": true,
      "credentials": {
        "base_url": ""
      },
      "identities": {
        "work": {
          "credentials": { "access_token": "xoxp-..." },
          "metadata": { "label": "Work", "team": "T0123WORK" }
        },
        "personal": {
          "credentials": { "access_token": "xoxp-..." },
          "metadata": { "label": "Personal", "team": "T0456HOME" }
        }
      }
    }
  }
}
  • Start with slackmcp_list_available_identites (spelling is intentional) — returns identity IDs, metadata, and non-secret tool capability info (never tokens).
  • Every other slackmcp_* tool requires identity_id selecting which configured identity to use.
  • Upstream tools named slack_* are exposed once as slackmcp_* (not slackmcp_slack_*).

LikeC4 Excalidraw (likec4excalidraw)

Proxies the project-aware Streamable HTTP MCP server exposed by likec4-excalidraw. Start the editor for the architecture directory first, then configure its printed base URL without /mcp. The token is optional and only applies when the editor server was embedded with mcpToken enabled.

{
  "integrations": {
    "likec4excalidraw": {
      "enabled": true,
      "credentials": {
        "base_url": "http://127.0.0.1:4242",
        "mcp_token": ""
      }
    }
  }
}

Keep tokenless servers bound to localhost. The integration exposes architecture and scene inspection, diagnostics, DSL validation, PNG canvas screenshots, and element, relationship, and view mutations.

Figma and FigJam (figma)

Proxies Figma's official hosted MCP server and exposes the focused FigJam planning workflow: figma_get_figjam, figma_use_figma, figma_generate_diagram, figma_create_new_file, figma_upload_assets, figma_get_screenshot, and figma_whoami. The adapter automatically supplies the figma-use-figjam skill when calling figma_use_figma, so created sections, stickies, connectors, shapes, tables, and code blocks remain native and editable.

Use the web UI at http://localhost:3847/integrations/figma/setup to authorize with Figma OAuth. Figma currently limits its hosted MCP server to approved MCP clients and eligible paid-plan seats. Figma rejects dynamic registration under Switchboard's own client name, so this beta compatibility path registers with Figma's approved Codex client profile while the MCP session still identifies itself as Switchboard. This may stop working as Figma changes enforcement; catalog approval for Switchboard is the durable solution.

Notion MCP (notion-mcp)

Connects to Notion's official hosted Streamable HTTP endpoint at https://mcp.notion.com/mcp through the shared remotemcp adapter. This is independent of the existing notion integration: its tools, credentials, and setup remain unchanged, and both integrations can be enabled together.

Open /integrations/notion-mcp/setup in the web UI and select Sign in with Notion. OAuth uses dynamic client registration, PKCE, the default scope, and resource binding to the MCP endpoint. Successful authorization saves credentials only under notion-mcp, enables that integration, and refreshes tool discovery without restarting Switchboard.

Tools are discovered from Notion after authorization and namespaced as notion-mcp_<upstream-tool-name>. Start with search filtered to integration: "notion-mcp"; use the returned names with execute rather than the existing notion_* tools. The catalog and content permissions depend on the authorized workspace. Re-authorize in setup if the token expires or is revoked; the shared remote OAuth flow currently stores access tokens only and does not refresh them automatically.

Environment Variables

Switchboard automatically reads environment variables from your shell (fish, zsh, bash, etc.) and overlays them on top of the JSON config. If an env var is set, it takes precedence over the corresponding value in config.json. Env-sourced values are never written back to disk.

Environment variables override credential values but do not change the durable enabled state. Enable the integration explicitly in config or the web UI; transient startup failures never rewrite that choice.

IntegrationCredentialEnv Var
GitHubtokenGITHUB_TOKEN
Forgejobase_urlFORGEJO_BASE_URL (required — instance URL including any deployment subpath)
ForgejotokenFORGEJO_TOKEN (required — personal access token)
Datadogapi_keyDD_API_KEY
Datadogapp_keyDD_APP_KEY
DatadogsiteDD_SITE
Linearapi_keyLINEAR_API_KEY
Sentryauth_tokenSENTRY_AUTH_TOKEN
SentryorganizationSENTRY_ORG (optional — auto-detected from API)
SlacktokenSLACK_TOKEN
SlackcookieSLACK_COOKIE
Slack MCP (official hosted)multi-identity access_tokenconfigure via identities in JSON (see below)
LikeC4 Excalidrawbase_urlLIKEC4_EXCALIDRAW_BASE_URL
LikeC4 Excalidrawmcp_tokenLIKEC4_EXCALIDRAW_MCP_TOKEN (optional)
Figma MCPmcp_access_tokenFIGMA_MCP_ACCESS_TOKEN
Figma MCPbase_urlFIGMA_MCP_BASE_URL (optional, default https://mcp.figma.com)
Notion MCPmcp_access_tokenNOTION_MCP_ACCESS_TOKEN
Notion MCPbase_urlNOTION_MCP_BASE_URL (optional, default https://mcp.notion.com; a trailing /mcp is accepted)
Metabaseapi_keyMETABASE_API_KEY
MetabaseurlMETABASE_URL
Paperless-ngxtokenPAPERLESS_TOKEN
Paperless-ngxurlPAPERLESS_URL
Recoll WebUIbase_urlRECOLL_URL
AWSaccess_key_idAWS_ACCESS_KEY_ID
AWSsecret_access_keyAWS_SECRET_ACCESS_KEY
AWSsession_tokenAWS_SESSION_TOKEN
AWSregionAWS_REGION
PostHogapi_keyPOSTHOG_API_KEY
PostHogproject_idPOSTHOG_PROJECT_ID
PostHogbase_urlPOSTHOG_URL
Postgresconnection_stringDATABASE_URL
PostgreshostPGHOST
PostgresportPGPORT
PostgresuserPGUSER
PostgrespasswordPGPASSWORD
PostgresdatabasePGDATABASE
PostgressslmodePGSSLMODE
JiraemailJIRA_EMAIL
Jiraapi_tokenJIRA_API_TOKEN
JiradomainJIRA_DOMAIN
Readarrapi_keyREADARR_API_KEY
Readarrbase_urlREADARR_URL
DigitalOceanapi_tokenDIGITALOCEAN_TOKEN
Vercelapi_tokenVERCEL_API_TOKEN
Vercelteam_idVERCEL_TEAM_ID (optional — default team scope)
Vercelteam_slugVERCEL_TEAM_SLUG (optional — default team scope)
Vercelbase_urlVERCEL_BASE_URL (optional — override API endpoint, e.g. tests/proxies)
Stripeapi_keySTRIPE_API_KEY
StripeaccountSTRIPE_ACCOUNT (optional — Stripe-Account header for Connect)
Stripebase_urlSTRIPE_BASE_URL (optional — override API endpoint, e.g. stripe-mock)
Gongaccess_keyGONG_ACCESS_KEY
Gongaccess_key_secretGONG_ACCESS_KEY_SECRET
Gongbase_urlGONG_BASE_URL (optional — default https://api.gong.io)
ZendesksubdomainZENDESK_SUBDOMAIN (acme from acme.zendesk.com)
ZendeskemailZENDESK_EMAIL (API token auth)
Zendeskapi_tokenZENDESK_API_TOKEN
Zendeskaccess_tokenZENDESK_ACCESS_TOKEN (OAuth; alternative to email + api_token)
Zendeskbase_urlZENDESK_BASE_URL (optional — default https://{subdomain}.zendesk.com/api/v2)
HubSpotaccess_tokenHUBSPOT_ACCESS_TOKEN
HubSpotbase_urlHUBSPOT_BASE_URL (optional — default https://api.hubapi.com)
Intercomaccess_tokenINTERCOM_ACCESS_TOKEN
Intercombase_urlINTERCOM_BASE_URL (optional — default https://api.intercom.io; EU https://api.eu.intercom.io, AU https://api.au.intercom.io)
Frontaccess_tokenFRONT_ACCESS_TOKEN (API token or OAuth access token)
Frontbase_urlFRONT_BASE_URL (optional — default https://api2.frontapp.com)
Gristapi_keyGRIST_API_KEY (API key from Profile → API)
Gristbase_urlGRIST_HOST (optional — default https://docs.getgrist.com; team sites https://{team}.getgrist.com; self-hosted origin)
Oktaapi_tokenOKTA_API_TOKEN
Oktaorg_urlOKTA_ORG_URL (e.g. https://your-org.okta.com)
PagerDutyapi_tokenPAGERDUTY_API_TOKEN (REST API user or account token)
PagerDutyfrom_emailPAGERDUTY_FROM_EMAIL (optional default From header for notes/ack/resolve)
PagerDutybase_urlPAGERDUTY_BASE_URL (optional — default https://api.pagerduty.com)
LaunchDarklyaccess_tokenLAUNCHDARKLY_ACCESS_TOKEN (personal or service access token; SDK keys cannot call the REST API)
LaunchDarklybase_urlLAUNCHDARKLY_BASE_URL (optional — default https://app.launchdarkly.com; EU https://app.eu.launchdarkly.com; Federal https://app.launchdarkly.us)
Rampaccess_tokenRAMP_ACCESS_TOKEN
Rampbase_urlRAMP_BASE_URL (optional — default https://api.ramp.com, use https://demo-api.ramp.com for sandbox)
ServiceNowinstance_urlSERVICENOW_INSTANCE_URL (e.g. https://dev12345.service-now.com)
ServiceNowusernameSERVICENOW_USERNAME (basic auth; alternative to access_token)
ServiceNowpasswordSERVICENOW_PASSWORD (basic auth; alternative to access_token)
ServiceNowaccess_tokenSERVICENOW_ACCESS_TOKEN (OAuth bearer; alternative to username/password)
NetSuiteaccount_idNETSUITE_ACCOUNT_ID
NetSuiteaccess_tokenNETSUITE_ACCESS_TOKEN (OAuth 2.0; alternative to TBA)
NetSuiteconsumer_keyNETSUITE_CONSUMER_KEY (TBA)
NetSuiteconsumer_secretNETSUITE_CONSUMER_SECRET (TBA)
NetSuitetoken_idNETSUITE_TOKEN_ID (TBA)
NetSuitetoken_secretNETSUITE_TOKEN_SECRET (TBA)
NetSuitebase_urlNETSUITE_BASE_URL (optional — default https://{account}.suitetalk.api.netsuite.com)
Microsoft 365access_tokenMICROSOFT365_ACCESS_TOKEN
Microsoft 365refresh_tokenMICROSOFT365_REFRESH_TOKEN (optional — enables auto-refresh)
Microsoft 365client_idMICROSOFT365_CLIENT_ID
Microsoft 365client_secretMICROSOFT365_CLIENT_SECRET
Microsoft 365tenant_idMICROSOFT365_TENANT_ID (optional — default common)
Microsoft 365base_urlMICROSOFT365_BASE_URL (optional — default https://graph.microsoft.com/v1.0)

OAuth Setup

Some integrations support OAuth flows through the web UI at http://localhost:3847. This is the easiest way to get tokens for integrations that don't use simple API keys.

IntegrationAuth MethodSetup
GitHubOAuth Device FlowWeb UI → GitHub → Setup, or set GITHUB_TOKEN
ForgejoPersonal Access TokenSet FORGEJO_BASE_URL and FORGEJO_TOKEN or enter them in the web UI; enable explicitly
LinearOAuth (PKCE)Web UI → Linear → Setup, or set LINEAR_API_KEY
Figma and FigJamHosted MCP OAuth (PKCE)Web UI → Figma → Setup, or set FIGMA_MCP_ACCESS_TOKEN
Notion MCP (notion-mcp)Hosted MCP OAuth (PKCE)Web UI → notion-mcp → Setup, or set NOTION_MCP_ACCESS_TOKEN and enable explicitly
SentryOAuth Device FlowWeb UI → Sentry → Setup, or set SENTRY_AUTH_TOKEN
SlackSession TokenWeb UI → Slack → Setup (auto-extracts from Chrome), or set SLACK_TOKEN
Slack MCP (official hosted)User OAuth access tokens per identityEdit ~/.config/switchboard/config.json slackmcp.identities (see below). Bot xoxb- tokens are not accepted by Slack's hosted MCP endpoint.
LikeC4 ExcalidrawLocal Streamable HTTP MCPStart likec4-excalidraw, then set LIKEC4_EXCALIDRAW_BASE_URL or enter the printed URL in the web UI; bearer token is optional.
DatadogAPI + App KeySet DD_API_KEY and DD_APP_KEY env vars or enter in web UI
AWSIAM CredentialsSet AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY env vars, or uses default credential chain
MetabaseAPI KeySet METABASE_API_KEY and METABASE_URL env vars or enter in web UI
Paperless-ngxAPI TokenSet PAPERLESS_TOKEN and PAPERLESS_URL env vars or enter in web UI
Recoll WebUIBase URLSet RECOLL_URL to the Recoll WebUI root (for example http://localhost:8080) or enter it in the web UI
PostHogPersonal API KeySet POSTHOG_API_KEY env var or enter in web UI
VercelPersonal Access TokenSet VERCEL_API_TOKEN env var or enter in web UI
Microsoft 365OAuth (PKCE)Web UI → Microsoft 365 → Setup, or set MICROSOFT365_ACCESS_TOKEN
PostgresConnection StringSet DATABASE_URL env var or enter in web UI

Adding to Cursor / Claude Desktop

Add to your MCP client config:

{
  "mcpServers": {
    "switchboard": {
      "command": "switchboard",
      "args": []
    }
  }
}

Building from Source

git clone https://github.com/daltoniam/switchboard.git
cd switchboard
go build -o switchboard ./cmd/server

Development

Install air for live-reload during development:

go install github.com/air-verse/air@latest

Install the Playwright Chromium driver (optional — enables browser-based integrations):

go run github.com/playwright-community/playwright-go/cmd/playwright install chromium

Then run with live-reload:

air

Host air / make build remain the non-Docker path. For a worktree-isolated Docker Compose DEV stack (ephemeral loopback publish + optional Stacklane FQDNs, no provider tokens required) see docs/dev-compose.md:

make compose-up
make compose-status
make compose-down

License

Switchboard is source-available under the Elastic License 2.0.

In plain English: you can freely use, modify, redistribute, and self-host Switchboard — including for commercial and internal-business use. The only restriction is that you cannot offer Switchboard to third parties as a hosted or managed service that exposes a substantial portion of its functionality. That is the business reserved for the official hosted Switchboard service.

If you have questions about licensing or want to discuss other arrangements, open an issue or get in touch.

Collected info

  • ★ 19 stars
  • ⎇ 7 forks
  • Language: Go
  • Source updated: 9/24/2026

Config for your environment

Replace {MCP_ENDPOINT_URL} with this MCP’s endpoint URL (from its repo or docs above). No API key — you connect directly.

Tool

OS

Config file: ~/.cursor/mcp.json

{
  "mcpServers": {
    "mcp-server": {
      "url": "{MCP_ENDPOINT_URL}"
    }
  }
}

Paste into mcpServers in the config file. Restart Cursor after saving.

If this MCP is also published on mcpchannel.ai, you can subscribe from Browse and use the gateway config there instead.