ZuploZuplo
LoginSign Up
  • Documentation
  • API Reference
Introduction
Getting Started
    Develop using the Portal
      1 - Setup Your Gateway2 - Rate Limiting3 - API Key Auth4 - Deploy5 - Dynamic Rate LimitingMCP - Quick start
    Develop Locally
      1 - Setup Your Gateway2 - Rate Limiting3 - API Key Auth
Concepts
Development
Policies
Handlers
API Keys
MCP Server
MCP Gateway
    IntroductionBetaQuickstartQuickstart (Local Dev)How it works
    Connect MCP clients
    Authentication
    Configuration
    Observability
    ReferenceTroubleshooting
AI Gateway
Developer Portal
Monetization
Deploying & Source Control
Observability
Networking & Infrastructure
Account Management
Programming API
Build with AI
Zuplo CLI
Migration Guides
Platform LimitsSecuritySupportTrust & ComplianceChangelog
powered by Zudoku
MCP Gateway

Gateway reference

This page is the lookup table for facts about the gateway — every URL it exposes, every default TTL, the OAuth scope it issues, the headers it honors, and the configuration constants you need to set.

Public URLs

The URLs below are all relative to the gateway origin. For a project deployed to https://my-gateway.zuplo.dev with an MCP route at /mcp/linear-v1, the public route is https://my-gateway.zuplo.dev/mcp/linear-v1.

Well-known metadata

PathMethodsPurpose
/.well-known/oauth-authorization-serverGET, OPTIONSRFC 8414 Authorization Server metadata for the gateway. Issuer is the gateway origin.
/.well-known/oauth-authorization-server/{routePath*}GET, OPTIONSPer-route AS metadata. The issuer is rebound to the route's canonical URI, and authorization_endpoint points at /oauth/authorize/{routePath}.
/.well-known/oauth-protected-resource/{routePath*}GET, OPTIONSRFC 9728 Protected Resource Metadata for an MCP route. Lists resource, resource_name, authorization_servers, bearer_methods_supported, scopes_supported, and mcp_protocol_version.
/.well-known/oauth-client/{connection}GETOAuth Client ID Metadata Document the gateway hosts to identify itself to an upstream provider. Requires the ?authProfileId= query parameter.

These routes are CORS-permissive (Access-Control-Allow-Origin: *) because spec-compliant browser-resident MCP clients fetch them cross-origin.

OAuth endpoints

PathMethodsPurpose
/oauth/registerPOSTRFC 7591 Dynamic Client Registration. Supports none, client_secret_basic, client_secret_post, and private_key_jwt token-endpoint auth methods. DCR clients expire after 90 days.
/oauth/authorizeGETGateway-wide authorization endpoint. Requires the resource parameter unless exactly one MCP route is configured.
/oauth/authorize/{routePath*}GETPer-route authorization endpoint. The resource is implicit from the path.
/oauth/callbackGETBrowser-login callback from the configured identity provider. Renders the consent page.
/oauth/setupGET, POSTConsent screen. Lists the upstream the requested MCP route depends on. POST accepts decision=continue / approve / cancel.
/oauth/tokenPOSTRFC 6749 token endpoint. Supports authorization_code and refresh_token grants.
/oauth/revokePOSTRFC 7009 revocation endpoint. Accepts public-client revocations without authentication.
/oauth/dev-loginGETLoopback-only dev shortcut. Returns 403 over non-loopback addresses.

Upstream connection endpoints

PathMethodsPurpose
/auth/connections/{connection}/connectGETBrowser entry to the upstream OAuth flow. With redirect=true, returns a 302 to the upstream /authorize; otherwise returns 428 with the connect-required payload.
/auth/connections/{connection}/callbackGETUpstream OAuth callback. Renders a success or failure page.

Customer-defined MCP routes

PathMethodsPurpose
/<route-path> (one per upstream, e.g. /mcp/linear)GET returns 405; POST proxies upstreamThe MCP route endpoints themselves. AI clients connect here. Path is set in routes.oas.json.

OAuth scopes

The gateway issues exactly one scope on access tokens:

