Kemon Docs

MCP Tools Reference

Complete reference for all Kemon MCP tools — parameters, scopes, and responses.

All tools are available through the MCP server at mcp.kemon.io. Each tool requires specific API key scopes. Tools that accept an identifier parameter support both human-readable identifiers (e.g. ENG-123) and raw ticket IDs.

Ticket tools

list_tickets

List tickets in the workspace with optional filtering.

Scope: tickets:read

Prop

Type

[
  {
    "id": "01HQ3K5P7Y...",
    "identifier": "ENG-42",
    "title": "Fix login redirect on mobile Safari",
    "status": "in_progress",
    "priority": "high",
    "teamId": "01HQ3K5P7Y...",
    "assignees": ["01HQ3K5P7Y..."],
    "labels": ["01HQ3K5P7Y..."],
    "dueDate": "2026-04-01",
    "createdAt": "2026-03-15T10:30:00Z"
  }
]

get_ticket

Get full details for a single ticket.

Scope: tickets:read

Prop

Type

{
  "id": "01HQ3K5P7Y...",
  "identifier": "ENG-42",
  "title": "Fix login redirect on mobile Safari",
  "description": "Users on iOS Safari are not redirected after OAuth login.",
  "status": "in_progress",
  "priority": "high",
  "teamId": "01HQ3K5P7Y...",
  "teamIdentifier": "ENG",
  "parentId": null,
  "parentIdentifier": null,
  "assignees": ["01HQ3K5P7Y..."],
  "labels": ["01HQ3K5P7Y..."],
  "dueDate": "2026-04-01",
  "projectId": "01HQ3K5P7Y...",
  "createdAt": "2026-03-15T10:30:00Z",
  "updatedAt": "2026-03-16T14:22:00Z"
}

create_ticket

Create a new ticket in the workspace.

Scope: tickets:write

Prop

Type

{
  "id": "01HQ3K5P7Y...",
  "identifier": "ENG-135",
  "title": "Add dark mode to settings page",
  "status": "backlog",
  "priority": "medium"
}

update_ticket

Update an existing ticket. Only include fields you want to change.

Scope: tickets:write

Prop

Type

Pass null for assigneeUserId, projectId, or dueDate to clear the current value.

{
  "id": "01HQ3K5P7Y...",
  "identifier": "ENG-42",
  "title": "Fix login redirect on mobile Safari",
  "status": "done",
  "priority": "high"
}

Agent hints

When status is set to done, the response includes an _agentHint field with a verification checklist — AI agents are instructed to add a comment, verify the change, and upload a screenshot before considering the ticket complete. When status is set to blocked, the _agentHint requires a comment explaining the blocker. These hints are informational and intended for AI agent workflows.

create_comment

Add a comment to a ticket.

Scope: tickets:write

Prop

Type

{
  "commentId": "01HQ3K5P7Y...",
  "ticketId": "01HQ3K5P7Y...",
  "identifier": "ENG-42",
  "text": "Fixed by updating the OAuth callback URL handling.",
  "createdAt": "2026-03-17T09:00:00Z"
}

audit_codebase

Audit a codebase for issues and batch-create tickets for each finding. Use list_teams first to get valid team IDs.

Scope: tickets:write

The findings parameter is an array of objects (max 25). Each finding has the following shape:

{
  "findings": [
    {
      "title": "SQL injection in search endpoint",
      "description": "The /api/search handler concatenates user input directly into the SQL query string. Use parameterized queries instead.",
      "teamId": "01HQ3K5P7Y...",
      "category": "security",
      "priority": "urgent",
      "files": [
        {
          "path": "src/api/search.ts",
          "startLine": 42,
          "endLine": 48
        }
      ]
    }
  ]
}
FieldTypeDescription
titlestringShort title describing the issue (1-500 characters)
descriptionstringDetailed explanation of the issue, why it matters, and how to fix it (plain text, 1-5000 characters)
teamIdstringTeam ID — use list_teams to get valid IDs
categorystringsecurity, maintainability, inconsistency, performance, or reliability
prioritystringno priority, low, medium, high, or urgent
filesarrayAffected files — each with path (required), startLine (optional), endLine (optional)

