Kagenti with two MCP servers behind Envoy AI Gateway
This example deploys the Rosso weather and restaurant-reservation MCP servers,
aggregates them behind one Envoy Gateway data plane, and connects a Kagenti
generic agent to the single /mcp endpoint.
The manifests are in docs/en/ai_applications/components/kagenti/assets/envoy_ai_gateway_mcp. They
target the kagenti-mcp-demo namespace. Before applying them, change the
namespace and GatewayClass name if your environment uses different values.
TOC
Validated versionsTopology and the HTTPRoute countSource and imagesDeploy the gateway and two MCP serversTest the unified MCP endpointDeploy the Kagenti agentCleanupValidated versions
This example was validated on 2026-07-28 with:
Envoy AI Gateway 0.6 supports MCP aggregation, authentication, tool
authorization, and upstream credentials through MCPRoute.
Kuadrant mcp-gateway is not interchangeable with this API. Its controller
creates an Istio EnvoyFilter and requires that resource before
MCPGatewayExtension becomes ready. Envoy Gateway's native
EnvoyExtensionPolicy does not expose the mutation_rules.allow_all_routing
setting that Kuadrant MCP Gateway currently needs to rewrite :authority.
Use the native Envoy AI Gateway MCPRoute shown here with Envoy Gateway, or use
Kuadrant MCP Gateway with its supported Istio provider.
Topology and the HTTPRoute count
Author one MCPRoute with two backendRefs; do not author the backend
HTTPRoutes by hand. The controller creates exactly two backend routes and
one required client-facing route:
ai-eg-mcp-br-kagenti-tools-weatherai-eg-mcp-br-kagenti-tools-reservationai-eg-mcp-main-kagenti-tools
The first two are the requested per-server HTTPRoutes. The third exposes the
unified /mcp endpoint. All three are owned by the MCPRoute and must not be
edited directly.
Source and images
The workloads come from
rossoctl/examples commit
ec17c73235c8ef291a6d4aaa346b50a4fba35e72:
mcp/weather_toolmcp/reservation_toola2a/generic_agent
The YAML pins immutable multi-architecture image digests published at
ghcr.io/rossoctl/examples.
Deploy the gateway and two MCP servers
Create the example namespace if it does not exist:
Replace replace-this-demo-key in
03-mcp-route-auth-rate-limit.yaml before using this outside a disposable dev
environment. Then apply the server, gateway, and policy manifests:
The example uses API-key authentication and a local rate limit of 30 requests
per minute for each authenticated client ID. sanitize: true removes the API
key before the request is sent upstream. The generated client ID is forwarded
as x-mcp-client-id, which is the rate-limit key.
Verify the result:
Expected conditions are Gateway Programmed=True, MCPRoute Accepted, and
Accepted=True on all three generated HTTPRoutes.
Test the unified MCP endpoint
Forward the stable Envoy Service created by 02-gateway.yaml:
In another terminal, initialize a session. Omitting the API key must return
401; providing it must return an MCP response and an mcp-session-id header.
Use the returned session ID to list tools:
Tool names are prefixed with their backend, for example
weather__get_weather and reservation__search_restaurants.
Deploy the Kagenti agent
Create the LLM configuration Secret with an OpenAI-compatible endpoint:
MCP_URLS contains only the unified Envoy endpoint, so the agent discovers
both tool sets through one MCP connection. The generic agent currently exposes
only URL configuration, not per-server request headers; the example therefore
uses an API key query parameter. The agent logs MCP_URLS during startup, so
use this only for development. For production, add header-based MCP client
configuration to the agent or use Kagenti AuthBridge with OAuth/JWT and switch
the MCPRoute to securityPolicy.oauth.
Try prompts such as:
What is the weather in Taipei?Find Italian restaurants in Boston.
Cleanup
The generated HTTPRoutes are deleted with the MCPRoute: