Skip to content

One MCP endpoint.
Every server behind it.

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:latest

Clients

Claude Code key: laptop
Home agent key: agent
Any MCP client key: ci
MCP Yard/mcp · one merged tool listkeys and scopes · audit logversions · updates · rollback

Servers

npm package installed by the hub
PyPI package own virtualenv
Remote URL HTTP or SSE

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.

The MCP Yard dashboard: server health, updates and security checkThe MCP Yard dashboard: server health, updates and security check

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.

Read the server file reference

mcpyard.yaml
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 minutes

Cookieless visit counts by a self-hosted Umami: it knows a page was opened, not by whom.