agent-mcp-host
One-origin MCP host for the agent-* CLI family
- Language
- Go
- Version
- 0.6.3
- License
- PolyForm Perimeter 1.0.0
- Category
- CLI Tool
An MCP host that serves the whole agent-* CLI family from one machine, behind one domain, with one OAuth authorization server and a separate login per tool. Each family CLI keeps being a full MCP server in its own binary — the host mounts it behind a path rather than re-implementing it, owning only the shared front door, token minting, and the unified browser-facing pairing and enrollment pages. A person adds one Claude connector per tool; every call thereafter carries their identity.
Features
One origin for the whole family — every mounted agent-* CLI's MCP tools served from one domain, e.g. a single Tailscale funnel
One connector per tool, not one merged surface — /slack/mcp and /lin/mcp stay isolated, independently versioned and authorized
No URL to figure out — --tailscale funnel derives the public origin from MagicDNS and tears the tunnel down on exit
No separate step to start the tools — serve spawns each mounted binary in delegate mode with everything it needs injected
Attach mounts for when you want control — mount-env prints the exact launch command, then the host proxies to the process you started under a debugger or launchd
Single OAuth authorization server — the host owns pairing codes, named principals, token minting and the human-facing pages
Ed25519 AS/RS split — a delegate tool receives only the verify key, so it can validate tokens but never mint them
Per-tool audiences — a token minted for the Slack mount is useless at the Lin mount, by construction
Login once, grow into tools — a 30-day browser session covers identity, so adding tool N asks for no pairing code, only that tool's delta
Self-enrollment where a binding was not provisioned — the credential form's fields come from the tool's own mcp schema, and secrets reach it over stdin, never argv
Mounts by exec, not linking — the host discovers each tool via its MCP schema; no tool code is compiled in
Family-wide revocation — pair remove drops a person's pairing code, refresh tokens and browser sessions in one step
Install
Homebrew
$ brew install shhac/tap/agent-mcp-host AI Agent Skill
$ npx skills add shhac/agent-skills --skill agent-mcp-host --global GitHub Release (macOS)
$ curl -L https://github.com/shhac/agent-mcp-host/releases/latest/download/agent-mcp-host-darwin-arm64.tar.gz | tar xz Go Install
$ go install github.com/shhac/agent-mcp-host/cmd/agent-mcp-host@latest Build from Source
$ git clone https://github.com/shhac/agent-mcp-host.git && cd agent-mcp-host && make build Getting Started
agent-mcp-host is the operator's front door: one process runs the OAuth authorization server and reverse proxy, spawns each mounted family CLI as a loopback MCP server in delegate mode, and renders the shared pairing and enrollment pages. Install the tools you intend to mount; the host does the rest. Its signing key and pairing store live in the OS keychain.
01 · Provision a person
$ agent-mcp-host pair add alice --bind slack:workspace=acme --bind lin:workspace=acme Prints alice's pairing code — a secret, share it only with her. Bindings are namespaced per tool and both are optional: a tool that supports enrollment lets her enter credentials herself.
02 · Serve the family behind one origin
$ agent-mcp-host serve --tailscale funnel --mount slack=agent-slack --mount lin=lin With Tailscale there is no URL to work out. Otherwise pass --public-url https://hub.example and point your reverse proxy at the --http listener.
03 · She adds one connector per tool
$ https://hub.tailnet.example/slack/mcp She enters her pairing code once in the browser, and fills in that tool's credential form if no binding was provisioned. Adding /lin/mcp afterwards asks for no code — only lin's delta.
04 · Revoke in one place
$ agent-mcp-host pair remove alice Kills the pairing code, every per-tool refresh token, and her browser sessions together.
Usage
$ agent-mcp-host serve --tailscale funnel --mount slack=agent-slack --mount lin=lin $ agent-mcp-host pair add alice --bind slack:workspace=acme $ agent-mcp-host pair list $ agent-mcp-host pair show alice $ agent-mcp-host pair rotate alice $ agent-mcp-host mount-env lin=lin $ agent-mcp-host whoami $ agent-mcp-host pair remove alice