A generic MCP gateway whose tools are registered and executed asynchronously by browser applications over WebSocket.
Project description
A generic, subclassable Model Context Protocol gateway whose tools are registered and executed asynchronously by connected providers over WebSocket.
MCP Client ⇄ Streamable HTTP ⇄ Gateway ⇄ WebSocket ⇄ Provider
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.
🧩 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()
See the Gateway library guide for every override point and a worked example of building your own extension.
📚 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. |
| 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.
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
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 mcp_gtw-0.0.2.tar.gz.
File metadata
- Download URL: mcp_gtw-0.0.2.tar.gz
- Upload date:
- Size: 338.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1903d768d4c85e48212c9325300929b4a63db01fdb1bf1ecdea16fc081dbc480
|
|
| MD5 |
c045078748a31539298e49f9a46aa5a5
|
|
| BLAKE2b-256 |
abb90b324d7344bb18091fd392ddb1d3e466c9db69e7176c802cccb37c8a2f78
|
File details
Details for the file mcp_gtw-0.0.2-py3-none-any.whl.
File metadata
- Download URL: mcp_gtw-0.0.2-py3-none-any.whl
- Upload date:
- Size: 27.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ee2be0f5d4f3e3924f3f8c00da9471a4530063bce56dc3c3071d2c9d78e84dc1
|
|
| MD5 |
f6d0372d33637139cf2c8ef251225f13
|
|
| BLAKE2b-256 |
f67ea3cce5d9115174ad79f31637b872d8ac731df923abeebef685275c07c703
|