Skip to content
Beta Multi-model support (OpenAI, Gemini, and more) launching soon.

Gateway

The Gateway is the one internal MCP server that is the only path from any Runner to any internal system. Tools are authored once, are self-describing, and become auto-discoverable to every Runner. Every call flows through a single chokepoint — which is exactly what makes a unified audit log and a single policy enforcement point possible.

A Runner could, in principle, call internal APIs directly. We deliberately don’t allow that. Routing every tool call through one server buys four things a gateway-free design can’t:

  1. One audit log. Every tool call → one append-only sink. “How many Runners touched Jira this week, and which?” has a single answer.
  2. One policy enforcement point. Token scope, rate limits, and write-gating are enforced in one place, not re-implemented per Runner.
  3. Tools authored once. A tool is described once and is discoverable to every Runner — no copy-paste integration per agent.
  4. Credentials never reach the Runner. The Gateway holds the real credentials and injects them at the boundary; the Runner only ever sees the tool interface.
ResponsibilityApproachPattern source
Tool registryTools authored once, self-describing, auto-discoverable to all RunnersStripe Toolshed (~500 tools)
Auto-generationIf RBA services expose OpenAPI specs, generate MCP tools from themUber IDL crawl (10,000+ services)
Identity & tokensIntegrate RBA’s IdP (Entra) → mint short-lived, audience-scoped, single-hop tokens per callUber STS (via OIDC, not SPIFFE)
Tiered gatingFirst-party tools auto-approved; third-party gated harderUber tiering
Write protectionBlock mutable endpoints by default; rate-limit writes; explicit scope to mutateUber guardrails
Unified audit logEvery tool call → one append-only sinkThe thing a gateway-free design can’t give

A Runner’s allowedTools are scoped Gateway tool references, not raw API calls:

"allowedTools": ["gateway:jira.read", "gateway:git.read"]

The Gateway mints a token for exactly those scopes, for a single hop, with a short time-to-live — so a token issued for one Runner to call one service can’t be replayed against another. Read-only scopes (*.read, *.list, *.get) are the default; write scopes require an explicit grant and gate the Runner behind a security review before it can reach maturity: stable (see Runners).

The Gateway owns the tool source of truth. This repo never duplicates it: the Gateway publishes a committed or cached tools-catalog.json that the site renders read-only. The build never blocks on a live service — if the Gateway is down, the catalog still builds from the last published snapshot.

We mint short-lived, audience-scoped, single-hop tokens through RBA’s existing IdP (Entra) over OIDC. We are not building SPIFFE/SPIRE — that’s for service-mesh scale RBA likely doesn’t have, and scoped OIDC tokens cover the requirement at this scale. The full attested actor chain travels in the token so every participant in a call is attributable, not just the immediate caller.