Overview
Kelvia MCP is a Model Context Protocol server that proxies your AI client's actions
into the Kelvia REST API. The client sees a set of tools like list_tasks,
create_task, add_task_comment and calls them as needed.
| Mode | When to use | Auth |
|---|---|---|
remote /mcp |
Hosted MCP server, teams, multiple users or clients. | OAuth; agent key optional. |
stdio |
Local single-user setup: the client spawns the MCP process itself. | KELVIA_API_TOKEN in the process environment. |
legacy /sse |
Older clients that require the SSE transport. | Bearer header; query token only for legacy SSE. |
Quick start
-
Connect your account
Add the hosted server to your MCP client and approve access in Kelvia when the browser opens. No token needs to be copied for the standard setup.
-
Pick a transport
For the hosted MCP use
https://mcp.kelvia.app/mcp. For a local run, build thekelvia-mcppackage and connect it as astdioserver. -
Add the config to your client
Use one of the examples below for Cursor, Claude Code, Codex CLI or local stdio.
-
Verify the connection
Ask the client: “List my Kelvia boards”. If the agent sees your boards, move on to tasks, comments and worklogs.
Authorization and permissions
Hosted clients use OAuth by default: Kelvia opens in the browser, asks you to approve access and lets the client refresh its credentials. For autonomous agents, use a dedicated agent key with its own authorship, scopes and independent revocation.
Authorization: Bearer <token> header.
Never put a token in a URL.
| Mechanism | What it gives you |
|---|---|
| Agent key | Comments, worklogs and tasks are authored by the agent, not by a person. |
| Key scopes | Limit operations: read, create, edit, delete. |
| Board role | Key permissions intersect with the OWNER / ADMIN / MEMBER / VIEWER role. |
| Key revocation | Once revoked or the agent is disconnected, further requests get 401. |
Connecting clients
Cursor, remote HTTP
Add the server to ~/.cursor/mcp.json or a project-level .cursor/mcp.json, then select Connect in Cursor Settings → Tools & MCP.
{
"mcpServers": {
"kelvia": {
"url": "https://mcp.kelvia.app/mcp"
}
}
}
Claude Code, remote HTTP
claude mcp add --transport http --scope user kelvia https://mcp.kelvia.app/mcp
claude mcp list
Codex app, CLI and IDE extension
Add the server, complete OAuth in the browser and verify the shared Codex configuration:
codex mcp add kelvia --url https://mcp.kelvia.app/mcp
codex mcp login kelvia
codex mcp list
Local stdio
Build the MCP package first:
pnpm --filter kelvia-mcp build
# or
pnpm run build:mcp
Then connect the built file as a local MCP server:
{
"mcpServers": {
"kelvia": {
"command": "node",
"args": ["/absolute/path/to/kelvia-mcp/dist/index.js"],
"env": {
"KELVIA_API_TOKEN": "klv_your_token",
"KELVIA_API_URL": "https://api.kelvia.app/api"
}
}
}
}
MCP tools
The 58 tools are grouped below. Argument names in MCP use snake_case;
the server maps them onto REST API fields where needed.
Boards and structure
list_boards, get_board, create_board, update_board, archive_board, unarchive_board, delete_board, get_board_activity
list_board_columns, create_board_stage, update_board_stage, delete_board_stage, reorder_board_stages, start_board_stage, complete_board_stage, reopen_board_stage, materialize_board_backlog_stage
Tasks
list_tasks, get_task, get_task_by_number, create_task, update_task, reorder_task, delete_task, get_task_activity, get_task_summary, set_task_summary, list_calendar_tasks
Comments and worklogs
get_task_comments, add_task_comment, update_task_comment, delete_task_comment
get_task_worklogs, add_task_worklog, update_task_worklog, delete_task_worklog
Day plan
list_daily_plan_blocks, create_daily_plan_block, update_daily_plan_block, set_daily_plan_block_status, reorder_daily_plan_blocks, delete_daily_plan_block, list_daily_plan_definitions, list_overdue_daily_plan_blocks, list_daily_tasks
Members, invitations, tags
list_board_members, update_board_member, remove_board_member
list_board_invitations, create_board_invitation, revoke_board_invitation, list_my_invitations, accept_board_invitation, decline_board_invitation
list_board_tags, list_tags, create_board_tag, get_current_user
Annotations
Every tool declares readOnlyHint, destructiveHint and
idempotentHint, so a client can approve reads on its own and ask before a
delete. 22 of the 58 tools are read-only.
Toolsets
The full set costs about 45 KB of JSON schema in every session. Load only what a
workflow needs — tasks,planner publishes 21 tools and about 20 KB.
get_current_user is always published; an empty or unknown value publishes
everything.
| Toolset | Tools | Covers |
|---|---|---|
boards |
9 | Boards, columns, board activity. |
tasks |
12 | Tasks, task activity, AI summaries. |
comments |
8 | Comments and worklogs. |
stages |
8 | Sprints and milestones. |
members |
9 | Members, roles, invitations. |
planner |
8 | Personal time-blocking day plan. |
tags |
3 | Board and workspace tags. |
# stdio — environment variable
KELVIA_TOOLSETS=tasks,planner npx kelvia-mcp
# remote — header, preferred
X-MCP-Toolsets: tasks,planner
# remote — query parameter, for clients that cannot set headers
https://mcp.kelvia.app/mcp?toolsets=tasks,planner
Prompts & resources
The MCP server also publishes prompts and resources so the client never has to guess the schema.
| Type | Name | Purpose |
|---|---|---|
| Prompt | create_task_from_pr |
Draft a task from pull request context. |
| Prompt | triage_board_backlog |
Suggest an order for working through a board backlog. |
| Resource | kelvia://schema/board-config |
Schema of statuses, priorities and permission keys. |
| Resource | kelvia://schema/task-mutations |
Expected arguments for creating and updating tasks. |
Operations
Environment variables
| Variable | Mode | Description |
|---|---|---|
KELVIA_API_TOKEN |
stdio | Personal token or agent key klv_.... |
KELVIA_API_URL |
both | Backend API base URL. Defaults to https://api.kelvia.app/api. |
KELVIA_TOOLSETS |
both | Comma-separated toolsets to publish. Defaults to all. |
PORT |
remote | If set, the server starts in HTTP/SSE mode. If not — stdio. |
MCP_PUBLIC_URL |
remote | Public MCP server URL, advertised as the OAuth resource. |
MCP_AUTHORIZATION_SERVER |
remote | Authorization server origin. Usually the backend without the /api suffix. |
MCP_ALLOWED_ORIGINS |
remote | CSV CORS allowlist. If unset, the origin is reflected. |
MCP_RATE_LIMIT |
remote | Max requests per token per minute, falling back to the IP for anonymous requests. Defaults to 300. |
MCP_INSTANCE_COUNT, MCP_STICKY_SESSIONS |
remote SSE | Hints for the multi-instance legacy SSE warnings. |
Health and discovery
GET /health reports the live transports and the available toolsets.
OAuth discovery lives at
/.well-known/oauth-protected-resource/mcp on the MCP server and
/.well-known/oauth-authorization-server on the backend.
Legacy SSE and scaling
Legacy SSE keeps sessions in process memory. If GET /sse and
POST /messages land on different instances, the client can get
404 Session not found. SSE needs a single instance or sticky sessions.
Streamable HTTP on /mcp does not have this problem.
Troubleshooting
| Symptom | What to check |
|---|---|
401 Unauthorized |
Complete OAuth in the client, or check the agent-key environment variable, revocation and scopes. |
| The agent doesn't see a board | Is the user or agent a member of the board; is the role sufficient. |
404 Session not found on SSE |
Sticky sessions or a single instance for legacy SSE; better yet, switch to /mcp. |
| A tool can't modify a task | Edit scope, board role, correct board_slug or id. |
| Codex CLI won't connect to remote MCP | Run codex mcp login kelvia, then check the server with codex mcp list. |