drjones 72020b1901 feat: Phase 0/1 — runnable MCP gateway (aggregation + namespaced routing)
Implements the walking skeleton from the roadmap: agents connect to one HTTP
endpoint and Nexus aggregates upstream MCP servers behind it with namespaced
tools. Written in Go (single static binary), no external services required.

What works end-to-end (verified live + hermetic e2e tests):
- MCP protocol layer: JSON-RPC 2.0 + initialize/tools.list/tools.call
  (internal/mcp), with stdio (subprocess) and Streamable HTTP client
  transports, and a reusable stream transport for in-process wiring.
- Router + Dynamic Tool Registry: connects/initializes upstreams in parallel,
  loads tools, namespaces them as {namespace}.{tool}, dispatches tools/call to
  the owning upstream; refreshes on list_changed. A failed upstream stays
  not-ready without taking down the gateway (data plane stays up).
- Gateway: single MCP endpoint (POST /mcp) that is an MCP server to agents,
  plus /healthz and a minimal /metrics exposition.
- CLI (cmd/nexus): `serve`, `connect` (stdio<->HTTP bridge for local agents),
  `demo-mcp` (built-in zero-dep demo server: echo/add/now), `version`.
- Config: declarative YAML with env expansion + validation.
- Store: persistence interfaces + in-memory impl (SQLite lands later).

Foundations for later phases: domain types (ARCHITECTURE §7), two-plane
split, event-driven refresh seam.

Tooling: Makefile (build/test/vet/fmt with version ldflags), config.example
.yaml. GOPATH moved to /go so it doesn't collide with the module root at /root;
.gitignore whitelist extended to track Go sources while ignoring build output.

Tests: unit (registry/namespacing) + full e2e (client -> demo server over
pipes -> router -> HTTP gateway: initialize, aggregated tools/list, tool-call
routing, unknown-tool error). go vet + gofmt clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-07 09:43:08 +00:00

MCP Nexus

The control plane for MCP. One endpoint. Every tool. Zero manual config.

Kubernetes for MCP — discovery, install, routing, auth, and healing for every MCP server on your network.


Status: design phase. This repository currently contains the architecture and design docs. No runnable code yet. See the Roadmap for the delivery plan and Architecture for the full design.

The problem

Every AI agent (Claude, Cursor, VSCode, Goose, OpenWebUI, Aider, …) has to be told about every MCP server individually — install it, configure it, hold its secrets, keep it updated, wire it into each agent's config. Multiply that by every agent × every service on a homelab or in an enterprise and it collapses under its own weight.

The idea

Run one thing. Agents connect to a single endpoint:

https://mcp.company.lan

Behind that endpoint, MCP Nexus:

  • Discovers the services on your network (Home Assistant, Proxmox, Postgres, Ollama, GitHub, UniFi, …).
  • Looks up the right MCP server for each in a package registry.
  • Installs it as a sandboxed container and configures it automatically.
  • Aggregates every MCP server behind one endpoint with namespaced tools (homeassistant.turn_on, postgres.query, github.create_issue).
  • Secures access with auth + RBAC, so each agent sees only the tools it's allowed to.
  • Heals unhealthy servers and updates them, with rollback.

Think of it like plugging a USB device into a modern OS: it's detected, the right driver is installed, and it just works — but for every AI tool and service across your infrastructure.

How it works (30-second version)

MCP Nexus is a reconciler — like Kubernetes, but for MCP servers. It continuously drives what's actually running toward what should be running given the services it discovers and the recipes/policies you set.

Discovery ─▶ Registry/Recipes ─▶ Installer ─▶ Runtime ─▶ Inventory
                                                            │
Agents ─▶ Gateway ─▶ Auth/RBAC ─▶ Router ─▶ upstream MCP servers ─▶ your services

Full picture: docs/ARCHITECTURE.md.

Design tenets

  1. One endpoint, unlimited agents.
  2. Reconcile, don't script.
  3. Everything is a plugin.
  4. Single static binary first (Go); Postgres/K8s optional for scale-out.
  5. Secure by default — sandboxed, least-privilege, audited, secrets never leak to agents.
  6. Discovery is probabilistic — every result carries a confidence score.

Tech stack

  • Backend / control plane: Go (single static binary, embedded SQLite, embedded dashboard).
  • Protocol: MCP over JSON-RPC 2.0 (Streamable HTTP + stdio bridge).
  • Runtime: Docker first; containerd / Kubernetes adapters planned.
  • Dashboard: React, embedded in the binary.
  • Observability: Prometheus metrics + shipped Grafana dashboards.

Modules

The system is 20 modules, each with its own design doc in docs/modules/:

Control plane Data plane Cross-cutting
Discovery Engine Gateway Secrets Manager
Package Registry Dynamic Tool Registry Plugin System
Auto Installer Authentication Notifications
Health Monitoring RBAC Service Graph
Update Manager Web Dashboard Metrics
Smart Recipes AI Agent Profiles Security
Infrastructure Discovery Future Vision

Roadmap at a glance

Phase Goal
0 — Foundations Repo, domain types, storage, config, event bus.
1 — Walking skeleton Gateway aggregates a manually-registered MCP server behind one endpoint.
2 — Discover → install Discovery + registry + recipes + installer close the reconcile loop.
3 — Secure Auth, RBAC, secrets, per-agent tool scoping.
4 — Operate Health, updates, metrics, notifications, dashboard.
5 — Extend & scale Plugin system, service graph, K8s runtime, HA.

Details: docs/ROADMAP.md.

Contributing

Design-phase feedback is the most valuable contribution right now — open an issue on the design docs. Coding conventions and a CONTRIBUTING.md will land with Phase 0.

License

TBD (intended to be a permissive open-source license — see roadmap).

Description
MCP gateway: routes Model Context Protocol servers (Omninexus hub)
Readme 153 KiB
Languages
Go 98.7%
Makefile 1.3%