v0.1.0
First public release. Extracted from a private deployment and made
config-driven so it can run against any fleet.
Added
- 85 MCP tools over a single streamable-http endpoint, covering fleet SSH
execution, Proxmox, Docker, Synology DSM, Cloudflare tunnels and DNS, n8n,
Notion, a Bitwarden/Vaultwarden bridge, LM Studio, Wake-on-LAN, background
jobs, and health probes. config.py, a single place resolving every site-specific value from the
environment,.env, and YAML inventory. No address, hostname, domain, or
credential identifier lives in the tool code.hosts.yamlfleet inventory with roles and tags;fleet_exectargets a
tag rather than a hand-maintained list.topology.yaml(optional): curated overlay for guest mapping,
recycled-IP traps, and a hard do-not-touch list — the knowledge a live scan
cannot recover.endpoints.yaml(optional): HTTP health probes forendpoints_health,
with a separateintermittentlist for hosts that are often powered down.- Opt-in integrations. Each is off until its
*_ENABLEDflag is set, and
disabled ones return a clear error rather than failing obscurely. - Pluggable secrets provider:
env(default) orvaultwardenvia a
bw servedaemon. DSM and Notion credentials resolve through either. - Bearer-token authentication (
MCP_AUTH_TOKEN), enforced by ASGI
middleware with a constant-time comparison. - Multiplexed SSH with a configurable ControlPath, so fleet-wide commands
reuse one connection per host. - Packaging:
pyproject.tomlwith amcp-hubentry point, pinned
requirements.txt, systemd unit templates, and an idempotent
deploy/install.shthat provisions a dedicated user, a dedicated SSH key,
and generated secrets without ever overwriting existing config. --version/-Vflag, and aversionfield inmcp_health.- CI: lint, an import-and-register smoke test across Python 3.11–3.13, a
read-only enforcement test, and a guard rejecting private network data or a
tracked real config file.
Security
MCP_READ_ONLYdefaults totrue. All 37 mutating tools refuse until
it is explicitly turned off. Enforcement is centralised by wrapping tool
registration, so a tool cannot silently escape the guard — but a new
mutating tool must be added toconfig.MUTATING_TOOLS, which CI checks.- Binds
127.0.0.1by default instead of0.0.0.0. Exposing remote shell
execution on a network is now a deliberate act. SECURITY.mdstates the threat model without softening it: this is
remote code execution as a service, and prompt injection is an RCE primitive
against it. It also lists what the project explicitly does not defend
against.- The MCP
initializehandshake now reports the hub's own version. Previously
it fell back to the installedmcplibrary version, misinforming clients. - Secret redaction is applied to file reads and command output.
Known limitations
- Docstrings are a mix of French and English; the project began as a private
French-language tool. server.pyis a ~3600-line monolith. Splitting it intotools/*modules is
planned, in reviewable behaviour-preserving chunks.ruff formatand theUPlint rules are not enforced yet — applying either
wholesale would bury every subsequent diff.- There is one trust level. Anyone holding the bearer token has full access;
there is no per-tool ACL and no multi-user model.