MCP Gateway

MCP Gateway

A generic, subclassable MCP gateway that routes requests between MCP clients and WebSocket-connected providers, allowing providers to register and execute tools asynchronously.

Category
Visit Server

README

<p align="center"> <img src="extras/images/logo.png" width="380" alt="MCP Gateway" /> </p>

<p align="center"> A generic, subclassable Model Context Protocol gateway whose tools are registered and executed asynchronously by connected providers over WebSocket. </p>

<p align="center"> <code>MCP Client</code> ⇄ Streamable HTTP ⇄ <code>Gateway</code> ⇄ WebSocket ⇄ <code>Provider</code> </p>

<p align="center"> <a href="https://github.com/mcp-gtw/mcp-gtw/actions/workflows/ci.yml"><img src="https://github.com/mcp-gtw/mcp-gtw/actions/workflows/ci.yml/badge.svg" alt="CI"></a> <a href="https://pypi.org/project/mcp-gtw/"><img src="https://img.shields.io/pypi/v/mcp-gtw.svg" alt="PyPI"></a> <a href="https://pypi.org/project/mcp-gtw/"><img src="https://img.shields.io/pypi/pyversions/mcp-gtw.svg" alt="Python"></a> <a href="LICENSE.md"><img src="https://img.shields.io/badge/license-MIT-blue.svg" alt="License: MIT"></a> </p>


The gateway never knows the capabilities ahead of time. A provider — typically a browser app — connects, publishes its own MCP tools, resources, prompts and more, and executes them when an MCP client calls them. The gateway only registers, publishes and routes, staying completely domain agnostic.

It is a small, installable library. You build a real application by subclassing Gateway and overriding hooks. The handlers themselves are written in JavaScript. This library never prescribes a specific frontend — the Provider SDK guide teaches the JS side generically.

📦 Install

pip install mcp-gtw
# or
uv add mcp-gtw

🚀 The smallest gateway

from mcp_gtw.gateway import Gateway

app = Gateway().create_app()
uv run python -m mcp_gtw.main

This publishes a real MCP endpoint at /mcp, a private provider WebSocket at /provider and a health check at /health. It exposes whatever capabilities the connected provider registers.

☁️ One-click deploy

The image runs production-ready as a non-root process. Deploy it to any host that keeps a persistent server (the /provider WebSocket needs one — serverless like Vercel does not work):

Deploy to Render

Render, Railway and Fly.io run the Dockerfile as-is (they inject PORT, which the gateway reads); on a VPS (Hostinger, …) use Docker Compose. Full guide, including reverse proxy and TLS: deployment.

🧩 Extending it

Subclass Gateway and override the hooks to attach your own domain logic:

from mcp_gtw.channel import Channel
from mcp_gtw.gateway import Gateway

class MyGateway(Gateway):
    mcp_server_name = "my-app"

    async def on_provider_connected(self, channel: Channel) -> None:
        ...  # a provider session just came online

    def register_routes(self, app) -> None:
        super().register_routes(app)
        ...  # add your own HTTP and WebSocket routes

app = MyGateway().create_app()

Every behaviour is a swappable strategy with a secure default — authentication, tokens, origins, expiry and the wire codec. Change one by setting a *_class attribute or injecting an instance, without touching the transport. See the Gateway library guide for every override point, Extensibility for the strategy contracts, and Auth recipes for token, username/password and client-supplied-token models.

📚 Documentation

Guide What it covers
Architecture Components, transports and request flows.
Quick start Install, run and connect an MCP client.
Gateway library The Gateway class and every override point.
Extensibility The swappable strategies, their contracts and the invariants.
Auth recipes Token, username/password and client-supplied-token models.
Configuration Every setting and environment variable.
Provider protocol The private gateway ⇄ provider message protocol.
Provider SDK Writing the JavaScript provider and registering tools.
Browser console Turn any open page into a provider from DevTools.
MCP clients Connecting Claude Code, generic clients and the Inspector.
Admin dashboard The optional monitoring dashboard and its stats API.
Security The security model, tokens, origins and hardening.
Testing Running the suite and the 100% coverage gate.
Deployment Docker, reverse proxies and scaling.

🗂️ Layout

.
├── src/mcp_gtw/     # the library
├── tests/               # unit and integration tests (100% coverage)
└── docs/                # the guides linked above

✅ Requirements

  • Python 3.12+ — tested on 3.12, 3.13 and 3.14 in CI (3.12 is the pinned local and Docker version)
  • Any MCP client (Claude Code, Cursor, the MCP Inspector, …)

💜 Support

If this project saved you time, consider supporting it: GitHub Sponsors · Ko-fi.

Made with care by Paulo Coutinho.

Licensed under MIT.

Recommended Servers

playwright-mcp

playwright-mcp

A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.

Official
Featured
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.

Official
Featured
Local
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.

Official
Featured
Local
TypeScript
VeyraX MCP

VeyraX MCP

Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.

Official
Featured
Local
graphlit-mcp-server

graphlit-mcp-server

The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.

Official
Featured
TypeScript
Kagi MCP Server

Kagi MCP Server

An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.

Official
Featured
Python
E2B

E2B

Using MCP to run code via e2b.

Official
Featured
Neon Database

Neon Database

MCP server for interacting with Neon Management API and databases

Official
Featured
Exa Search

Exa Search

A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.

Official
Featured
Qdrant Server

Qdrant Server

This repository is an example of how to create a MCP server for Qdrant, a vector search engine.

Official
Featured