MCP server
The Model Context Protocol (MCP) server provides a standardized interface that allows any compatible AI model or agent to access your Kyo data in a simple and secure way.
Kyo's MCP server is hosted: point a client at one URL and connect — as yourself, through Kyo's OAuth sign-in, or as one of your workspace's AI agents, with an agent key. It exposes 118 read and write tools that map 1:1 to the REST API — deals, contacts, companies, tasks, pipelines, spaces, metrics, finance, HR, documents and automations. A local copy of the server also ships inside the Kyo CLI, for clients that can only launch stdio servers. Either way, every tool call runs as whoever authorized it — bounded by the granted scopes and by that member's or agent's own workspace permissions — so a tool can never do more than they could in the app.
Hosted or local?
Use the hosted server unless you have a specific reason not to.
| Hosted | Local | |
|---|---|---|
| Address | https://app.trykyo.com/api/mcp — MCP over Streamable HTTP | kyo mcp — MCP over stdio |
| Install | Nothing | npm install -g kyo-cli |
| Sign in | OAuth in the browser for people; an agent key for agents and headless runs | kyo login (OAuth in the browser) |
| Credentials live | On Kyo's side — nothing on disk | ~/.kyo/credentials.json on your machine |
| Tools | The current catalogue, always | Whatever the installed CLI version bundles — update the CLI to pick up new tools |
| Pick it when | Your client speaks remote MCP: claude.ai, Claude Code, Cursor, agent frameworks, CI | Your client can only launch stdio servers, or you want tokens to live only on your machine |
Setup
Hosted — sign in as yourself
Point any remote-capable MCP client at:
https://app.trykyo.com/api/mcp
The first connection opens Kyo's sign-in and consent screen in your browser. You approve the
scopes there; the client registers itself with
dynamic client registration and completes OAuth on its own —
nothing to install, no key to paste. Clients that take the OAuth callback on their own URL
scheme, like Cursor's cursor://…, are accepted alongside https and loopback
callbacks. In claude.ai, add the URL under Settings → Connectors → Add
custom connector. In Claude Code:
claude mcp add --transport http kyo https://app.trykyo.com/api/mcp
In Cursor, add the URL form to ~/.cursor/mcp.json:
{
"mcpServers": {
"kyo": { "url": "https://app.trykyo.com/api/mcp" }
}
}
What you get is an ordinary OAuth grant: access tokens expire after an hour and the client refreshes them for you, and the grant is listed under Settings → API in Kyo, where you can revoke it.
Hosted — connect an agent with a key
When there is no person at a browser — an agent runtime, a scheduled job, CI — connect with an agent key instead. Send it as a bearer token on every request. The server accepts it wherever it accepts an OAuth token, and there is no sign-in step.
In Cursor (~/.cursor/mcp.json, with the key kept in an environment variable):
{
"mcpServers": {
"kyo": {
"url": "https://app.trykyo.com/api/mcp",
"headers": { "Authorization": "Bearer ${env:KYO_AGENT_KEY}" }
}
}
}
In Claude Code:
claude mcp add --transport http kyo https://app.trykyo.com/api/mcp \
--header "Authorization: Bearer $KYO_AGENT_KEY"
From your own code it is plain MCP over Streamable HTTP: JSON-RPC POSTs to the
URL with the header attached. A one-line check that a key works:
curl -X POST "https://app.trykyo.com/api/mcp" \
-H "Authorization: Bearer $KYO_AGENT_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call",
"params":{"name":"kyo_whoami","arguments":{}}}'
initialize, tools/list and resources/list answer
without a token, so a client can discover the server before it authenticates. Every
tools/call needs one: a missing or rejected token gets a 401 with
a WWW-Authenticate header that points at the
protected-resource metadata. That is how OAuth clients
know to start the sign-in — and how your agent knows its key was refused.
Local — general
The local (stdio) server is for clients that can't reach remote servers, or for when you want your tokens to live only on your machine. Every client needs the CLI installed and a one-time sign-in:
npm install -g kyo-cli
kyo login
After that, your MCP client launches the server itself from its config — you never run
kyo mcp by hand. Restart the client after editing its config; the tools are
discovered automatically. The local server exposes the tools bundled with the CLI version
you installed, so update the CLI when new tools ship.
Claude Desktop
Add Kyo to ~/Library/Application Support/Claude/claude_desktop_config.json
(macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"kyo": { "command": "npx", "args": ["-y", "kyo-cli", "mcp"] }
}
}
Claude Code
One command from any terminal:
claude mcp add kyo -- npx -y kyo-cli mcp
Cursor
Add Kyo to ~/.cursor/mcp.json:
{
"mcpServers": {
"kyo": { "command": "kyo", "args": ["mcp"] }
}
}
Other clients
Any MCP client that supports local stdio servers works. Configure it to run the command
npx with arguments ["-y", "kyo-cli", "mcp"] — or simply
kyo mcp if the CLI is installed globally.
Then try it: ask your agent to "list my Kyo deals" or "create a deal for Acme in the Sales pipeline."
Agent keys
An agent key connects one of your workspace's AI agents to the
hosted server without a browser. A workspace admin creates it for the agent it belongs to
in Settings → Agents; the key starts with kagt_ and stays valid
until you revoke it. Send it as Authorization: Bearer kagt_….
- It runs as the agent. Every call is attributed to the agent — it is the
created_byon records it creates and the author of its comments — and bounded by the agent's own permissions in the workspace, exactly as a person's token is bounded by theirs. To limit what a connected agent can reach, limit the agent's permissions in Kyo. - It carries the full scope catalogue, including
enrich:write. A human sign-in leaves metered enrichment opt-in; an agent key does not, sokyo_enrich_companyworks out of the box and spends the workspace's credits. Watch the balance withkyo_get_credit_balance. - It is not an OAuth token. No consent screen, no refresh, no hourly expiry, and nothing under Settings → API — revoke the key itself, from where it was created. Revocation is immediate.
- Treat it like a password. Keep it in a secret manager or an environment variable, never in a repository or a prompt. A leaked key should be revoked and replaced, not rotated by hand.
Verify the connection
Before an agent writes anything, check what it is connected as. The check is the same on every surface:
| Surface | Call |
|---|---|
| MCP (hosted or local) | kyo_whoami |
| CLI | kyo whoami |
| REST API | GET /v1/me — see authentication |
Each reports whether the credential is valid, which identity it resolves to — a member or an agent — in which workspace, and the scopes it holds. If a key resolves to the wrong agent, or a sign-in to the wrong workspace, stop there and fix the credential.
Available tools
118 tools, each mapping to a REST API resource. The hosted server always serves the current catalogue; the local server serves the copy bundled with your installed CLI.
| Group | Tools |
|---|---|
| Connection | kyo_whoami |
| CRM | kyo_list_deals, kyo_get_deal, kyo_create_deal, kyo_update_deal, kyo_list_people, kyo_get_person, kyo_create_person, kyo_update_person, kyo_list_companies, kyo_get_company, kyo_create_company, kyo_update_company, kyo_list_pipelines, kyo_create_pipeline, kyo_update_pipeline, kyo_list_pipeline_stages, kyo_create_pipeline_stage, kyo_update_pipeline_stage, kyo_list_labels, kyo_create_label, kyo_add_label_to_deal, kyo_remove_label_from_deal, kyo_list_crm_files, kyo_list_deal_tasks, kyo_create_deal_task, kyo_update_deal_task, kyo_link_person_to_deal, kyo_unlink_person_from_deal |
| Tasks | kyo_list_tasks, kyo_get_task, kyo_create_task, kyo_update_task, kyo_list_task_attachments |
| Spaces & projects | kyo_list_spaces, kyo_create_space, kyo_update_space, kyo_list_projects, kyo_create_project, kyo_update_project, kyo_list_project_stages, kyo_create_project_stage, kyo_update_project_stage, kyo_list_space_members, kyo_add_space_member, kyo_remove_space_member, kyo_list_space_updates, kyo_create_space_update |
| Comments | kyo_add_comment, kyo_list_comments |
| Metrics | kyo_list_metrics, kyo_get_metric, kyo_create_metric, kyo_update_metric, kyo_list_metric_pages, kyo_create_metric_page, kyo_update_metric_page, kyo_list_metric_entries, kyo_create_metric_entry |
| Finance | kyo_list_income, kyo_create_income, kyo_update_income, kyo_list_expenses, kyo_create_expense, kyo_update_expense, kyo_list_finance_categories, kyo_create_finance_category, kyo_list_debts, kyo_create_debt, kyo_update_debt, kyo_list_debt_payments, kyo_create_debt_payment |
| HR | kyo_list_team_members, kyo_get_team_member, kyo_create_team_member, kyo_update_team_member, kyo_list_departments, kyo_create_department, kyo_list_leave_requests, kyo_create_leave_request, kyo_update_leave_request, kyo_list_hr_contracts, kyo_create_hr_contract, kyo_list_hr_change_requests, kyo_create_hr_change_request, kyo_update_hr_change_request, kyo_list_org_chart, kyo_create_org_chart_node, kyo_update_org_chart_node |
| Library | kyo_list_documents, kyo_get_document, kyo_create_document, kyo_update_document, kyo_list_knowledge, kyo_get_knowledge_document, kyo_create_knowledge_document, kyo_list_canvases, kyo_get_canvas, kyo_create_canvas, kyo_update_canvas |
| Automations | kyo_list_automations, kyo_get_automation, kyo_create_automation, kyo_update_automation, kyo_list_automation_logs |
| Competitor research | kyo_list_competitor_workflows, kyo_list_competitor_reports, kyo_get_competitor_report |
| AI agents | kyo_list_agents, kyo_get_agent |
| Workspace | kyo_list_users, kyo_get_user, kyo_update_user, kyo_get_workspace, kyo_update_workspace, kyo_list_activity, kyo_get_credit_balance |
| Enrichment | kyo_enrich_company |
Security
- Runs as whoever authorized it — a person's grant is bounded by the scopes they approved and their own workspace permissions, including private-task visibility; an agent key is bounded by the agent's permissions. Neither can exceed what that member or agent can do in the app.
- Credentials never reach the model — the hosted server keeps OAuth tokens server-side and reads an agent key only from the request header; the local server holds your tokens on your machine. Either way only tool results are returned.
- No delete tools — v1 of the API is non-destructive, so an agent can't hard-delete your data. The only unlink-shaped tools (
kyo_remove_label_from_deal,kyo_remove_space_member,kyo_unlink_person_from_deal) detach a link and leave both records intact. - Roles and billing are off limits —
kyo_update_userwrites profile fields only, and no tool can change a member's role, permissions, plan or payment details. - Enrichment is metered —
kyo_enrich_companyspends workspace credits and needs theenrich:writescope. Human sign-ins leave it out unless you opt in; agent keys include it. - Revocable — end an OAuth grant with
kyo logoutor from Settings → API in the Kyo app; revoke an agent key from Settings → Agents.
FAQ
Is there a hosted (remote) MCP server?
Yes — https://app.trykyo.com/api/mcp, and it is the recommended way to
connect. It speaks MCP over Streamable HTTP, discovers Kyo's OAuth automatically, accepts
agent keys as bearer tokens, and always serves the current tool
catalogue. Use the local CLI server only if your client can't reach remote servers or you
want tokens to live on your machine alone.
Do I need the CLI?
No. The CLI is only needed for the local stdio server (and for using Kyo from the terminal). Every remote-capable client — claude.ai, Claude Code, Cursor, agent frameworks — connects to the hosted server directly.
Which scopes does the agent get?
With a human sign-in, whatever you granted: on the hosted server that's the consent screen
shown at connect time; on the local server it's kyo login (re-run with
--scope "…" to grant more or less). The default grant is full read/write
across every scope the API has except
enrich:write, which stays opt-in because it spends credits. With an
agent key, the full catalogue including enrich:write.
Whatever the scopes, a call still can't exceed
the authorizing member's or agent's permissions in the
workspace. Call kyo_whoami to see exactly what a connection holds.
Can an agent delete my data?
No. There are no delete tools, and the underlying API has no DELETE in v1.
Which clients are supported?
The hosted server works with claude.ai connectors, Claude Code, Cursor, and any MCP client
that supports remote servers — with OAuth for people, or a static
Authorization header for agent keys. The local server works with Claude
Desktop, Claude Code, Cursor, and any client that can launch stdio servers.