Skip to content

Server file

Servers live in one YAML file; runtime settings come from environment variables.

servers:
time:
package: { pypi: mcp-server-time }
memory:
package:
npm: "@modelcontextprotocol/server-memory"
version: "2026.8.31" # pinned: the hub never changes it
mail:
title: Example Mail # shown in the web UI; tools keep the name mail
package: { npm: "@example/mcp-mail", bin: mcp-mail }
env:
MAIL_TOKEN: ${MAIL_TOKEN} # from the hub's environment
tools:
deny: ["delete_*"]
local:
command: /usr/local/bin/my-server
args: [--stdio]
cwd: /srv/my-server
search:
url: https://search.example.lan/mcp
headers:
Authorization: Bearer ${SEARCH_TOKEN}
legacy:
url: https://old.example.lan/sse
transport: sse
enabled: false

Server names use letters, digits, _ and -. They prefix every tool the server exposes.

You can also add, edit and remove servers from the web UI: it rewrites this file, keeping your comments and ${VAR} references, and refuses any change that would not parse. See Web UI.

Each server has exactly one of these:

Key The hub… Extra fields
package installs it from npm or PyPI and runs it over stdio npm or pypi, version, bin, allowScripts
command spawns an executable over stdio args, cwd
url connects to a remote server headers, transport (streamable-http or sse)

Packages are covered in Packages and updates.

Field Default Meaning
title the name Shown in the web UI only. Tool names keep the short server name.
args [] Arguments for a package bin or a command.
env {} Environment of the spawned process, on top of PATH, HOME and the like.
tools {} allow and deny globs on the server’s own tool names.
enabled true false keeps the entry without starting it.

${VAR} is replaced from the hub’s environment anywhere in the file, and a missing variable stops the hub at startup rather than starting a server with an empty token.

Inside { } or [ ], quote the reference, or YAML reads the { of ${ as a new map:

env: { TOKEN: "${TOKEN}" } # quoted inside { }
env:
TOKEN: ${TOKEN} # block style needs no quotes

Spawned servers never inherit the hub’s environment. They get a minimal set (PATH, HOME and the like) plus their own env, so a token meant for one server cannot leak to another.

Clients see <server>-<tool>: time-get_current_time, mail-send_email. Routing uses a lookup table, so names are never split on -. If two names collide, the first wins and the hub logs a warning.

Claude Code prefixes tools with mcp__<client name>__ and rejects names over 64 characters; the hub warns at startup about any tool that would cross that line. Keep server names short and put the readable name in title:

servers:
info_mail:
title: Infomaniak Mail
url: https://mail.example/mcp
Variable Default Meaning
MCPYARD_CONFIG /config/mcpyard.yaml The server file.
MCPYARD_DATA_DIR /data Keys, installed packages, recorded versions, session key.
MCPYARD_PORT 3000 HTTP port.
MCPYARD_VERSION_CHECK_HOURS 6 How often registries are asked for new versions, up to 720 (a month); 0 turns it off.
MCPYARD_AUTO_UPDATE false true updates every unpinned package once a day.
MCPYARD_AUTO_UPDATE_TIME 02:00 When, as HH:MM in hub time: set TZ in the container.
MCPYARD_HEALTH_CHECK true false stops the automatic health check.
MCPYARD_HEALTH_CHECK_MINUTES 5 How often every running server is pinged over MCP.
MCPYARD_PUBLIC_URL Base URL browsers use. Required with OIDC.
OIDC_ISSUER Issuer URL of your identity provider.
OIDC_CLIENT_ID Client id registered for MCP Yard.
OIDC_CLIENT_SECRET Client secret; omit for a public client.
OIDC_ALLOWED_GROUPS Comma-separated groups allowed to sign in.
MCPYARD_UI_AUTH oidc none turns web UI sign-in off.
MCPYARD_ADMIN_TOOLS true false removes the hub’s yard-* tools from every key. Also on the Settings page.
MCPYARD_THEME default default, neutral, ocean, coffee, nordic or pro, each with a light and a dark version. Also on the Settings page.
MCPYARD_THEME_MODE system system, light or dark: which version of the theme. Also on the Settings page.
MCPYARD_UPDATE_CHECK true false stops asking GitHub whether a newer MCP Yard exists. Also on the Settings page.

MCPYARD_ADMIN_TOOLS, MCPYARD_UPDATE_CHECK, MCPYARD_VERSION_CHECK_HOURS, the automatic update and health check variables and the two theme variables can instead be set on the web UI’s Settings page, saved in $MCPYARD_DATA_DIR/settings.json. When the variable is set, it wins and the page shows the setting locked. Everything else on this list is read once at startup.

After editing the file, apply it without a restart: click Reload in the web UI, call reload_config on the admin endpoint, or send SIGHUP:

Terminal window
docker kill -s HUP mcpyard

New servers start, removed ones stop, and servers whose settings changed restart with them; the others keep running untouched. A file that does not parse changes nothing and the error is reported. Environment variables are read once at startup, so a new ${VAR} still needs a container restart.