🇪🇺 AI data plane egress

🇪🇺 Static IP for agentgateway

agentgateway.dev funnels every LLM call, MCP tool connection, and A2A hop into one data plane you run. Give that data plane two fixed static EU IPs, and providers, firewalls, and partner agents all see one dependable origin.

config.yaml

llm:

models:

- name: gpt-3.5-turbo

provider: openAI

params:

model: gpt-3.5-turbo

apiKey: "$OPENAI_API_KEY"

# gateway egress fixed via

# HTTPS_PROXY in its environment

One data plane, one blind spot

The gateway solved routing, auth, and observability for AI traffic. What it cannot solve from inside is the address that traffic leaves from.

Centralized traffic, wandering origin

Every agent, tool, and model call your teams make now crosses one process. But that process rides whatever address the scheduler gave it: rescheduled on another node, restarted after a config rollout, and the whole company's AI egress silently changes origin. The consolidation you built stops at the cluster boundary.

MCP tools live behind allowlists

Half the point of the MCP gateway is reaching tools and data sources that sit inside someone's perimeter: internal APIs, SaaS endpoints, partner MCP servers. Those endpoints admit traffic from addresses they know. A gateway phoning in from rotating cloud ranges turns every new tool connection into a firewall ticket negotiation.

Every provider key in one vault

Virtual keys and budget controls govern how teams consume models, but underneath them the gateway still holds real credentials for OpenAI, Anthropic, Bedrock, Gemini, and the rest. If one leaks, the blast radius is every model you route. Restricting those keys to addresses you own is the backstop that survives a leak.

Failover multiplies the footprints

Load balancing and automatic provider failover are core reasons teams adopt agentgateway, and they mean many different front doors judge your source address at once. When your traffic exits from shared cloud pools, reputation problems on one range hit you mid-failover, exactly when you needed the spare provider to just work.

The Solution

Your routing stays in the gateway. The exit becomes yours.

agentgateway

LLM routes, MCP tools, A2A

HTTPS Proxy

(Static EU IP)

Providers & tools

LLM APIs, MCP, A2A peers

Seen from outside, your entire agent fleet becomes a single well-behaved client on two permanent European addresses. Allowlists written once keep matching after every node reschedule and every config rollout.

Because every flow already crosses the gateway, you attach the egress once, at the deployment layer, and it covers LLM calls, MCP transports, and A2A hops together.
The two addresses operate as a failover set: whichever node serves a connection, no third address ever appears on a provider's radar to explain.
Provider credentials, JWTs, and OAuth tokens stay sealed in their TLS envelopes; the relay in between handles ciphertext only.

Why gateway operators pick OutboundGateway

Set at the right layer

Your config.yaml keeps describing listeners, routes, and policies exactly as the agentgateway docs intend. Egress belongs to the environment the process runs in, so that is where the pair of addresses gets attached.

One attachment, total coverage

Add a streaming route tomorrow, federate three more MCP servers next week: none of it touches your network story, because the addresses at the exit do not move when the routing table grows.

EU answers for AI workloads

Prompts, tool payloads, and agent conversations leaving through fixed European exits give your GDPR and EU AI Act documentation a network section that fits in two sentences.

Designed for

Teams who run the data plane themselves and answer for what it touches.

Platform teams on Kubernetes

Groups offering an internal AI platform through the Gateway API controller, who need the gateway pods' egress to be as predictable as their ingress.

Enterprises exposing internal tools

Security-minded orgs federating internal MCP servers and APIs through the gateway, where the destination side insists on knowing exactly who is calling.

Multi-provider LLM shops

Teams leaning on virtual keys, budgets, and provider failover, who want every provider front door to recognize the same two addresses.

Agencies shipping agent stacks

Consultancies deploying gateways for client after client, who want the network posture question answered once instead of per engagement.

Implementation

Clients keep talking to the gateway. The gateway's environment gains the fixed exit.

Point your clients at the gateway

Your application code changes nothing about its egress; it talks to the gateway on localhost like the quickstart shows. The OpenAI SDK just swaps its base URL.

from openai import OpenAI

client = OpenAI(
    base_url="http://localhost:4000/v1",
    api_key="agentgateway-virtual-key",
)

Give the gateway process its egress

