One merged endpoint
Clients declare a single server. Tools come back as <server>-<tool>, filtered by what the key may see.
MCP Yard is a small, self-hosted MCP hub. It installs and runs your MCP servers, merges their tools behind a single /mcp endpoint, and gives each client its own key with exactly the access it needs.
services: mcpyard: image: ghcr.io/cedhuf/mcpyard:latest ports: ["127.0.0.1:3000:3000"] environment: MCPYARD_UI_AUTH: none # local trial volumes: - ./mcpyard.yaml:/config/mcpyard.yaml - mcpyard-data:/data
volumes: mcpyard-data:docker run -d --name mcpyard \ -p 127.0.0.1:3000:3000 \ -e MCPYARD_UI_AUTH=none \ -v ./mcpyard.yaml:/config/mcpyard.yaml \ -v mcpyard-data:/data \ ghcr.io/cedhuf/mcpyard:latestClients
Servers
One merged endpoint
Clients declare a single server. Tools come back as <server>-<tool>, filtered by what the key may see.
Known versions
Packages are installed by the hub, never npx -y. Pin a version, or let the hub track it and update in one click.
Safe updates
The new version starts next to the old one and takes over only once it answers. The previous one stays for rollback.
Keys with scopes
One bearer key per client, limited to servers and tool globs. Tokens are shown once and stored hashed.
Behind your identity provider
The web UI signs in with OpenID Connect: PocketID, Authelia, Keycloak. No local password to leak.
Small on purpose
One YAML file, a few environment variables, one Docker image. No database, no marketplace, no build step.
Server health, updates waiting, a security check and the latest activity on one dashboard, with every server, key and log one click away.


Servers live in a YAML file you can version. Secrets come from the environment and never reach a server that did not ask for them.
servers: time: package: { pypi: mcp-server-time } memory: package: npm: "@modelcontextprotocol/server-memory" version: "2026.8.31" # pinned search: url: https://search.example.lan/mcp headers: Authorization: Bearer ${SEARCH_TOKEN} tools: { deny: ["*_delete"] }Heavier hubs carry a marketplace, smart routing and a database. Light proxies expose one route per server, so every client has to declare every server. MCP Yard sits in between: one merged endpoint, known versions, scoped keys and an OIDC web UI, and nothing more.
Set it up in five minutesCookieless visit counts by a self-hosted Umami: it knows a page was opened, not by whom.