Developers · Agent API, SDK & MCP

Put Kumo inside your product

Embed Kumo's complete model and run loop, point your own agents at Kumo, or connect Kumo to the systems you already run. Every request is a named user; every model call, approval, tool call, receipt, and outcome is traceable.

A token acts as you

Tokens are minted per user, per workspace. The API applies the same visibility model as the app: self-service users see themselves, managers their team, HR the workspace. Scopes can only narrow that further.

One declaration layer

The REST endpoints, the OpenAPI spec, this reference, and the MCP server's tool list are all generated from the same operation registry the runtime executes. Docs cannot go stale by construction.

Everything is audited

Writes run through the platform's own engines: validation, approvals, notifications included. Every MCP call, inbound or outbound, lands in the audit log with who, what, and when.

Kumo technology products

The runtime, API, protocol, and kit.

Four named products, one permission and audit model: Kumo AI Platform, Kumo API, Kumo MCP, and Kumo HR Agent Kit SDK.

01Agent runtime

Kumo AI Platform

Kumo’s model, planner, durable run loop, approvals, co-signature, artifacts, memory, credits, and tamper-evident audit in one governed platform.

  • Named user on every request
  • Human gates on commitment
  • Complete correlated trace
Technical reference
02Application surface

Kumo API

Embed the complete Kumo Agent or call individual HR operations through a versioned REST and Agent API with delegated identity.

  • Agent API + REST
  • Resumable SSE + signed webhooks
  • Generated OpenAPI contract
Technical reference
03Universal integration

Kumo MCP

A matched server, client, and outbound Connector. Your systems call Kumo; Kumo calls the named tools you choose to publish.

  • Protocol, not a catalogue
  • No inbound port with Connector
  • Receipts, attribution, idempotency
Technical reference
04Embedding toolkit

Kumo HR Agent Kit SDK

A typed TypeScript client, headless controller, and accessible React panel for putting Kumo inside a customer application.

  • Short-lived delegated credentials
  • Stream reconnect + decisions
  • Webhook verification
Technical reference
How it runs

One agent platform. Three paths.

Use Kumo's complete agent in your product, let another agent call Kumo, or let Kumo act across your systems. All three preserve named-user permissions, approvals, credits, and the same tamper-evident audit trail.

Embed

Your product uses Kumo's agent

The Agent API and SDK run Kumo's own model, planner, durable loop, approvals, artifacts, and audit trail inside your customer experience.

Embed Kumo →

Inbound

Your agents call Kumo

Claude Code, Cursor, VS Code, or anything you have built yourself posts JSON-RPC to https://kumohr.com/api/mcp with a personal access token. The tool list is your API, filtered to that token's scopes.

Set up inbound →

Outbound

Kumo calls your systems

An admin connects any MCP server under Settings → Connections: a published URL, or an outbound connector that dials out from inside your network. Every external action waits for a person to approve it.

Set up outbound →
Authentication

Personal access tokens

Create a token in Kumo under Settings → API access. Pick a name and the scopes it should carry. The secret is shown exactly once. Send it on every request; revoke it any time from the same screen. After you mint one, the same connect buttons appear with the token already filled in.

curl https://kumohr.com/api/v1/me \ -H "Authorization: Bearer kumo_…"
leave:readRead leave requests and balances
leave:writeCreate leave requests
reports:readRun read-only reports
agent:runStart and continue Kumo agent work
agent:readRead agent conversations, runs, and events
agent:approveApprove or decline agent actions
agent:artifactsUpload inputs and retrieve agent deliverables
audit:readRead and export the agent audit trail

Need a token? Sign in and open Settings → API access.

Embed Kumo

The complete Agent API

This is Kumo's model and durable run loop, not a customer-supplied chatbot. Your backend exchanges one admin-created integration credential for a short-lived credential delegated to an existing Kumo user. Runs inherit that user's live tenant role; scopes can only narrow it.

import { KumoAgentClient } from "@kumohr/agent-sdk"; const integration = new KumoAgentClient({ token: process.env.KUMO_INTEGRATION_CREDENTIAL }); const delegated = await integration.exchangeCredential({ userId: kumoUserId, externalSessionId: yourSessionId, scopes: ["agent:run", "agent:read", "agent:approve", "agent:artifacts"] }); const kumo = new KumoAgentClient({ token: delegated.accessToken }); const thread = await kumo.createThread({ title: "People operations" }); const result = await kumo.sendMessage(thread.data.thread.id, { message: "Check overdue training and prepare manager nudges." }); for await (const event of kumo.streamRun(result.data.runId)) { console.log(event); }

Credentials in the account

Personal tokens and admin integration credentials are created under Settings → API access. Secrets are shown once, stored as hashes, independently scoped, expirable, and revocable. Integration credentials stay on your backend; browsers receive only short-lived delegated credentials.

Agent endpoints

