Self-hosted MCP platform

Every MCP
server needs
a home.

Write a tool in the browser. Hit deploy. A containerized FastMCP server is live at a stable URL — ready for Claude Desktop, Claude Code, or any MCP client.

★ Star on GitHub
9 stalls in service · turntable nominal
FastAPIFastMCPReact + ViteDockerTraefikPostgres
Departures

Now serving

PLATFORM :3080 — ALL SERVICES NOMINAL
EngineRouteStatus

Every deployed server gets a stable route: http://<host>:3080/s/<name>/mcp — shared across your team, secured with scoped bearer tokens.

The problem

MCP's deploy story is scripts on a laptop
a platform.

Network engineers and developers are sitting on years of scripts and hard-won automation that belong in the new paradigm — AI running lead, your tooling on call. Plugging that code in shouldn't mean mastering the MCP spec and a DevOps pipeline in the same week. And for Federal and air-gapped networks, cloud-hosted platforms were never on the table: no connectivity, no integrations, no option.

The big vendors won't save you either — they ship MCP servers for their products. The tools your team actually needs are custom: your network, your phone system, your runbooks, that one legacy system everything depends on. Roundhouse runs entirely on your hardware and gives each of them a permanent stall: codegen, an image build, a container behind Traefik, and a URL that never moves — with scoped bearer tokens from day one.

It turns “I wrote a tool” into “my team can use it from Claude.”
The bays

Six reasons to come in
off the cold rails

Bay 01

Codegen → Deploy

Define primitives in a structured form — or paste raw Python. Roundhouse generates server.py + Dockerfile, builds the image, and runs the container behind Traefik.

Bay 02

Centralized URLs

One stable URL per server, shared across your team. No tunnel hacks, no port juggling. Traefik routes clients straight to the container — never proxied on the hot path.

Bay 03

Auth on day one

Scoped bearer tokens out of the box, enforced per-tool by middleware. Encrypted at rest. Swap in OIDC when you outgrow them — not before you need to.

Bay 04

Lifecycle, visible

Status, logs, redeploys, scopes, and tokens — all in the same two-pane editor. Batched changes deploy together with one Save & Redeploy.

Bay 05

Three server modes

Structured (forms → codegen) for quick tools. Code-first when you need full control. Remote proxy to put scoped auth in front of MCP servers you don't host.

Bay 06

Single host or Swarm

Run the whole yard on a laptop with docker compose, or on a Swarm cluster with scoped socket proxies and per-server replica caps.

The line

From idea to in-service
in four stops

STOP 01

Write

Describe a tool's inputs, outputs, and body in a form — or paste a whole server.py. Your call.

STOP 02

Generate

Roundhouse writes the FastMCP server and its Dockerfile. You review it in the editor, like any other code.

STOP 03

Build

The image is built and the container spun up behind Traefik — health-checked, logged, capped.

STOP 04

Dispatch

Live at /s/your-server/mcp. Mint a scoped token, point Claude at it, done.

roundhouse · servers / net-config · structured mode
⬤ 2 unsaved changes — redeploy required Save & Redeploy
Tools
find_switch_port
provision_vlan
Resources
switches://inventory
Server
auth · 3 scopes
1# generated by roundhouse — structured mode
2from fastmcp import FastMCP
3
4mcp = FastMCP("net-config")
5
6@mcp.tool
7def find_switch_port(mac: str) -> dict:
8    """Locate the switch port a MAC address is on."""
9    return fabric.trace_mac(mac.lower())
10
11if __name__ == "__main__":
12    mcp.run(transport="http", port=8000)
All aboard

Up and running before your coffee cools

Requires Docker and Docker Compose — nothing else. When the API logs print Application startup complete, open http://localhost:3080 and sign in with the seed admin. From there, the field manual covers every surface — creating servers, tokens, usage metrics, and platform administration.

claude_desktop_config.json
{
  "mcpServers": {
    "my-server": {
      "url": "http://localhost:3080/s/my-server/mcp",
      "headers": { "Authorization": "Bearer <token>" }
    }
  }
}
terminal
$ claude mcp add my-server \
    --url    http://localhost:3080/s/my-server/mcp \
    --header "Authorization: Bearer <token>"
quick start — four commands
$ git clone https://github.com/Karmatek-Consulting-LLC/roundhouse.git
$ cd roundhouse
$ cp .env.example .env
$ docker compose up -d
# …images build, migrations run, Traefik takes the door…
✓ platform-api    | Application startup complete
# open http://localhost:3080 → admin@mcp.local / admin