MCP Gateway
Zilla's MCP Gateway presents a single Streamable HTTP endpoint to every AI agent and fans out tool calls to any number of upstream MCP servers and HTTP APIs. Routing, caching, auth, and observability are handled at the gateway — no custom middleware, no SDK wrapper.
Features
HTTP APIs as ToolsSkip writing an MCP server: point at a REST API or an OpenAPI document and agents can call it today.
Kafka Topics as ToolsProduce, consume, and administer a Kafka cluster as MCP tools, no REST hop, no custom MCP server.
Virtual ServerGive agents one endpoint, no matter how many upstreams sit behind it.
Tool DiscoveryAdd hundreds of tools without burying an agent's context window in definitions.
Human-in-the-LoopLet a tool call pause mid-flight and ask the person behind the agent something.
Secure Agent AccessTurn agents away before a tool call ever reaches an upstream, no code in the agent or the upstream.
Architecture


| Binding | Role |
|---|---|
mcp · server | Terminates the inbound Streamable HTTP connection from the AI agent |
mcp · proxy | Routes tool calls to upstream providers by toolkit name |
mcp · client | Connects to an upstream MCP server over HTTP, WebSocket, or SSE |
mcp-http · proxy | Exposes any HTTP API as MCP tools with no MCP server needed upstream |
mcp-openapi · client | Compiles an OpenAPI document from a catalog into MCP tools and resources, no hand-authored tool list |
mcp-kafka · client | Exposes a Kafka broker's produce, consume, topic, and admin operations as fixed MCP tools, no REST hop |
mcp-kafka-connect · client | Exposes the Kafka Connect REST API as fixed MCP tools |
mcp-schema-registry · client | Exposes a schema registry's subject and schema operations as fixed MCP tools |
The last four bindings need no upstream MCP server at all, either compiling one from an existing spec (mcp-openapi) or exposing a fixed, built-in tool set directly against the backend (mcp-kafka, mcp-kafka-connect, mcp-schema-registry). See Backend Bindings for when to reach for each one, or How It Works for how a request flows through the binding pipeline end to end.
Get Started
zilla.yaml
stores:
cache:
type: memory
bindings:
north_tcp_server:
type: tcp
kind: server
options:
host: 0.0.0.0
port: 7114
routes:
- when:
- port: 7114
exit: north_http_server
north_http_server:
type: http
kind: server
options:
access-control:
policy: cross-origin
routes:
- when:
- headers:
":path": /mcp
exit: north_mcp_server
north_mcp_server:
type: mcp
kind: server
exit: north_mcp_proxy
telemetry:
metrics:
- mcp.*
attributes:
method: ${mcp.method}
tool: ${mcp.tool}
outcome: ${mcp.outcome}
north_mcp_proxy:
type: mcp
kind: proxy
options:
cache:
store: cache
ttl: PT5M
routes:
- exit: bluesky_mcp_client
when:
- toolkit: bluesky
- exit: payments_mcp_client
when:
- toolkit: payments
bluesky_mcp_client:
type: mcp
kind: client
options:
server: http://bluesky-mcp:3001/mcp
exit: sys:http_client
payments_mcp_client:
type: mcp
kind: client
options:
server: http://payments-mcp:3002/mcp
exit: sys:http_client
telemetry:
metrics:
- mcp.initialize
- mcp.initialize.duration
- mcp.tools.list
- mcp.tools.list.duration
- mcp.tools.call
- mcp.tools.call.duration
exporters:
prometheus_exporter:
type: prometheus
options:
endpoints:
- scheme: http
port: 7190
path: /metricsTry the example
The mcp.proxy example runs a full working MCP gateway with two upstream servers, toolkit routing, a 5-minute listing cache, and Prometheus metrics — all from a single docker compose up.

