Keiki MCP server
Drive your Keiki organization from Claude, Cursor, Codex or ChatGPT over MCP.
https://onkeiki.com/mcp is Keiki's MCP server. Add it to an MCP client and the client can do in your
organization what you can do in the dashboard: build and change agents, read conversations and traces, run
evals, and talk to an agent to see what it actually answers.
If your client's context fills up with tool schemas, or you want one request to make many calls, use
Code Mode at https://onkeiki.com/mcp/codemode instead. It serves the same operations
with the same permissions.
Connect
- Add
https://onkeiki.com/mcpas a remote (Streamable HTTP) MCP server in your client. - The client opens Keiki in your browser. Sign in, pick the organization the connection acts in, and approve it. The organization needs a plan.
- The client gets an OAuth token for you in that organization. It registers itself, so there is no client id or secret to copy.
Access tokens last an hour and the client refreshes them on its own; a client that goes 30 days without refreshing has to sign in again. To see every connected client and cut one off, open Connected apps in the dashboard settings.
A connection acts in one organization at a time. switch_organization lists your organizations, or moves
the connection to another one, where it acts with the role you have there. current_context says who the
token acts as and which organization it is in.
Permissions
A call is allowed exactly when the same action would be allowed for you in the dashboard, in the organization the token is bound to. Every change is recorded in the organization's audit log.
Viewers are read-only. A viewer's client can read agents, conversations and traces, but a change is refused
with 403 viewer_read_only, and talk_to_agent is refused too, because the agent's own tools run for real.
Tools
Most dashboard API endpoints are tools; a few stay dashboard-only, such as consenting to and revoking
connected apps. Each tool is named after its endpoint's method and path: GET /agents is get_agents,
GET /agents/:id is get_agents_by_id, and GET /agents/:id/versions is get_agents_versions.
A tool takes the endpoint's path parameters by name, plus query and body when the endpoint reads them,
and returns the endpoint's JSON response.
Each tool is annotated as read-only or destructive. Destructive tools (deleting, spending, changing access) are offered rather than refused, so your client is where you approve them: clients that confirm destructive tools ask before each one.
These tools are not API endpoints:
| Tool | What it does |
|---|---|
talk_to_agent | Sends one message to one of your agents as a real user and returns its reply. |
check_job | Reads a long call that returned a jobId: its status, progress so far, and result. |
cancel_job | Stops a long call and the work behind it. |
current_context | Who the token acts as, its organization and role, and the current time. |
switch_organization | Lists your organizations, or moves the connection to one of them. |
deploy_agent | Creates or updates a partner deployment, with the same body as POST /api/v1/developer/deployments. |
get_deployment, delete_deployment | Reads or deletes one deployment by externalRef. |
list_agent_templates, list_channel_types | What a deployment can be built from and which fields each channel needs. |
Talking to an agent
talk_to_agent takes agent (a name or id), message, and optionally fresh: true to start the thread
over. Calling it again continues the same conversation. The turn runs on the agent's real configuration:
nothing is sent to a real line, but every tool the agent calls (MCP integrations, sandbox, browser, loops,
payments) runs for real. Use it to check an agent after changing it, or to reproduce something a user
reported. Files the agent sends come back with download links that last up to 15 minutes.
Long calls
A turn with tools can take minutes, which is longer than most clients wait. A call still running after 40
seconds returns a jobId instead of its result and keeps running. That is not a failure: read the result with
check_job({ jobId }), or pass waitMs (up to 30,000) to wait for it to finish. cancel_job stops it.
Clients that support MCP tasks can ask for a task up front instead; tasks/get, tasks/result, tasks/list
and tasks/cancel read the same jobs. A job belongs to the token that started it, so no other connection can
read it.