OperationScopeEndpoint
exchange_agent_tokenagent:runPOST /api/v1/agent/token
list_agent_threadsagent:readGET /api/v1/agent/threads
create_agent_threadagent:runPOST /api/v1/agent/threads
get_agent_threadagent:readGET /api/v1/agent/threads/{id}
send_agent_messageagent:runPOST /api/v1/agent/threads/{id}/messages
get_agent_runagent:readGET /api/v1/agent/runs/{id}
stream_agent_runagent:readGET /api/v1/agent/runs/{id}/events
decide_agent_runagent:approvePOST /api/v1/agent/runs/{id}/decisions
answer_agent_runagent:runPOST /api/v1/agent/runs/{id}/answers
cancel_agent_runagent:approvePOST /api/v1/agent/runs/{id}/cancel
decide_agent_actionagent:approvePOST /api/v1/agent/runs/{id}/actions/{actionId}/decisions
upload_agent_attachmentagent:artifactsPOST /api/v1/agent/attachments
list_agent_artifactsagent:artifactsGET /api/v1/agent/artifacts
get_agent_artifactagent:artifactsGET /api/v1/agent/runs/{id}/artifacts/{artifactId}
download_agent_artifactagent:artifactsGET /api/v1/agent/runs/{id}/artifacts/{artifactId}/download
list_agent_auditaudit:readGET /api/v1/agent/audit
export_agent_auditaudit:readGET /api/v1/agent/audit/export
verify_agent_auditaudit:readPOST /api/v1/agent/audit/verify
list_agent_webhooksagent:readGET /api/v1/agent/webhooks
create_agent_webhookagent:runPOST /api/v1/agent/webhooks
disable_agent_webhookagent:runDELETE /api/v1/agent/webhooks/{id}

Mutations use Idempotency-Key. Run events are resumable SSE with event IDs. Webhooks are signed and retried. Responses carry request and audit correlation IDs so one external request can be followed through the model, approval, tool, connected system, receipt, artifact, credits, and final outcome.

Inbound MCP

Connect your agent

The Kumo MCP server

Point any MCP-capable agent at https://kumohr.com/api/mcp (streamable HTTP, server kumo-hr) with your token in the Authorization header. Protocol versions 2025-06-18 and 2025-03-26. Its tool list is your API: the same operations below, filtered to your token's scopes.

Add to Cursor

Opens Cursor and asks you to confirm the server.

Any other client reads the same thing from a standard mcp.json:

{ "mcpServers": { "kumo-hr": { "type": "http", "url": "https://kumohr.com/api/mcp", "headers": { "Authorization": "Bearer kumo_YOUR_TOKEN" } } } }
Role-bound

Your agent can only do what your role allows. The same RBAC that gates the app gates every tool call; the token cannot escalate.

Scope-filtered

tools/list only advertises operations the token's scopes permit, so an agent holding a read-only token never even sees the write tools.

Fully audited

Every tool call is recorded in the audit log: which token, which tool, which arguments, and whether it succeeded. You can see everything it did.

Inbound tools

The tools your agent gets

One tool per operation, named after it. A token only sees the rows its scopes cover. This list is generated from the same registry the server executes.

ToolScopeSame as
get_meany tokenGET /api/v1/me
list_leave_requestsleave:readGET /api/v1/leave/requests
create_leave_requestleave:writePOST /api/v1/leave/requests
untaken_leave_reportreports:readGET /api/v1/reports/untaken-leave

What inbound covers today

4 operations, and tools only; no MCP resources or prompts yet. Authentication is a personal access token in a header, which covers Cursor, Claude Code, and VS Code. Hosted connectors that require OAuth, such as ChatGPT, cannot connect yet. We would rather say so than ship a button that fails.

Outbound MCP

Connect your systems

Kumo is also an MCP client. An admin allow-lists a server under Settings → Connections. Its tools join the agent's catalogue as mcp__<name>__<tool>. This is how Kumo reaches a calendar, a chat tool, an ERP, an LMS, or anything else that speaks MCP, not a special case for one vendor.

Always confirmed

External tools never run unattended. The person sees which system, which operation, and the arguments, then approves. There is no setting that turns this off.

Attributed

Each call carries who asked, which workspace, and which approved action as headers and JSON-RPC metadata, so it shows against the right name in that system's own audit trail.

Repeat-safe

Approving a retried step sends the same idempotency key, so an adapter that honours it cannot apply the same change twice.

Two ways to reach the server

If the system can publish an https MCP endpoint, register that URL. If it lives on a network that will never accept inbound traffic, add an outbound connector instead: same tools, same approval, no inbound port.

Outbound connector

When nothing can call in

You run a small process beside the system you already have. It dials out to Kumo, publishes the tools on the local adapter, and takes approved calls. No inbound firewall rule, no public URL, no certificate for you to manage.

