MCP Server Unified Gateway (self-hosted)

LLMs

A self-hosted gateway that manages several MCP servers from a single web dashboard: it exposes one unified endpoint, and AI clients such as Claude Desktop or Cursor connect to it with one URL plus a Bearer key; docker compose builds it from source and starts it, with two demonstration servers pre-configured and Traditional Chinese documentation included; a derivative work built on an Apache-2.0 upstream.

SubscriptionUS$49 per month
Last run2026-11-02
In practice
Readiness4 / 5
What you need
Few changes needed5 / 5

Who it is for

People who want to give MCP clients such as Claude Desktop or Cursor access to tools, and who want to host that themselves rather than use a cloud-managed service: a local toolbox for an individual developer, a shared MCP endpoint for a small team. Adding, removing and grouping servers is done by clicking in the dashboard, and the AI client is configured with one URL plus a key. This is not a cloud-managed service (the buyer hosts it), and it does not include LLM API credit.

How to start

$ sh scripts/quickstart/init-env.sh
$ docker compose up -d

Browse the files

Files in the product repository at the pinned commit. A few house files are left out of the zip.

File overview681 paths
▸articals12
assets/
intro.md
intro2.md
smart-routing.md
▸assets18
amap-edit.png
amap-result.png
cherry-mcp.png
cursor-mcp.png
cursor-query.png
cursor-tools.png
dashboard.fr.png
dashboard.png
dashboard.zh.png
group.png
…
▸bin1
cli.js
▸docs95
README.md
adr/
agents/
api-reference/
configuration/
development.mdx
development/
docs.json
essentials/
favicon.ico
…
▸examples4
mcp_settings_with_env_vars.json
oauth-dynamic-registration-config.json
oauth-server-config.json
openapi-schema-config.json
▸frontend144
favicon.ico
index.html
postcss.config.js
public/
src/
tailwind.config.js
tsconfig.json
tsconfig.node.json
vite.config.ts
▸locales4
en.json
fr.json
tr.json
zh.json
▸scripts4
dev-backend.js
quickstart/
validate-release-notes.js
verify-dist.js
▸src217
betterAuth.ts
cli/
clients/
config/
constants/
controllers/
dao/
db/
index.ts
middlewares/
…
▸tests136
auth.logic.test.ts
basic.test.ts
cli/
config/
controllers/
dao/
db/
frontend/
index.boot.test.ts
integration/
…
▫AGENTS.md
▫ATTRIBUTION.md
▫CLAUDE.md
▫CONTEXT.md
▫Dockerfile
▫LICENSE
▫LICENSE-99LL
▫PRODUCT.md
▫QUICKSTART.md
▫README.fr.md
▫README.md
▫README.zh.md
▫SECURITY.md
▫delivery-manifest.txt
▫docker-compose.db.yml
▫docker-compose.yml
▫entrypoint.sh
▫eslint.config.mjs
▫jest.config.cjs
▫mcp_settings.json
▫nginx.conf.example
▫package.json
▫pnpm-lock.yaml
▫pnpm-workspace.yaml
▫servers.json
▫tsconfig.json
▫tsconfig.test.json
▫Config and hidden files 19

Latest passing run

Clone → Checkout → Toolchain → Init env → Build → Up and see → Mcp initialize → Teardown

Pre-purchase Disclosure

What you are buying

An MCP gateway that runs on your own machine: the MCP servers you already have are registered into one web dashboard, which starts and manages them for you; an AI client connects with a single URL plus a key and reaches the tools through it. It is built from source and started with docker compose.

A derivative of an Apache-2.0 open source project: we added the compose file, an initialisation script, demonstration servers pre-configured, and Traditional Chinese documentation. Delivery is a frozen snapshot: one zip file, taken from the product repository at revision ec0e08b.

Known limitations

  • The service itself is served over HTTP (port 3000 by default); exposing it to the public internet needs your own reverse proxy and TLS
  • Smart Routing (which needs an embedding key and pgvector), database mode and social login are not pre-configured
  • Settings and keys are written back into the unpacked directory (mcp_settings.json and data/); clearing them means deleting those files separately, as described in QUICKSTART
  • The first build fetches from the network (the demonstration time server is also downloaded through npx on its first start); images built from the same version on different days differ in their bytes
  • The dashboard page loads fonts from Google Fonts, and “check for updates” reaches upstream’s official site
  • Two of the upstream issue templates carry Simplified Chinese file names (for example .github/ISSUE_TEMPLATE/bug-报告.md); the file contents are as described in the file tree
  • Pinned to the delivered snapshot; it does not follow upstream.

The liability cap, the scope of what is promised and the statutory floor are governed by the Terms of Service.

Vetting record

Everything below was checked against the pinned commit bfd153c. Every verdict carries its full reasoning, an evidence link and the checker; failures are published, not hidden — do not take our word for it, verify it yourself.

