Junctio

Self-hosted MCP gateway

One endpoint for every MCP client. Auth that does not go stale.

Point Claude Code, Cursor, Codex or claude.ai at a single URL and manage the servers behind it from a web UI. One container, one volume, nothing leaves your machine.

$docker compose up -d

Why a gateway at all

Every client keeps its own list of servers and its own copy of every token. Junctio holds them once, keeps them fresh, and hands out one URL.

Proactive token refresh

Upstream OAuth tokens are renewed on a schedule, not after a request has already failed. Refresh tokens rotate on every use.

No telemetry

No phone-home, no analytics, no update ping. The only outbound call the UI makes is to the public MCP registry, while you look at it.

One endpoint, many servers

Tools from every upstream are aggregated under prefixes. A dead upstream does not take the rest down.

Its own authorization server

PKCE, dynamic client registration and a consent screen behind the admin password. What claude.ai and Claude Desktop connectors need.

Management MCP

Forty-six tools over the same REST API the UI uses, so an agent can configure the gateway instead of you clicking through it.

Security audit

Optional scheduled vulnerability checks for every stdio server, with a per-severity action you choose.

The promise: auth does not go stale

An upstream token that expires mid-session surfaces as a 401 inside your editor, and the fix is a manual re-login. Junctio refreshes each upstream token on a schedule, well before it expires, and collapses concurrent refreshes into one. The test suite runs a hundred calls under a five second token lifetime with zero client-visible failures.

The same holds between your client and the gateway: access tokens live an hour, refresh tokens thirty days and rotate on every use, and revoking a client from Settings kills its tokens with it.

Without a gatewaythe client sees the failure
token lifetime
Behind Junctiorefreshed on schedule
refreshed token lifetime

Four steps from container to client

  1. 1

    Add a server

    Pick a runtime, type the package name, the form previews the exact command.

  2. 2

    Group it in a namespace

    Choose a prefix per server, hide or rename tools, add instructions.

  3. 3

    Create an endpoint

    API key, OAuth, both or none. Issue a key or let a client register itself.

  4. 4

    Paste one snippet

    Every client points at the same URL. Change upstreams without touching clients.

claude mcp add --transport http junctio https://mcp.example.com/mcp/main \
  --header "Authorization: Bearer jn_..."

Runs wherever Docker does

A multi-arch image on GHCR, a compose file, and guides for Caddy, Dokploy, Coolify and Portainer. Read the security notes before exposing it to anyone but yourself.