Egress through a proxy
This guide is for platform operators whose cluster reaches the internet only through an HTTP or HTTPS proxy. It covers pointing the at the proxy, which allowlists decide whether a call uses it, and what the proxy must allow so end ’ OAuth tokens keep renewing. Read it alongside Internal networking, which covers the same allowlists for internal destinations.
Point the Arcade Engine at the proxy
The reads the standard proxy variables. Set them with engine.extraEnv:
engine:
extraEnv:
- name: HTTPS_PROXY
value: http://proxy.corp.example.com:3128
- name: HTTP_PROXY
value: http://proxy.corp.example.com:3128
- name: NO_PROXY
value: arcade-worker-main,.svc,.cluster.local,10.0.0.0/8,localhost,127.0.0.1NO_PROXY must name every in-cluster destination the way the addresses it. A leading-dot entry such as .svc matches only names that end in it, so it doesn’t cover a bare Service name such as arcade-worker-main: list each bare name. A CIDR entry matches only URLs that use an IP address, not a name that resolves into the range. The Arcade Engine’s calls to the Coordinator never use the proxy.
With networkPolicy.enabled, add the proxy’s address to networkPolicy.egressCIDRs, or the chart’s egress policy blocks the connection to it.
Which calls use the proxy
The Arcade Engine guards destinations that tenants or servers supply, so it doesn’t send every outbound call the same way. With the proxy variables set, a call to an external host that doesn’t match NO_PROXY uses the proxy when:
| Outbound call | Uses the proxy when |
|---|---|
Auth providers in engine.yaml or the chart’s oauthProviders | Always |
MCP servers declared in engine.yaml or the chart | Always, for calls to the server itself |
| Auth providers created in the dashboard or API | The endpoint’s host is in engine.authSsrfAllowlist as an exact host, a wildcard, or * |
| MCP servers added in the dashboard or API | The server’s host is in engine.ssrfAllowlist as an exact host, a wildcard, or * |
| The authorization server any remote MCP server names | Its host is in engine.ssrfAllowlist as an exact host, a wildcard, or * |
A call to a host that isn’t allowlisted by name goes through the ’s private-address guard, which connects directly and ignores HTTPS_PROXY. On a network where only the proxy reaches the internet, that call fails. CIDR entries don’t change this: they’re checked against the address the Arcade Engine connects to, so they never send a call through the proxy.
List each provider and host by name:
engine:
authSsrfAllowlist:
- https://login.microsoftonline.com # exact scheme + host [+ port]
- "*.okta.com" # any subdomain of the suffix
ssrfAllowlist:
- https://mcp.example.com # the remote MCP server
- https://auth.example.com # the authorization server it namesFor an server added in the dashboard or API, allowlist both the server and its authorization server. For one declared in engine.yaml, allowlist its authorization server. The discovers the authorization server from the ’s metadata, then calls it for the token exchange and every renewal.
Be aware that an exact host or wildcard entry also lets the reach that host when it resolves to a private address. "*" treats every destination as allowlisted by name. Prefer entries for the specific hosts you use.
Allow the token endpoints on the proxy
The proxy must allow every endpoint the calls to get and renew end- tokens:
- For an , the
token_request,refresh_request, anduser_info_requestendpoints in its configuration. Built-in providers list their defaults in the auth provider reference. Microsoft useslogin.microsoftonline.com. - For a remote server, the server’s host and its authorization server’s host.
Be aware that the reads the token endpoint’s answer to decide whether to ask the end to authorize again. The proxy should pass the status, headers, and body through unchanged. A response the proxy writes itself is read as the provider’s: a 400 or 401 whose body names an OAuth error code reads as a refusal, and asks the end user to authorize again. See When token renewal fails.
Size the proxy for renewal bursts
The renews a token when a tool call finds it expired, not in the background. An that runs for many at once, such as a scheduled job, renews many tokens at the same moment, and each renewal can make up to three attempts. Size the proxy’s per-source connection and rate limits for that burst: every renewal comes from the Arcade Engine’s pods. Agent developers can spread the load too; see Agents that call tools for many users.
Common failures
| Symptom | Likely cause and fix |
|---|---|
A provider created in the dashboard can’t authorize or renew, while engine.yaml providers work | Its endpoints aren’t allowlisted by name, so the Arcade Engine connects directly. Add each endpoint’s host to engine.authSsrfAllowlist. |
| A remote MCP server’s authorization fails | Add both the MCP server and its authorization server to engine.ssrfAllowlist by name. |
| Tool calls to an in-cluster MCP server time out | The call went to the proxy. Add the Service’s bare name to NO_PROXY. |
| Renewals report the provider as temporarily unavailable during a scheduled run | The proxy is rejecting or dropping the burst. Raise its limits for the Arcade Engine’s pods. |
| End users are asked to authorize again while the provider is healthy | The proxy is answering renewals with its own error body. Pass token responses through unchanged. |
Last updated on
Internal networking
Run a Helm-installed Arcade platform with no public ingress, behind an internal load balancer or Gateway API, and let it reach MCP servers on your internal network
IPv6 and dual-stack
Run the Helm-installed Arcade platform on a dual-stack Kubernetes cluster, and what doesn't support IPv6 yet