5 PASS0 WARN0 FAIL

Source ReviewPASS

The scope of the review, recorded as it stands: the delivered tree holds 682 files, reviewing every one of them was not feasible, so the approach was pattern scanning plus review of the paths that matter. Pattern scanning (src/ and frontend/src/): zero hits for eval( and new Function(; child_process appears in exactly one place, src/utils/cacheUtils.ts, where execFile runs a fixed command (npm/uv cache cleanup) with a timeout and no user input concatenated into it. Paths reviewed in detail: entrypoint.sh (npm registry / proxy settings and automatic dockerd startup — the latter only fires when docker is installed in the image, and the default image does not have it), the Dockerfile, src/config/ (the configuration loading paths) and src/routes/index.ts (route mounting and the authentication middleware). MCP servers are started as child processes by @modelcontextprotocol/sdk according to mcp_settings.json, which is what this product is designed to do, and that configuration file is under the buyer's control. In runtime testing (a local container) no anomalous behaviour was observed outside the endpoints gated by the features described above, but no packet-level egress monitoring was done, which is recorded as it stands.

Evidence is in our private repository (not publicly accessible):https://github.com/dev-zillio-cc/dsp-012-mcp-server-unified-gateway/tree/1a80bdbe7a7c74511b50c89b4baddc452bf1e5ddChecked in 2026Checked by claude-code build session
Script SafetyPASS

Every executable script was looked at one by one: entrypoint.sh (described above), scripts/quickstart/init-env.sh (written by us, generating a random password from openssl/urandom, idempotent), and the rest of scripts/, which are upstream's development helpers and do not reach the buyer's path. The build-time fetching in the Dockerfile means that images built from the same commit on different days are not the same bytes — the same shape as the apt-get precedent on dsp-021, and it is the face a periodic health check exists to catch, not a sign that the script itself is unsafe.

Evidence is in our private repository (not publicly accessible):https://github.com/dev-zillio-cc/dsp-012-mcp-server-unified-gateway/blob/1a80bdbe7a7c74511b50c89b4baddc452bf1e5dd/DockerfileChecked in 2026Checked by claude-code build session
RecencyPASS

Checked at the time of vetting (2026) with gh api: the upstream repository was not archived, the delivery base bfd153c3 was the main HEAD on the day of that check, and the iteration rhythm was several commits a day. The product repository is frozen at that upstream commit plus our own work, and does not follow upstream.

Evidence ↗Checked in 2026Checked by claude-code build session
LicensePASS

SPDX:LicenseRef-99LL-Product

Two layers of licence, both inside the delivered tree: (1) upstream samanhappy/mcphub is Apache-2.0 — gh api returns spdx_id=Apache-2.0, and the LICENSE at the root of the repository is word for word the full text of the Apache License 2.0 (checked at the proposal stage and re-checked inside the delivered tree, both in 2026), permitting commercial use, modification, redistribution and use in proprietary work, with the obligations being to keep the licence notice and to mark modifications; upstream's LICENSE is kept at the root of the delivered tree as it stands, with not one word altered. (2) On our side LICENSE-99LL was produced from the 99LL product licence template as the sale and liability terms for the product as a whole (this is a derivative of an open source upstream, so the template is additional terms and does not override upstream's licence), with spdx expressed as LicenseRef-99LL-Product.

Evidence is in our private repository (not publicly accessible):https://github.com/dev-zillio-cc/dsp-012-mcp-server-unified-gateway/blob/1a80bdbe7a7c74511b50c89b4baddc452bf1e5dd/LICENSE-99LLChecked in 2026Checked by claude-code build session
Dependency LicensesPASS

Back-end production dependencies: actually scanned inside the delivered image at /app with license-checker --production (2026), and all 95 packages are permissive — MIT 82, Apache-2.0 7, BSD-3-Clause 2 (bcryptjs, tough-cookie), BSD-2-Clause 2 (dotenv, dotenv-expand), ISC 1, Unlicense 1 (the postgres driver, public domain), with zero GPL/AGPL/LGPL. The front-end dependencies are build-time devDependencies, only the static files produced by vite build are delivered with the image, and they were not scanned package by package, which is recorded as it stands.

Evidence is in our private repository (not publicly accessible):https://github.com/dev-zillio-cc/dsp-012-mcp-server-unified-gateway/blob/1a80bdbe7a7c74511b50c89b4baddc452bf1e5dd/package.jsonChecked in 2026Checked by claude-code build session
HEALTH VERIFIED

Last verified passing: 2026-11-02

Subscribe for everything
US$49/ monthwas US$99

A subscription unlocks the whole catalogue; you do not buy this one separately.See what is included

Sign in with Google first; if you are signed out you will be sent to the sign-in page. Your subscription is billed to that same email address.

Already subscribed? This downloads straight away. Otherwise you are sent to the pricing page, or to sign in first.