Streamable-HTTP MCP endpoint with OAuth self-discovery. Add it once; Claude handles registration and sign-in. Each user gets an isolated account — no shared state.
# Claude Code — add (user scope = every project), then authenticate via /mcp
claude mcp add -s user --transport http planner https://planner.monopoly-gold.com/_mcp
-s user makes planner available in every project. Drop it to scope the server to the current directory only.
Claude.ai (web): Settings → Connectors → Add custom connector, same endpoint — steps below.
Prerequisites: the claude CLI installed
(Claude Code) and a Google
account to sign in with. The OAuth callback briefly binds local port 3118 —
keep it free.
Added HTTP MCP server planner with URL: https://planner.monopoly-gold.com/_mcp to user config
File modified: ~/.claude.json
claude (the interactive REPL),
type the slash-command /mcp, then pick planner → Authenticate
in the menu. /mcp is a REPL command, not a shell command — it won't work
outside claude. A browser tab opens the OAuth flow.localhost:3118/callback and the
CLI captures the token automatically.claude mcp list
planner: https://planner.monopoly-gold.com/_mcp (HTTP) - ✔ Connected
Before authenticating, that line reads
! Needs authentication — your cue to run /mcp.
First time? ✔ Connected means the token works — but a
brand-new account is created pending, so the first tool call returns
403 pending_approval until an admin approves you. That's expected,
not a bug — see the approval gate below. No re-auth once approved.
Planner, URL https://planner.monopoly-gold.com/_mcp → Add.Connection up ≠ tools usable until your account is approved (see below). Once approved, smoke-test
from a chat — ask Claude to list your projects, which calls list-projects:
> list my planner projects
→ planner:list-projects returns your projects (empty array on a fresh account)
Sign-in creates your account in pending state. Until an admin approves it, tool calls are rejected:
403 pending_approval — account created, awaiting approval
The admin gets a Telegram notification with approve/reject buttons. After approval, the existing connection starts working — no re-auth, no re-add. This blocks drive-by sign-ups from touching data.
No passwords, no API keys to paste. The MCP client discovers everything from the endpoint and runs a standard OAuth 2.1 authorization-code flow with PKCE; the identity provider is Google (OIDC).
| Mechanism | Detail |
|---|---|
| Protected Resource Metadata | /.well-known/oauth-protected-resource — RFC 9728 |
| Authorization Server Metadata | /.well-known/oauth-authorization-server — RFC 8414 |
| Client registration | Dynamic (RFC 7591) at /oauth/register — clients self-register |
| Flow | Authorization Code + PKCE (S256), OAuth 2.1 |
| Identity | Google OIDC; token bound to your account |
| Scope | mcp, bearer token in the Authorization header |
Inspect discovery yourself — it's public and unauthenticated:
curl -s https://planner.monopoly-gold.com/.well-known/oauth-protected-resource | jq
{
"resource": "https://planner.monopoly-gold.com/_mcp",
"authorization_servers": ["https://planner.monopoly-gold.com"],
"bearer_methods_supported": ["header"],
"scopes_supported": ["mcp"],
"resource_name": "Planner MCP",
"resource_documentation": "https://planner.monopoly-gold.com/api/capabilities"
}
Each account is a separate tenant. The goal tree, projects, evidence and history are scoped to their owner at the storage layer — not per-tool, so every tool, REST route and resource is isolated by construction. A direct ID from another tenant resolves to nothing.
| Symptom | Cause / fix |
|---|---|
| ! Needs authentication | Token missing or expired. Run /mcp → Authenticate. |
| 401 on /_mcp | Expected without a token — it's the auth challenge that drives discovery. Authenticate. |
| 403 pending_approval | Account awaiting admin approval. Nothing to do on your side; the connection activates once approved. |
| Redirect page error | If the localhost:3118 tab can't connect, copy the full address-bar URL back to the client to finish the flow manually. |
| Stuck after token change | Re-add cleanly: claude mcp remove planner -s user then re-run the add command. |