ScopeMeaning
mcp:toolsPermission to call MCP methods (tools/call, tools/list, prompts/get, resources/read, and so on) on the bound MCP route.

DCR requests that include any other scope value are rejected with invalid_client_metadata. Token responses always include scope: "mcp:tools".

Default TTLs

WhatDefaultWhere to overrideRationale
Browser session (zuplo_mcp_session)8 hoursbrowserLogin.sessionTtlSeconds on the OAuth policy.Aligns with a typical workday so users don't re-authenticate mid-session.
Access token15 minutesgateway.accessTokenTtlSeconds on the OAuth policy.Short window contains the blast radius of a leaked token. The token endpoint upper-bounds this by the grant's remaining lifetime, so refresh-rotated tokens shorten as the grant ages.
Refresh token / grant~10 yearsgateway.refreshTokenTtlSeconds on the OAuth policy.Downstream refresh grants are gateway client sessions, not upstream OAuth token lifetimes. The default is intentionally long so the gateway doesn't impose a shorter session bound than the upstream provider's refresh-token policy already does.
DCR-registered client90 daysNot configurable.Encourages clients to use CIMD where possible; stale DCR clients age out automatically.
Authorization code60 secondsNot configurable.OAuth 2.1 recommendation.
oauth_authorize state15 minutesbrowserLogin.stateTtlSeconds.Window between /oauth/authorize and /oauth/callback.

Headers

Required on requests to MCP routes

HeaderRequiredNotes
Authorization: Bearer <token>Yes (after initial 401)Opaque access token issued by /oauth/token. Tokens in query strings are rejected.
Accept: application/json, text/event-streamYesPer the Streamable HTTP transport spec. The gateway forwards the body as-is.
MCP-Protocol-Version: 2025-11-25Yes after initializePer the MCP spec. The gateway tracks the current MCP protocol revision.

Honored when present

HeaderPurpose
HostSource for the gateway's issuer URL in AS metadata.
X-Forwarded-HostUsed when behind a reverse proxy or custom domain that rewrites Host.

If the issuer in your AS metadata document looks wrong (for example, https://*.zuplosite.com instead of your custom domain), check that your proxy or CDN propagates one of those headers correctly.

Stripped before upstream

Inbound auth headers don't leak to the upstream — the gateway sets its own upstream Authorization header.

Compatibility date

MCP Gateway features require compatibilityDate >= 2026-03-01 in zuplo.jsonc:

Code
{ "compatibilityDate": "2026-03-01", }

See Compatibility dates.

Authorization Server metadata extensions

In addition to the standard RFC 8414 / OIDC discovery fields, the gateway publishes a vendor extension:

FieldTypeValuesPurpose
x-zuplo-browser-login-kindstring"federated_oidc", "local_dev"Lets client tooling special-case local development configurations (which use /oauth/dev-login and a loopback IdP).

Public route URL pattern

Each MCP route exposes a stable public URL:

Code
https://<gateway-origin>/<route-path>
  • <gateway-origin> is your Zuplo deployment URL (for example https://my-gateway.zuplo.dev) or your custom domain.
  • <route-path> is the path set in config/routes.oas.json for the route — for example /mcp/linear-v1. The convention is /mcp/<provider>-v<n>, but any path works.

Related references

  • How it works — request lifecycle and architecture.
  • Troubleshooting — symptoms, causes, and fixes for the issues these defaults most often cause.
  • MCP authorization spec (2025-11-25) — the canonical reference for the auth model the gateway implements.
  • MCP Streamable HTTP transport — the transport semantics the gateway uses.
Edit this page
Last modified on May 27, 2026
LoggingTroubleshooting
On this page
  • Public URLs
    • Well-known metadata
    • OAuth endpoints
    • Upstream connection endpoints
    • Customer-defined MCP routes
  • OAuth scopes
  • Default TTLs
  • Headers
    • Required on requests to MCP routes
    • Honored when present
    • Stripped before upstream
  • Compatibility date
  • Authorization Server metadata extensions
  • Public route URL pattern
  • Related references
JSON