MCP servers
One agentgateway path for every Viper SandboxAgent.
Clients hit http://172.16.10.135:30100/mcp on the LAN.
The gateway multiplexes tools/list and tools/call
onto seven ClusterIP MCP pods. Vault stays on the pod, not the gateway.
Front door
Same agentgateway-proxy already used for OpenAI and Spark.
MCP is one more path on that Gateway — not a second proxy.
:30500 or the gateway admin UI
as a public URL. :30100/mcp is the home subnet, no bearer.
Never put Vault values in git or on this site — path names only.Seven MCP servers
Every server is a Deployment + ClusterIP in kagent,
STREAMABLE_HTTP on :8084/mcp.
Images are imported on the node (IfNotPresent).
Creds come from Vault via ExternalSecret.
| Prefix | Service | SandboxAgent | Target | Vault path | Git |
|---|---|---|---|---|---|
| fortigate_ | fortigate-mcp | fortigate | FortiGate 80F 172.16.10.1 | secret/platform/fortigate | k8s-viper platform/kagent-ai/fortigate-*.yaml |
| f5-bigip_ | f5-bigip-mcp | f5-bigip | BIG-IP 172.16.10.10 | secret/platform/f5-bigip | k8s-viper platform/kagent-ai/f5-bigip-*.yaml |
| arista-ceos_ | arista-ceos-mcp | arista-ceos | Containerlab cEOS eAPI | secret/platform/arista-ceos | k8s-viper platform/kagent-ai/arista-ceos-*.yaml |
| aws-budget_ | aws-budget-mcp | aws-budget | AWS us-east-2 billing / capacity | secret/platform/aws-budget | demos aws-sandbox-agent |
| servicenow_ | servicenow-mcp | servicenow | ServiceNow IT tickets | secret/platform/servicenow | demos service-now-sandbox-agent |
| gcp-budget_ | gcp-budget-mcp | gcp-budget | GCP us-east1 billing / capacity | secret/platform/gcp-budget | demos gcp-sandbox-agent |
| kagent-tools_ | kagent-tools | hello-substrate | in-cluster k8s reads | (kagent SA) | RemoteMCPServer · kagent Helm + hello-substrate |
Demos repo:
sebbycorp/kagent-agent-substrate-demos.
kagent SandboxAgents still talk to the ClusterIP Services directly
(RemoteMCPServer in kagent).
The gateway is the extra front door for Grok Bot and other MCP clients.
Live tools/list
A live tools/list through the gateway (2026-08-18) returned
185 tools. Prefixes keep names from colliding.
Traffic flow
A client hits one URL. The gateway multiplexes onto the right ClusterIP MCP. Those pods hold the Vault creds and talk to the real boxes and APIs. The client never sees FortiOS / iControl / eAPI / cloud keys.
One tool call after connect. Prefix on the way in, Vault only on the pod,
FailOpen on tools/list.
kagent UI skips the gateway for tools. It still uses this
same Gateway for the model (/v1 → gpt-5.5).
Live CRs
Live kubectl captures on k3s-viper, 2026-08-18 (status
Accepted). The agentgateway admin port (15000) is not
published on this lab, so these are the live CRs — not a reconstructed
admin UI.



How Grok Bot reaches it
Grok Bot (the k8s-viper agent) is the intended agentic front door.
You ask it to do infra work. It jumps onto Viper. You do not paste tokens,
and you do not publish /mcp.
- LAN via the Viper host. The agent already has a jump onto Viper and can call
http://127.0.0.1:30100/mcpfrom that host. Common case: no Grok Bot Plugins marketplace add. - This box cannot hit 172.16.10.135:30100 directly. The Grok Bot computer is not on the 172.16.10.0/24 LAN. A raw connector add of that URL times out unless a tunnel exists.
- Until a tunnel exists, prefer the k8s-viper chat (jump onto Viper, then
/mcpon localhost). - Cursor on the home LAN can point at the same URL. Still do not put this on a public machine.
{
"mcpServers": {
"viper": {
"url": "http://172.16.10.135:30100/mcp"
}
}
}npx @modelcontextprotocol/inspector@0.21.2,
transport Streamable HTTP, URL http://172.16.10.135:30100/mcp.Gateway CRD
Chart 1.4.1. Same Gateway as /v1,
/openai, /spark, /desktop/.
Git: platform/agentgateway-ai/backend-viper-mcp.yaml,
httproute-viper-mcp.yaml.
| Field | Value on Viper |
|---|---|
| protocol | StreamableHTTP |
| failureMode | FailOpen |
| prefixMode | Conditional |
| target | static.host + port 8084 + path /mcp |
| backendRef | *.kagent.svc.cluster.local:8084/mcp |
| HTTPRoute | viper-mcp · path prefix /mcp |
spec.mcp.failureMode: FailOpen— one down MCP does not kill the session or hide Fortigate tools.spec.mcp.prefixMode: Conditional— tool names becometarget_toolbecause there are many targets.backendRefis namespace-local only, so these use cluster DNS (*.kagent.svc.cluster.local).- Gateway does not inject Fortigate / F5 / cloud keys. The MCP pods already have ExternalSecrets.
docker exec k3s-viper kubectl -n agentgateway-system get agentgatewaybackend viper-mcp
docker exec k3s-viper kubectl -n agentgateway-system get httproute viper-mcp/mcp, tool-level allow lists, public internet exposure.
GET / on :30100 is 404 route not found.
That is expected. Use /mcp, /v1, or /spark.Source
Canonical runbook (this page is the public send-link): docs/mcp-servers/README.md.