Skip to Content

Warp Pipes

Connecting AI to private is two problems. The first is networking: your internal servers and services aren’t reachable from the public internet, by design. The second is governance: a tunnel only moves bytes, so authentication, per- credentials, access scoping, and audit are a separate problem that the tunnel products leave to you.

The Arcade runtime already solves governance. Warp Pipes is a managed service that solves the networking — Arcade hands you a public URL and forwards traffic to your private runtime, so you don’t run the connection yourself.

Warp Pipes is in early access. Request access  to have Arcade manage the connection from your AI clients to your runtime. You can also connect clients today with your own reverse proxy — see Bring your own reverse proxy.

Outcomes

Connect external AI clients to private servers through a self-hosted Arcade runtime, while keeping your internal services off the public internet and your firewall closed to inbound traffic.

You will Learn

  • How Warp Pipes manages the connection from AI clients to your runtime
  • How the runtime reaches internal servers without inbound ports
  • How to allowlist internal addresses and register servers in engine.yaml
  • How to connect external clients today with your own reverse proxy

Prerequisites

How Warp Pipes works

Your Arcade runtime runs as an server inside your private network, on port 9099 by default, and it never faces the internet. You run the Warp Pipes connector alongside it; the connector makes one outbound connection to Arcade. Arcade gives you a public MCP URL and forwards every request down that connection to your runtime.

What Warp Pipes adds, and only this:

  • A public URL hosted by Arcade that any AI client connects to.
  • Managed forwarding from that URL to your internal runtime.
  • An outbound connector in your network that holds the connection open. Nothing inbound is exposed.

Everything behind the connector is the runtime you already have. Warp Pipes does not re-implement authentication, credentials, governance, or audit. It connects clients to the runtime that already does them.

Warp Pipes: external AI clients connect to a public MCP URL hosted by Arcade. Arcade forwards traffic down an outbound connection held open by the Warp Pipes connector inside the private network, to the Arcade runtime, which governs the call and reaches internal MCP servers. No inbound ports are opened.

How the runtime works

Two concepts shape every deployment, with or without Warp Pipes:

  • Gateways are named paths on the runtime (/mcp/{slug}). Each gateway has its own auth mode, allow-list, and access rules, so an AI client connecting to /mcp/finance sees only finance tools. You create gateways in the Arcade dashboard, not in engine.yaml.
  • Identity and access — users, organizations, API keys, RBAC, and OAuth — is managed in Arcade. The runtime makes outbound-only calls to it; it never dials the runtime. Multiple runtimes can share one Arcade .

Gateway auth modes

Each gateway uses one of three auth modes. The mode determines what the AI client sends and which clients can connect.

Dashboard nameConfig valueWhat the client sendsWorks with the Anthropic Messages API?
Arcade Autharcade_oauthBearer JWT issued by Arcade OAuthYes
User Sourceuser_sourceBearer JWT from your identity providerYes
Arcade Headersarcade_headerBearer token plus an Arcade-User-ID headerNo. The Anthropic connector can’t send custom headers

For Claude, through the Messages API or managed , use Arcade Auth or . See MCP Gateways for how to choose a mode and User Sources for connecting your own identity provider.

Connect to internal MCP servers

Your internal servers live at private hostnames or IP addresses. Configure the ssrf_allowlist in engine.yaml to tell the runtime which internal addresses it’s permitted to call, then register each URI as a worker.

The runtime calls these servers directly over your private network, by their internal addresses. No inbound ports, and no tunnel, are required.

A single Arcade runtime and its internal MCP servers share one private network. AI clients connect to scoped /mcp gateways, the ssrf_allowlist gates which internal addresses the runtime reaches, and the runtime makes outbound-only calls to Arcade for identity and access.

Add the allowlist and workers to the tools.directors section of engine.yaml:

YAML
engine.yaml
tools: directors: - id: default ssrf_allowlist: - "*.corp.internal" # any subdomain - "10.10.0.0/16" # IP range workers: - id: bloomberg enabled: true http: uri: "http://bloomberg.corp.internal:8000" secret: "${env:BLOOMBERG_SECRET}" - id: sap enabled: true http: uri: "http://sap.corp.internal:8080" secret: "${env:SAP_SECRET}" - id: github-enterprise enabled: true http: uri: "http://github.corp.internal" secret: "${env:GITHUB_SECRET}"

For the rest of the tools.directors and worker options, see runtime configuration.

Allowlist entry types

TypeExampleEvaluatedMatches
Exact hosthttps://host.corp:8080Before DNSScheme, host, and port exactly
Wildcard*.corp.internalBefore DNSAny matching subdomain
CIDR10.10.0.0/16After DNS resolutionIPs in the range

Keep these rules in mind when you write allowlist entries:

  • URIs must use http:// or https://. The runtime rejects other schemes at startup.
  • A wildcard such as *.corp.internal does not match the bare apex corp.internal. Add the apex separately if the runtime needs to reach it.
  • CIDR entries match against the resolved IP. For split-horizon DNS, where a hostname resolves to different IPs inside and outside the network, use exact-host or wildcard entries instead.
  • Malformed entries cause the runtime to fail at startup.

Configure the allowlist with Helm

If you deploy the runtime with the Arcade Helm chart, set the allowlist with --set:

Terminal
helm upgrade arcade monorepo/deploy/charts/arcade/ \ --set engine.ssrfAllowlist[0]="*.corp.internal" \ --set engine.ssrfAllowlist[1]="10.10.0.0/16"

Verify the connection

Use the worker test endpoint in the Arcade dashboard. A successful test confirms the allowlist entry is correct and that the runtime has a network path to the server.

Deploy across multiple networks

For multiple business units or regions, deploy a separate runtime per network. Each runtime has its own ssrf_allowlist scoped to the servers in that network, and all runtimes share one Arcade for identity and access.

Finance, Engineering, and EU each run their own Arcade runtime in their own private network with its own ssrf_allowlist. All three make outbound-only calls to one Arcade account, and cross-network access is blocked because the other networks' addresses aren't in each allowlist.

A typical topology assigns one runtime to each network:

DeploymentNetworkssrf_allowlistMCP servers
finance-nycNYC datacenter10.10.0.0/16, *.finance.corp.internalBloomberg, SAP, Workday
engineering-use1AWS us-east-110.20.0.0/16, *.eng.corp.internalGitHub Enterprise, Jira
eu-euw1AWS eu-west-110.30.0.0/16, *.eu.corp.internalEU APIs, GDPR-scoped data

This topology gives you:

  • Network isolation — each runtime can only reach the hosts and ranges in its own allowlist. The finance runtime can’t dial 10.20.x.x even if it receives a URI pointing there.
  • Data residency — the EU runtime’s traffic never leaves eu-west-1, and credentials in its vault stay in-region.
  • Credential isolation — each runtime holds its own credential vault. A compromise of one runtime exposes no credentials from the others.
  • Shared identity — all runtimes make outbound calls to the same Arcade for auth and RBAC. The data planes are independent; identity and access are shared.

Connect each runtime out with its own Warp Pipes URL, or front each with your own reverse proxy.

Bring your own reverse proxy

Warp Pipes manages the connection for you. If you’d rather run the networking hop yourself — or you already operate a reverse proxy or API gateway you trust — Arcade has always worked behind one.

Run a reverse proxy inside your network. It makes one outbound connection, so no inbound ports are needed. External clients connect to the proxy’s public hostname, and the proxy forwards traffic to the runtime internally.

External AI clients on the public internet reach the private Arcade runtime through a reverse proxy (cloudflared, ngrok, or nginx) running inside the network. The proxy makes one outbound connection, so no inbound ports are opened; everything behind it is the same governed runtime.

All AI clients see the same RFC 9728 OAuth interface regardless of which proxy you use. The runtime, the governance, and the security model are identical whether the connection is managed by Warp Pipes or by your own cloudflared, ngrok, or nginx.

Cloudflare Tunnel  runs cloudflared inside your network and exposes the runtime on a public hostname.

YAML
config.yaml
tunnel: <tunnel-id> credentials-file: /etc/cloudflared/credentials.json ingress: - hostname: arcade.yourdomain.com service: http://arcade:9099 - service: http_status:404
Terminal
cloudflared tunnel run

External clients connect to https://arcade.yourdomain.com/mcp/{gateway-slug}.

Required proxy headers

Whichever proxy you use, verify these headers pass through unchanged:

HeaderPurposeWhat breaks if stripped
AuthorizationOAuth bearer tokenAuth fails; the runtime returns 401
Mcp-Session-IdSession continuityEach request starts a new session
MCP-Protocol-VersionProtocol negotiationConnection errors with strict clients

The path /mcp/{slug} must also pass through intact. The runtime routes by gateway slug from the path.

Client compatibility

ClientConnectivityAuth mode
Claude (Messages API or managed agents)Warp Pipes or any proxyArcade Auth or User Source only
Cursor, Cline, Claude DesktopWarp Pipes or any proxyAll modes
ChatGPT, OpenAI agentsWarp Pipes or any proxyAll modes
Custom agentsWarp Pipes or any proxyAll modes

Known limitations

ItemNotes
Arcade Headers with the Anthropic Messages APINot compatible. The connector supports only authorization_token, with no custom headers. Use Arcade Auth or User Source.
nginx buffering (bring-your-own proxy)proxy_buffering off is required. Without it, nginx buffers streamed responses and clients never receive them.
Mcp-Session-Id pass-through (bring-your-own proxy)Verify your proxy forwards this header. Stripping it silently breaks session continuity for streamable HTTP clients.
Wildcard apex mismatch*.corp.internal does not match corp.internal. Register the apex separately if the runtime needs to reach it.
CIDR with split-horizon DNSCIDR entries match against the resolved IP. If a hostname resolves to different IPs inside and outside the network, use exact-host or wildcard entries instead.

Next steps

Last updated on