Skip to documentation
Documentation

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

  1. Add https://onkeiki.com/mcp as a remote (Streamable HTTP) MCP server in your client.
  2. The client opens Keiki in your browser. Sign in, pick the organization the connection acts in, and approve it. The organization needs a plan.
  3. 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:

ToolWhat it does
talk_to_agentSends one message to one of your agents as a real user and returns its reply.
check_jobReads a long call that returned a jobId: its status, progress so far, and result.
cancel_jobStops a long call and the work behind it.
current_contextWho the token acts as, its organization and role, and the current time.
switch_organizationLists your organizations, or moves the connection to one of them.
deploy_agentCreates or updates a partner deployment, with the same body as POST /api/v1/developer/deployments.
get_deployment, delete_deploymentReads or deletes one deployment by externalRef.
list_agent_templates, list_channel_typesWhat 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.