Skip to main content

Universal agent protocol gateway — translate between A2A, MCP, OpenAI Assistants, and REST in one config file.

Project description

agent-gateway

PyPI version Python License: MIT Tests

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 /health endpoint 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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

agentic_gateway-0.1.0.tar.gz (9.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

agentic_gateway-0.1.0-py3-none-any.whl (12.9 kB view details)

Uploaded Python 3

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

Hashes for agentic_gateway-0.1.0.tar.gz
Algorithm Hash digest
SHA256 cd9d78f29d1c3666b7f1894fb15194d98882edbe18f76ef023df664825949228
MD5 2ff39807b2627e2020e37d975d231718
BLAKE2b-256 38554f4ef64e0e5b00e33d771be5b8858c7550c33ad63bfb9329177cb6c168b8

See more details on using hashes here.

File details

Details for the file agentic_gateway-0.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for agentic_gateway-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 fc623447c61a9dec37e39584e6700b25807afee9b9750e05e56a1ef341a96c4a
MD5 7429d2bf62defafe2dec8f8355015320
BLAKE2b-256 7800842c304cb8f7224630c499c460c7dc14e7104bb34ad111a522ba3b625cef

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page