Community
Release notes
User-visible changes per release. The full list is in the server CHANGELOG.
0.10.0
Breaking: Docker settings
Version requirement
These settings require v0.10.0 or later. Upgrade the image and the compose file together: user: "0:0" on a 0.9.x image runs the server and every MCP as root. Never set it on a 0.9.x image.
MCP processes no longer run as the server's user. Update your docker-compose.yml (see Docker):
user: "0:0"— the entrypoint drops to uid 1000; no root process remainscap_drop: [ALL]andcap_add: [SETUID, SETGID, KILL, CHOWN, SETPCAP]security_opt: [no-new-privileges:true]andread_only: truedeploy.resources.limits.pids: 4096
Without SETUID, SETGID or KILL, MCP children refuse to start and the server logs a clear message (fail closed). Without SETPCAP, the container refuses to start.
Breaking: user API port
The browser and user API (login, session, CSRF token, user endpoints) is served on the admin port 9443 only, no longer on 8443. 8443 serves only the MCP client protocol and the agent endpoint.
server.trust_proxy / MCP_AMBASSADOR_TRUST_PROXY no longer accept hop counts: use true, false or an IP/CIDR list.
Security
- Each MCP instance runs as its own unprivileged uid (default range 20000-20999) with zero capabilities, a private
0700home and cache, and no access to/data. See Security Model. - With isolation on (the default), children always start with
--no-new-privs, and setuid/setgid bits are stripped from the image. The server logs a warning once, when it first checks to start an MCP, if it runs withoutno-new-privileges, and a startup warning if child isolation is disabled. - Per-instance process cap (
MCP_AMBASSADOR_CHILD_NPROC, default 256, counts threads) and a container-widepidslimit;tiniis PID 1. - Known residuals: instances share the network namespace and the process list (TD-063).
Changed
- Creating or updating an MCP through the admin API, or installing one from the registry, with a command that is not on the allowlist (
MCP_ALLOWED_COMMANDS) now returns 400. - Community registry entries are reduced to the fields the server reads when cached; sync provenance fields are no longer stored or returned by the admin registry API.
Added
- Per-tool group policy, tool kill switch, progressive tool disclosure and approval gates. See the Groups & RBAC, Kill Switches, Progressive Disclosure and Approval Gates guides.
- Tool Review: Approve all and Approve selected for pending tool definitions (FB-033), via
POST /v1/admin/mcps/:mcpId/tool-pins/approve(1-200 pins per request). See Tool Pinning. uv/uvx(pinned) and systempython3in the server image, for registry MCPs that run PyPI packages. See MCP Catalog.- Community registry: weekly dry-run sync and curated intake. See Registry.
New environment variables
| Variable | Default | Purpose |
|---|---|---|
MCP_AMBASSADOR_CHILD_UID_RANGE | 20000-20999 | uid range for MCP instances (minimum 10000) |
MCP_AMBASSADOR_CHILD_NPROC | 256 | Per-instance process/thread limit; raise for browser MCPs |
MCP_AMBASSADOR_CHILD_UID | unset | Legacy single-uid mode, used only when the range is unset |
Upgrading from 0.9.x
- Back up
./data,./config,./cacheand your compose file. - Empty the
./cachedirectory before the first 0.10.0 boot. MCP packages are downloaded once again. - Check that
./datais owned by uid 1000 and thatambassador-server.yamlis readable by uid 1000 (keep it0600). - Apply the compose changes above and remove any
MCP_AMBASSADOR_CHILD_UIDsetting (the image now sets a default uid range, and setting both makes the entrypoint exit). docker compose up --build -dand check/health.
To roll back, restore your old compose file and image, and empty ./cache again before upgrading a second time.
0.9.1
Hardening release: CSRF protection, audit log rotation, stronger password policy, structured logging and UX polish. See the roadmap.