A single call accepts up to 25 findings. Split larger audits across multiple calls.

{
  "summary": "Created 2 audit tickets",
  "tickets": [
    {
      "id": "01HQ3K5P7Y...",
      "identifier": "ENG-136",
      "title": "SQL injection in search endpoint",
      "status": "backlog",
      "priority": "urgent",
      "category": "security"
    }
  ]
}

File attachments

Uploading a file to a ticket is a three-step process:

Get a presigned upload URL

Call create_upload_url to reserve an attachment slot and get a presigned S3 URL.

Scope: tickets:write

Prop

Type

{
  "attachmentId": "01HQ3K5P7Y...",
  "uploadUrl": "https://s3.amazonaws.com/...",
  "fields": { "key": "...", "policy": "...", "signature": "..." },
  "publicUrl": "https://cdn.kemon.io/..."
}

Upload the file

Send an HTTP POST to the returned uploadUrl with the fields as multipart form data, followed by the file content. This step happens outside of MCP.

Confirm the upload

Call confirm_upload to finalize the attachment.

Scope: tickets:write

Prop

Type

{
  "attachmentId": "01HQ3K5P7Y...",
  "fileName": "screenshot.png",
  "contentType": "image/png",
  "publicUrl": "https://cdn.kemon.io/..."
}

Lookup tools

list_labels

List all labels in the workspace.

Scope: labels:read

No parameters required.

Response
[
  {
    "id": "01HQ3K5P7Y...",
    "name": "bug",
    "color": "#ef4444"
  }
]

list_teams

List teams in the workspace.

Scope: teams:read

Prop

Type

[
  {
    "id": "01HQ3K5P7Y...",
    "name": "Engineering",
    "identifier": "ENG",
    "icon": "code",
    "isPrivate": false,
    "createdAt": "2026-01-10T08:00:00Z"
  }
]

list_projects

List projects in the workspace.

Scope: projects:read

Prop

Type

[
  {
    "id": "01HQ3K5P7Y...",
    "name": "Mobile App v2",
    "status": "in_progress",
    "priority": "high",
    "health": "on_track",
    "teamId": "01HQ3K5P7Y...",
    "startDate": "2026-01-15",
    "targetDate": "2026-06-30",
    "createdAt": "2026-01-10T08:00:00Z"
  }
]

list_members

List members in the workspace.

Scope: members:read

Prop

Type

[
  {
    "memberId": "01HQ3K5P7Y...",
    "userId": "01HQ3K5P7Y...",
    "role": "admin",
    "name": "Jane Smith",
    "email": "jane@example.com",
    "image": "https://cdn.kemon.io/avatars/...",
    "createdAt": "2026-01-10T08:00:00Z"
  }
]

Workflow examples

These examples show how to combine tools to accomplish common tasks. You can use natural language prompts — your AI assistant will determine which tools to call.

Create a ticket from your IDE

"Create a high-priority bug in the Engineering team to fix the login redirect, assign it to Jane, and label it as bug"

Your assistant will:

  1. Call list_teams to find the Engineering team ID
  2. Call list_members to find Jane's user ID
  3. Call list_labels to find the "bug" label ID
  4. Call create_ticket with the gathered IDs, priority set to high, and the title from your prompt

Triage your backlog

"Show me all backlog tickets and help me prioritize them"

Your assistant will:

  1. Call list_tickets with status: "backlog" to fetch unstarted work
  2. Present the tickets for your review
  3. Call update_ticket for each ticket you want to re-prioritize or move to todo

Document completed work

"Mark ENG-42 as done and add a comment explaining the OAuth callback fix"

Your assistant will:

  1. Call update_ticket with identifier: "ENG-42" and status: "done"
  2. Call create_comment with a summary of the fix

Audit a codebase and file tickets

"Review this codebase for security and performance issues and create tickets for each finding"

Your assistant will:

  1. Call list_teams to find the target team ID
  2. Analyze the codebase for issues
  3. Call audit_codebase with up to 25 categorized and prioritized findings

On this page