Skip to content

MCP Overview & Setup ​

kendo exposes a Model Context Protocol (MCP) server that lets AI coding assistants manage project work directly from the terminal. Create issues, log time, plan sprints, and search your board — all through natural language.

What is MCP? ​

MCP is an open protocol that standardizes how AI applications connect to external tools and data sources. Instead of copy-pasting issue IDs or switching between browser tabs, your AI assistant reads project context and takes actions on your behalf.

kendo's MCP server provides:

  • Tools — create, update, search, and delete issues, time entries, epics, sprints, comments, reports, and branch links
  • Resources — read-only access to projects, issues, lanes, sprints, epics, members, teams, and GitHub repos

Authorization & Security ​

All MCP data is scoped to the authenticated user's role and team access. You only see projects, issues, and data you're authorized to access in the UI — this isn't just filtering, it's programmatic enforcement through Laravel Gates and project accessibility checks.

  • OAuth tokens carry an mcp:use scope that limits what the token can do
  • Project access is checked on every request — you can only interact with projects assigned to your teams or where accessAllProjects is enabled on your role
  • Role-based permissions are enforced per-resource, per-action: each role defines Create, Read, Update (None/Own/All), and Delete (None/Own/All) scopes for 16 resources
  • Project owners automatically get full access to all project-scoped resources in their own projects
  • Admins bypass all permission checks
  • Rate limiting prevents abuse via the throttle:mcp middleware
  • Audit logging records every tool invocation with user, project, tool name, and status

Server URL ​

The MCP server URL is tenant-specific:

https://{tenant}.kendo.dev/mcp/kendo

Replace {tenant} with your organization's subdomain (e.g., https://acme.kendo.dev/mcp/kendo).

Setup: Claude Code ​

The quickest way to add kendo is via the CLI:

bash
claude mcp add kendo --transport http https://{tenant}.kendo.dev/mcp/kendo

Or add it manually to your configuration file:

json
{
  "mcpServers": {
    "kendo": {
      "url": "https://{tenant}.kendo.dev/mcp/kendo",
      "headers": {
        "Accept": "application/json, text/event-stream"
      }
    }
  }
}

When you first connect, Claude Code will open a browser window for OAuth authentication. After authorizing, the token is stored locally and refreshed automatically.

Setup: Cursor ​

In Cursor, go to Settings → MCP Servers and add:

  • Name: kendo
  • Type: sse
  • URL: https://{tenant}.kendo.dev/mcp/kendo

Cursor will prompt for OAuth authorization on first use.

Setup: Claude Desktop ​

Claude Desktop connects via mcp-remote, a small Node proxy. Requires Node.js 18+.

Add this to your claude_desktop_config.json:

json
{
  "mcpServers": {
    "kendo": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://{tenant}.kendo.dev/mcp/kendo"]
    }
  }
}
OSConfig path
macOS~/Library/Application Support/Claude/claude_desktop_config.json
Windows%APPDATA%\Claude\claude_desktop_config.json
Linux~/.config/Claude/claude_desktop_config.json

After saving, fully quit and relaunch Claude Desktop (Cmd+Q on macOS — closing the window is not enough). A browser window will open for OAuth on first launch.

OAuth Flow ​

kendo uses OAuth 2.0 for MCP authentication:

  1. Your AI client requests authorization from https://{tenant}.kendo.dev/oauth/authorize
  2. A browser window opens for you to log in and approve the connection
  3. The client receives an access token with the mcp:use scope
  4. All subsequent MCP requests include this token in the Authorization header
  5. Tokens are automatically refreshed when they expire

Available Tools ​

ToolDescriptionPage
create-issueCreate a new issue in a projectIssues
bulk-create-issuesCreate up to 25 issues at once, straight into the backlogIssues
update-issueUpdate an existing issue (including lane changes)Issues
delete-issueDelete an issue permanentlyIssues
search-issuesSearch issues by text and filtersIssues
get-my-issuesGet issues assigned to youIssues
add-commentAdd a comment to an issueComments
update-commentEdit an existing commentComments
delete-commentDelete a comment permanentlyComments
create-time-entryLog time against an issueTime Entries
get-time-entriesQuery time entries with groupingTime Entries
update-time-entryUpdate a time entryTime Entries
delete-time-entryDelete a time entry permanentlyTime Entries
record-token-usageRecord an agent session's token usage on an issueToken Usage
create-epicCreate an epicEpics
update-epicUpdate an epicEpics
delete-epicDelete an epicEpics
get-epicsList epics with progress dataEpics
tick-epic-wishTick a Done when wish of an epicEpics
untick-epic-wishUntick a Done when wish of an epicEpics
get-labelsList a project's labelsLabels
create-labelCreate a labelLabels
update-labelRename or recolor a labelLabels
delete-labelDelete a labelLabels
sync-issue-labelsSet, replace, or clear the labels on an issueLabels
get-sprintsList sprints for a project, with optional status or single-sprint filterSprints
create-sprintCreate a new sprintSprints
update-sprintUpdate sprint detailsSprints
complete-sprintComplete the active sprintSprints
delete-sprintDelete a planned sprintSprints
assign-issues-to-sprintBulk-assign many issues to a sprint in one callSprints
prepare-project-contextGather project + lanes + active sprint + members + current user in one readIssues
prepare-issue-contextGather a single issue's full payload (comments, branches, attachments) and linked epicIssues
start-work-on-issuePick up an issue end-to-end — assign, move lane, set sprint, link branchIssues
kendo-todayReturn the Today snapshot (active sprints, my open issues, today's logged minutes)Issues
link-branchLink a Git branch to an issueBranches
unlink-branchRemove a Git branch link from an issue (multi-repo: pass repo_full_name to disambiguate)Branches
list-reportsList reports for triageReports
get-reportFetch a single report with attachments and triage statusReports
create-reportCreate a new reportReports
promote-reportsPromote reports to an issueReports
dismiss-reportDismiss a reportReports
delete-reportDelete a report permanentlyReports
send-feedbackSend feedback, bug reports, or suggestions about Kendo itself to the Kendo teamReports
get-error-groupsGet error groups (recurring exceptions/crashes) across projects or for oneError Tracking
fetch-attachmentFetch attachment bytes (image or text) for multimodal agentsAttachments

String arguments ​

Every tool treats string arguments the way the kendo web app treats form input. Leading and trailing whitespace is trimmed from every string, including strings inside arrays and nested objects, so a Markdown body also loses the indentation of its first line and its trailing newlines. An empty or whitespace-only string is then treated as null: sending "" for an optional field works exactly like sending null, and sending it for a required field fails validation.

Available Resources ​

URI PatternDescriptionPage
kendo://projectsList accessible active projectsResources
kendo://projects/archivedArchived projects, kept out of the list aboveResources
kendo://projects/{id}Project details with GitHub reposResources
kendo://projects/{id}/issuesAll issues in a projectResources
kendo://issues/{id}Single issue with comments and timeResources
kendo://projects/{id}/lanesBoard lanes with issue countsResources
kendo://projects/{id}/sprintsSprint list with issue countsResources
kendo://projects/{id}/epicsEpics with status and progressResources
kendo://projects/{id}/membersProject members for assignmentResources
kendo://projects/{id}/github-reposLinked GitHub repositoriesResources
kendo://teamsTeams and their membersResources

See Also ​