The hard part of a customer-facing MCP server isn't the tools — it's identity. Command+K's gateway gives every customer their own credential, validated and encrypted, with OAuth 2.1 discovery, dynamic client registration and PKCE handled for you. Verified end to end with the production clients of Claude, Cursor and ChatGPT.
Own API key or own OAuth account per customer. Your API sees them exactly like normal API traffic — because it is.
Protected-resource metadata, dynamic client registration, PKCE, refresh rotation, reuse detection — the whole authorization server, hosted.
Every log line carries the customer. Revoke one customer in one click without touching the rest.
Most MCP demos hardcode one key. The moment paying customers arrive, that key is a liability: no per-customer limits, no attribution, no individual revocation — and one leak exposes every account. The fix isn't a better secret. It's identity per customer, enforced at a gateway in front of your API.
| Mode | Best for | How it works |
|---|---|---|
| Customer API keys (recommended) | SaaS products whose customers already hold API keys | Customer pastes their own key once on your hosted connect page; it's validated against your API, encrypted, and forwarded per call. |
| Auto-connect (OAuth wrap) | The smoothest onboarding on top of customer keys | Customer just adds your MCP URL to Claude — the connect screen opens automatically via OAuth discovery + Dynamic Client Registration. |
| Customer OAuth (proxy) | Products with their own OAuth server | We bridge Claude to your authorization server, store per-customer tokens encrypted, and refresh them silently. |
| Webhook verify | Custom approval logic | We call your HMAC-signed webhook with the customer's identity; you decide who gets in and with which tool scopes. |
| Shared token / open | Internal team use or public read-only data | Explicitly labelled as such in the dashboard — never the default for customer-facing MCPs. |
They paste your MCP URL into Claude. Claude hits the endpoint, reads the OAuth discovery metadata, registers itself, and opens this hosted screen — branded with your MCP's name and logo:

From that moment, every single call carries their identity — visible in your request log, enforceable in your limits, billable if you choose:
| At | Event | Tool | Customer | Outcome |
|---|---|---|---|---|
| 9:20 PM | tools/list | — | admin@commandplusk.com | Success 363 ms |
| 8:57 PM | tools/call | post | ada@loopwork.io | Success 867 ms |
| 8:45 PM | tools/call | labels | ada@loopwork.io | Success 295 ms |
| 8:33 PM | tools/call | activities | felix@brightpath.app | Success 843 ms |
| 8:21 PM | tools/call | get_latest_activities | felix@brightpath.app | Success 891 ms |
| 8:03 PM | tools/call | posts | ada@loopwork.io | Failed 593 ms |
| 7:48 PM | tools/call | me | felix@brightpath.app | Success 488 ms |
Per-request logs kept 30 days · daily aggregates forever · system events filterable
Battle-tested against real clients