A second kind of consumer — a headless end-user identity that an AI agent creates for itself through the Keen MCP server.
The same tenancy, none of the human parts.
An MCP consumer is the end-user identity an AI agent uses when it needs to talk to your agents the way a site visitor would — to test a flow, run a job, or drive a conversation. It does not borrow a human's login. Compared with a normal consumer it is headless: it has no email, no password and is never asked for a one-time passcode; its credential is an ID plus a secret; it belongs to one consumer contract and reaches a subset of that contract's spaces; and its login token is obtained only through the Keen MCP Server — never through a partner site's sign-in.
Everything on the Overview page about tenants, contracts and spaces applies unchanged: an MCP consumer only ever reaches its own tenant's spaces, a space revoked from the contract stops working for it immediately, and it never crosses tenants. In the admin console MCP consumers live under Ai → MCP Consumers; on this site they sit with the other consumer pages.
Provisioning belongs to the agent; the console never creates one.
MCP consumers are provisioned only by an MCP account signed in through the Keen MCP server at https://<your-host>/mcp, with the mcp_consumers scope's write grant. The tools are:
create_mcp_consumer — a unique, immutable name; optionally the contract ID, the spaces and the enabled state. The reply carries the record and the secret, shown this once.assign_mcp_consumer_contract — a contract ID, or null to unbind.assign_mcp_consumer_spaces — replace-all: the list sent is the new grant; an empty list clears it.set_mcp_consumer_enabled, rotate_mcp_consumer_secret, delete_mcp_consumer — the lifecycle actions, which a human with the same write grant can also perform from the console.list_mcp_consumers, get_mcp_consumer — reading, never the secret.A human session calling a provisioning action — create, assign the contract, assign spaces, or mint a token — is refused with 403 Only MCP accounts may manage MCP consumers. The admin console has no Create page for them, on purpose: the agent that makes one is the one that knows its purpose and holds its secret.
One door in, and it is not the partner site's login.
The agent calls get_mcp_consumer_token with the consumer's ID and secret and receives the same pair a human consumer gets after login, with no passcode step:
the token reply
{ "access_token": "<consumer access token>", "token_type": "Bearer", "expires_in": 600, "refresh_token": "<consumer refresh token>" }
406 that says nothing about which.refresh_mcp_consumer_token with the refresh token issues a new pair and spends the old refresh token — keep both values from every reply. It is refused if the consumer was disabled, deleted, unbound from its contract, or moved to another tenant since the pair was minted; the agent then obtains a fresh token.The live chat surface, exactly as a human consumer uses it.
The token drives the live chat surface exactly like a human consumer's: the WebSocket run carries it in userContext.accessToken, userContext.userId is the MCP consumer's ID, the requested space must be in the consumer's grant and in the contract's current allowed set, and the token is verified on every message. The two-token chat routes (list, search, history, rename, delete) accept it together with your application token when both belong to the same tenant.
Profile, password and account-delete self-service does not apply — an MCP consumer has no email or password. See Live Chat and Self-Service for the surfaces themselves.
View everything; stop, re-key or remove — never create or assign.
Under Ai → MCP Consumers (visible with the mcp_consumers scope's read grant) the list shows Name, Contract, Enabled, Last login, Created and a link; the detail page shows the MCP Consumer ID (with a copy button), Name, Contract, Spaces, Created by and a Timeline — all read-only. With the write grant three actions appear:
Save (active only when the switch differs from the stored state).I have copied it — back to the consumer. The previous secret stopped working the moment you rotated; hand the pair to the agent that runs this consumer.Confirm delete / Cancel, then back to the list.Name, contract and spaces are the agent's to manage and cannot be edited here; there is no Create page. Empty list: No MCP consumers yet.
Exact refusals and revocation semantics.
406 An MCP consumer with that name already exists!406 No such consumer contract! Unbinding wipes the spaces; re-homing clamps them to the new contract's allowed set.406 Space not offered by the consumer contract!; with no contract only an empty set passes.406).10 minutes, refresh 30 days; each refresh token works once.| Consumer | MCP consumer | |
|---|---|---|
| Created by | An admin invite, or a sign-up on the partner site | An MCP account, through the Keen MCP server |
| Credential | Email + password | ID + secret (shown once, rotatable) |
| One-time passcode | Per the contract's policy | Never |
| Token obtained | Partner site sign-in | MCP server only |
| Token refreshed | Partner site refresh route | MCP server only (always a new pair) |
| Self-service (profile, password, delete) | Yes | Does not apply |
| Live chat and chat routes | Yes | Yes |
| Console | Full management with the consumer scope's write grant | View; enable/disable, rotate, delete with the mcp_consumers scope's write grant |
| Partner notified of changes | Yes (spaces, tenant) | No — the agent learns at its next refresh |
Keen Agents 2026
Documentation
Release 15