Gateway
A hub is the address you paste into Claude, ChatGPT, Cursor or your own agent. It signs clients in with OAuth 2.1, applies a policy per client and forwards every call to the right server — without the traffic ever leaving the hub's region.
1
URL per hub, however many servers sit behind it
OAuth 2.1
PKCE, dynamic registration, RFC 8414 / 9728 discovery
0
network hops to validate a token: JWT checked in-region
~1 min
for a policy change to reach the hub, no new token needed
Or the same three clicks in the dashboard.
$ runscale hubs create backoffice --region mxPinned to a region at creation. Only servers of that region can join — the residency promise survives the gateway.
$ runscale hubs add backoffice crmInternal servers get a platform token automatically, sealed with your organisation's key. External MCP endpoints join with their own bearer.
$ runscale connect backofficePrints the URL. Paste it as a remote MCP server; the client registers itself, sends you to the consent screen and gets its tokens.
❯ runscale hubs create backoffice --region mxhub backoffice created in aws-mx-central-1endpoint: https://mx.gw.runscale.dev/8a92fe32/backoffice/mcp❯ runscale hubs add backoffice crmbackoffice ← crm (crm)❯ runscale hubs add backoffice docsbackoffice ← docs (docs)❯ runscale connect backofficehttps://mx.gw.runscale.dev/8a92fe32/backoffice/mcpadd this URL as a remote MCP server / custom connector in your client.it will register itself, send you to the Runscale consent screen, and get a token.
Access
People connect through OAuth: their client registers itself, a member of your organisation approves it on the consent screen, and a signed token comes back. Scripts and CI use a static token. Both resolve to a client id, and the policy is applied per client.
allow = ["crm__*", "docs__search"]deny = ["crm__delete_*"]rate_limit_per_minute = 60daily_quota = 5000max_argument_bytes = 65536Policy
Globs over the published tool names, deny winning over allow, plus a rate limit and a daily quota. A hub starts by denying everything; tools/list only shows what a client can actually use, so the model never wastes context on the rest.
{ "ts": "2026-09-06T21:41:07.113Z", "hub": "backoffice", "client_id": "cli_IIdkt38wlxgLX2YJz6qDWlXu", "sub": "usr_…", "tool": "crm__search", "server": "crm", "status": "ok", "duration_ms": 184, "argument_bytes": 61, "result_bytes": 2310}Residency
The authorization server is one; hubs are per region. Tokens carry the hub as audience and are verified locally against the published keys. Traces — who called which tool, how long, how big — are written in the hub's region. Payloads are off by default.
The gateway implements the authorization flow the Model Context Protocol specification defines for remote servers: OAuth 2.1 with PKCE, protected-resource and authorization-server metadata, and dynamic client registration. That is what Claude.ai, ChatGPT, Claude Desktop and the desktop editors speak when you add a remote MCP server.
No. Servers keep their access tokens. The hub authenticates against a server with a token of its own — labelled 'platform: gateway', visible and revocable like any other — so there is no second way into a server.
No. Each access token carries the hub URL as its audience and is only valid there, even for hubs of the same organisation.
A member of your organisation, signed in to the dashboard. External users by invitation and federation with your identity provider come next.
By default only metadata per call: client, tool, server, duration and sizes. You can turn on payload tracing per hub; those traces stay in the hub's region, capped per record.
Included in early access. When billing turns on, hub calls are metered like server invocations.
Mexico (Central) today. US East follows with the same engine.
Create a hub, add a server, paste the URL into your client.