Universal agent protocol gateway — translate between A2A, MCP, OpenAI Assistants, and REST in one config file.
Project description
agent-gateway
One gateway. Every agent protocol. Route requests between A2A, MCP, OpenAI Assistants, and plain REST — with a single YAML config.
pip install agent-gateway
The Problem
The AI agent ecosystem is fragmented:
Your App ──→ Agent A (A2A protocol)
──→ Agent B (MCP tools)
──→ Agent C (OpenAI Assistants API)
──→ Agent D (plain REST)
Each speaks a different language. You write adapters for each. Then a new protocol drops and you rewrite everything.
The Solution
┌────────────────────┐
Your App ────────→│ agent-gateway │────→ Agent A (A2A)
│ │────→ Agent B (MCP)
│ One protocol │────→ Agent C (OpenAI)
│ in, any out │────→ Agent D (REST)
└────────────────────┘
Talk to the gateway in any protocol. It translates to any other.
Quick Start
1. Define your gateway
# gateway.yaml
gateway:
name: my-gateway
port: 8080
routes:
- name: search-agent
upstream:
protocol: a2a
url: http://localhost:9000
expose_as:
- mcp # Expose A2A agent as MCP tool
- rest # And as REST endpoint
- name: code-helper
upstream:
protocol: mcp
command: python -m code_helper_mcp
transport: stdio
expose_as:
- a2a # Expose MCP server as A2A agent
- openai # And as OpenAI Assistants-compatible
- name: legacy-api
upstream:
protocol: rest
url: https://api.example.com/analyze
method: POST
headers:
Authorization: "Bearer ${API_KEY}"
expose_as:
- a2a
- mcp
2. Start the gateway
agent-gateway serve gateway.yaml
3. Connect from any protocol
# As A2A client:
response = a2a_client.send_task("search-agent", "Find recent papers on RLHF")
# As MCP client (from Claude Desktop):
# Just add to claude_desktop_config.json:
# {"mcpServers": {"gateway": {"url": "http://localhost:8080/mcp"}}}
# As OpenAI-compatible:
from openai import OpenAI
client = OpenAI(base_url="http://localhost:8080/openai/v1")
response = client.chat.completions.create(
model="code-helper",
messages=[{"role": "user", "content": "Fix this bug"}],
)
# As REST:
import httpx
response = httpx.post("http://localhost:8080/rest/search-agent", json={"query": "RLHF papers"})
Protocol Support Matrix
| From ↓ / To → | A2A | MCP | OpenAI | REST |
|---|---|---|---|---|
| A2A | — | ✅ | ✅ | ✅ |
| MCP | ✅ | — | ✅ | ✅ |
| OpenAI | ✅ | ✅ | — | ✅ |
| REST | ✅ | ✅ | ✅ | — |
Architecture
┌─────────────────────────────────────────────────────────────────┐
│ agent-gateway │
│ │
│ ┌──────────┐ ┌────────────┐ ┌──────────┐ ┌─────────┐ │
│ │ Ingress │───→│ Router │───→│Translator│───→│ Egress │ │
│ │ │ │ │ │ │ │ │ │
│ │ • A2A │ │ • Match │ │ • A2A↔X │ │ • HTTP │ │
│ │ • MCP │ │ route │ │ • MCP↔X │ │ • stdio │ │
│ │ • OpenAI │ │ • Auth │ │ • OAI↔X │ │ • SSE │ │
│ │ • REST │ │ • Rate │ │ • REST↔X │ │ │ │
│ └──────────┘ └────────────┘ └──────────┘ └─────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
Features
- Protocol translation — Seamless conversion between A2A, MCP, OpenAI, REST
- YAML configuration — No code required, just declare routes
- Environment variables —
${VAR}expansion in config - Auth passthrough — Forward headers, tokens, API keys
- Health checks — Built-in
/healthendpoint with upstream status - Hot reload — Change config without restart (
--watch) - Middleware — Rate limiting, logging, request/response transforms
- Discovery — Auto-generates agent cards, tool lists, OpenAPI specs
CLI
# Start gateway
agent-gateway serve gateway.yaml
# Validate config
agent-gateway validate gateway.yaml
# List routes
agent-gateway routes gateway.yaml
# Health check
agent-gateway health http://localhost:8080
Programmatic Usage
from agent_gateway import Gateway
gateway = Gateway.from_yaml("gateway.yaml")
# Translate a single request
result = await gateway.translate(
source_protocol="rest",
target_route="search-agent",
payload={"query": "test"},
)
Why Not Just Use X?
| Solution | Limitation |
|---|---|
| mcp-a2a-bridge | Only 2 protocols (MCP ↔ A2A) |
| LangServe | LangChain-only, single protocol |
| Custom adapters | One-off, unmaintainable |
| API Gateway (Kong, etc.) | No protocol awareness, just HTTP routing |
agent-gateway understands the semantics of each protocol — agent cards, tool schemas, function calling, streaming — and translates them correctly.
Contributing
git clone https://github.com/naveenkumarbaskaran/agent-gateway.git
cd agent-gateway
python -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
pytest
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file agentic_gateway-0.1.0.tar.gz.
File metadata
- Download URL: agentic_gateway-0.1.0.tar.gz
- Upload date:
- Size: 9.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cd9d78f29d1c3666b7f1894fb15194d98882edbe18f76ef023df664825949228
|
|
| MD5 |
2ff39807b2627e2020e37d975d231718
|
|
| BLAKE2b-256 |
38554f4ef64e0e5b00e33d771be5b8858c7550c33ad63bfb9329177cb6c168b8
|
File details
Details for the file agentic_gateway-0.1.0-py3-none-any.whl.
File metadata
- Download URL: agentic_gateway-0.1.0-py3-none-any.whl
- Upload date:
- Size: 12.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fc623447c61a9dec37e39584e6700b25807afee9b9750e05e56a1ef341a96c4a
|
|
| MD5 |
7429d2bf62defafe2dec8f8355015320
|
|
| BLAKE2b-256 |
7800842c304cb8f7224630c499c460c7dc14e7104bb34ad111a522ba3b625cef
|