The proxy lives in the environment of the agentgateway container, not in its YAML. Official image, config mounted, plus an env file holding the proxy URL and the provider key.

# .env.agentgateway (git-ignored)
HTTPS_PROXY=https://user:pass@eu-01.outboundgateway.com:8443
NO_PROXY=localhost,127.0.0.1
OPENAI_API_KEY=sk-your-key
services:
  agentgateway:
    image: cr.agentgateway.dev/agentgateway:v1.2.0
    ports:
      - "3000:3000"
    volumes:
      - ./config.yaml:/config.yaml
    env_file: .env.agentgateway
    command: ["-f", "/config.yaml"]

Verify what the world sees

Run any HTTP client inside the same environment; requests picks the proxy up from the variables and prints the address your provider logs will show.

import requests, os

# HTTPS_PROXY honoured from the environment
print(requests.get("https://api.ipify.org", timeout=30).text)

Kubernetes: same idea, secret-based

On the Gateway API deployment, the pod spec carries the egress so the controller's pods inherit it. Keep the proxy URL in a Secret, never in the manifest.

env:
  - name: HTTPS_PROXY
    valueFrom:
      secretKeyRef:
        name: outboundgateway
        key: proxy-url
  - name: NO_PROXY
    value: localhost,127.0.0.1,.cluster.local

Two addresses behind one attachment

The URL you store points at a redundant pair of European IPs: traffic flows through whichever node is healthy, and the pair trades places without introducing an address nobody allowlisted. Provider-side rules you write today keep describing your gateway tomorrow.

📖 Complete Documentation: For detailed examples, error handling, and advanced configurations, see the all guides.

AI traffic with an EU postal address

A gateway for AI workloads concentrates prompts, tool payloads, and agent conversations. Where that concentration exits is now a one-line answer.

GDPR on the wire

Personal data riding inside prompts and tool responses leaves through named European addresses, so the transfer description in your records matches the infrastructure instead of a rotating pool.

EU AI Act friendly

Operational control over where your AI system sends data is exactly the kind of technical measure the Act's documentation asks providers and deployers to describe. Fixed egress is a paragraph, not a project.

What you get

Allowlists that stay true

Firewall rules and partner entries written against your two addresses keep matching through reschedules, upgrades, and cluster migrations.

Env-level adoption

No YAML surgery, no new policies: the addresses ride in the process environment, and routing behavior stays byte-for-byte identical.

Failover without surprises

Maintenance on one node hands traffic to its partner, and the outside world still sees the same two addresses it always did.

European exits

Every provider call and tool fetch leaves from inside the Union, keeping residency descriptions short and checkable.

Backend-agnostic

LLM front doors, MCP servers, A2A peers, plain HTTP APIs: whatever route the gateway opens, the exit covers it the same way.

Honest pricing

Starting from €19/month. Flexible plans for every scale. Cancel anytime.

Fix the exit your data plane leaves from

You centralized the routing. Attach two permanent EU addresses and the outside view of your entire agent platform finally holds still.

Starting from €19/month. Flexible plans for every scale. Cancel anytime.

Frequently asked questions

Do I need to add a proxy section to my agentgateway config.yaml?

No. Your listeners, routes, backends, and policies stay exactly as the agentgateway documentation describes them. The egress lives one level down, in the environment of the process itself: standard proxy variables on the container or pod, stored separately from your routing configuration. Attach, restart, done.

All our traffic already crosses the gateway on one host. Isn't our IP already fixed?

Unfortunately no. The gateway consolidates where requests come from, not where they go out to. Its own outbound connections still use whatever network the process sits on, so a pod rescheduled to another Kubernetes node, or a container restarted on a new host, presents a different address to every provider and tool it calls. Centralized routing and stable egress are two separate problems, and the second one is ours.

Two IPs sounds like twice the allowlist work. How does that behave?

You register both addresses once, everywhere a source IP matters, and forget about it. They operate as a failover set: the proxy picks a healthy node per connection, and if one steps out for maintenance its partner takes over without any third address ever appearing. Nothing to update, nobody to notify.

Running agentgateway in production?

Tell us which providers and MCP endpoints yours talks to. We will map out what the fixed egress should cover, including your Gateway API setup.

Contact Our Founders →