# Inside your network: one outbound HTTPS connection KUMO_URL=https://kumohr.com \ KUMO_CONNECTOR_TOKEN=kumo_cn_… \ MCP_URL=http://127.0.0.1:8799/mcp \ npm run mcp:connector

Add the connector in Settings → Connections. The pairing token is shown once. Point MCP_URL at any local MCP adapter: the system you already run, or a thin wrapper beside it.

API reference

REST endpoints

Base URL https://kumohr.com. Responses use a { data } / { error: { code, message } } envelope with X-RateLimit-* headers. The machine-readable version of this reference lives at /api/v1/openapi.json.

GET/api/v1/meany token

Introspect the token

Returns the authenticated user, workspace (tenant), role, employee id, and the scopes this token carries. Use it to verify a token before wiring anything else.

curl https://kumohr.com/api/v1/me \ -H "Authorization: Bearer kumo_…"
// 2xx response { "data": { "token": { "name": "Zapier integration", "scopes": [ "leave:read", "reports:read" ] }, "user": { "id": "uuid", "name": "Amara Okafor", "email": "amara@acme.com", "role": "HR_MANAGER" }, "tenant": { "id": "uuid", "name": "Acme Ltd" }, "employee_id": 214 } }
GET/api/v1/leave/requestsleave:read

List leave requests

Lists leave requests you are allowed to see: your own for self-service roles, your team’s for line managers, your department’s for directors, the whole workspace for HR and admins. Filter by status and date range.

ParameterTypeDescription
statusstringFilter by status. One of: PENDING, APPROVED, REJECTED, CANCELLED, IN_PROGRESS, COMPLETED.
fromstringOnly requests ending on or after this date (YYYY-MM-DD).
tostringOnly requests starting on or before this date (YYYY-MM-DD).
limitnumberMax rows to return (1–200, default 50).
curl https://kumohr.com/api/v1/leave/requests?status=…&from=… \ -H "Authorization: Bearer kumo_…"
// 2xx response { "data": { "requests": [ { "id": "uuid", "employee_id": 214, "employee_name": "Amara Okafor", "policy": "Annual Leave", "start_date": "2026-09-07", "end_date": "2026-09-11", "total_days": 5, "half_day": false, "status": "APPROVED", "reason": "Family trip", "created_at": "2026-08-30T09:15:00.000Z" } ] } }
POST/api/v1/leave/requestsleave:write

Create a leave request

Books time off for the token’s user through the platform’s own leave engine. Policy validation, balance movement, approval routing, and notifications all run exactly as from the app. Pass start_date plus either end_date or days; the policy defaults to annual leave.

ParameterTypeDescription
start_daterequiredstringFirst day off (YYYY-MM-DD).
end_datestringLast day off, inclusive (YYYY-MM-DD). Use this OR days.
daysnumberNumber of consecutive calendar days off. Use this OR end_date.
policystringLeave policy name, e.g. "Annual Leave". Defaults to the annual policy.
policy_idstringExact policy id (overrides policy).
reasonstringOptional short reason.
half_daybooleanTrue for a single half-day request.
curl -X POST https://kumohr.com/api/v1/leave/requests \ -H "Authorization: Bearer kumo_…" \ -H "Content-Type: application/json" \ -d '{"start_date":"2026-09-07","days":2}'
// 2xx response { "data": { "id": "uuid", "status": "PENDING", "policy": "Annual Leave", "start_date": "2026-09-07", "end_date": "2026-09-08", "total_days": 2, "warnings": [] } }
GET/api/v1/reports/untaken-leavereports:read

Untaken leave report

Per-employee untaken leave for a year: allocated, used, and remaining days with department and manager, sorted by most untaken first. Runs through the same permission-gated reporting tool Kumo’s agent uses. Your role decides whose rows you see.

ParameterTypeDescription
yearnumberBalance year (defaults to the current year).
min_untaken_daysnumberOnly employees with at least this many untaken days.
policystringLeave policy name filter (defaults to annual policies).
curl https://kumohr.com/api/v1/reports/untaken-leave?year=…&min_untaken_days=… \ -H "Authorization: Bearer kumo_…"
// 2xx response { "data": { "year": 2026, "employees": [ { "employee": "Amara Okafor", "department": "Engineering", "manager": "Lena Fischer", "allocated_days": 25, "used_days": 6, "untaken_days": 19 } ], "totals": { "employees": 42, "untakenDays": 512 } } }
Protocol, errors, and limits

When things go wrong

REST failures use the { error: { code, message } } envelope. Over MCP the same failures come back as a tool result with isError set, so your agent can read the reason rather than crashing. GET https://kumohr.com/api/mcp returns 405; this server is POST-only. Unauthenticated calls return 401 with WWW-Authenticate.

401Missing, invalid, revoked, or expired token
403Token is missing the required scope, or the user's role lacks access
429Over 60 requests per minute for this token; see the Retry-After header

Every REST response carries X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset, so you can back off before you get there.