Skip to main content
Glama

Why

Every agent and every machine ends up with its own copy of every API key, its own OAuth login to every MCP server, and access to all of their tools. keyhall puts them in one place:

  • Connect once. Remote MCP servers (with OAuth), local MCP servers started by command (paste the same mcpServers JSON you'd give Claude Desktop or Cursor), and any HTTP API, turned into MCP tools from its OpenAPI spec.

  • Hand out narrow tokens. A token reaches a whole organization, one project, or a scope with hand-picked connections and tools, e.g. "the support bot may only list mail domains".

  • One endpoint. Every consumer uses https://<your-keyhall>/mcp. Revoke one token without touching the others.

  • Keep secrets in a vault. Reference them from connections ({{secret:STRIPE_KEY}}), load them in scripts and CI through REST, or let agents read them through MCP when you allow it. Every read is logged.

  • Encrypted at rest. AES-256-GCM, with the key outside the database. Consumers never see an upstream credential.

Related MCP server: connect

Quick start

Requires Docker with Compose. See requirements: 512 MB of RAM is enough.

mkdir keyhall && cd keyhall
base=https://raw.githubusercontent.com/luizgustavosaraiva/keyhall/main/deploy
curl -fsSLO $base/docker-compose.yml
curl -fsSL $base/.env.example -o .env
sed -i "s|^BETTER_AUTH_SECRET=.*|BETTER_AUTH_SECRET=$(openssl rand -base64 32)|" .env
sed -i "s|^KEYHALL_ENCRYPTION_KEY=.*|KEYHALL_ENCRYPTION_KEY=$(openssl rand -base64 32)|" .env
docker compose up -d
docker compose logs keyhall      # copy the setup code

Open http://localhost:8787, enter the setup code and create your account, then follow Getting started.

IMPORTANT

SaveKEYHALL_ENCRYPTION_KEY from .env in a password manager. Without it, nothing stored in keyhall can be decrypted, not even from a backup.

Then connect a client:

claude mcp add --transport http --scope user keyhall https://<your-keyhall>/mcp \
  --header "Authorization: Bearer kh_..."

Deploy

Where

Guide

Your own computer

Docker → own computer

Any VPS, with automatic HTTPS

Docker → Caddy

Behind nginx, Traefik, Dokploy, Coolify…

Docker → existing proxy

Without Docker (Node.js + systemd)

From source

Private, only for your devices (optional)

Tailscale

Releases follow Semantic Versioning. Images are tagged X.Y.Z, X.Y and latest; pin X.Y to get fixes without surprises. See operations for upgrades, backups and key rotation.

Documentation

Contributing

Issues and pull requests are welcome. Read CONTRIBUTING.md first; it covers the development setup, the checks CI runs, and the contribution terms. Please report vulnerabilities privately, as described in SECURITY.md. Changes are listed in the changelog.

License

PolyForm Noncommercial 1.0.0. Free for personal use, research, education, and noncommercial organizations. Commercial use requires a separate license from the author: open an issue or reach out through GitHub.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables teams to securely store and retrieve credentials, view decrypted secrets or live OAuth tokens, and connect to third-party MCP servers through a unified MCP endpoint.
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables an agent to search approved MCP integrations and expose only the tools a given task needs, signing the user in once via browser-based OAuth and enforcing scopes, effects and budgets in code. It also acts as a single gateway connection so existing hosts can reach many servers with per-tenant isolation and audit events.
    MIT
  • F
    license
    Not graded
    quality
    A
    maintenance
    Enables teams to onboard remote MCP servers, enforce function-level allow lists and credential modes, and let developers expose permitted tool bundles through a unified MCP endpoint with search and execute functions while keeping permissions and auditing enforced.
    -