Appearance
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:usescope 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
accessAllProjectsis 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:mcpmiddleware - 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/kendoReplace {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/kendoOr 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"]
}
}
}| OS | Config 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:
- Your AI client requests authorization from
https://{tenant}.kendo.dev/oauth/authorize - A browser window opens for you to log in and approve the connection
- The client receives an access token with the
mcp:usescope - All subsequent MCP requests include this token in the
Authorizationheader - Tokens are automatically refreshed when they expire
Available Tools
| Tool | Description | Page |
|---|---|---|
create-issue | Create a new issue in a project | Issues |
bulk-create-issues | Create up to 25 issues at once, straight into the backlog | Issues |
update-issue | Update an existing issue (including lane changes) | Issues |
delete-issue | Delete an issue permanently | Issues |
search-issues | Search issues by text and filters | Issues |
get-my-issues | Get issues assigned to you | Issues |
add-comment | Add a comment to an issue | Comments |
update-comment | Edit an existing comment | Comments |
delete-comment | Delete a comment permanently | Comments |
create-time-entry | Log time against an issue | Time Entries |
get-time-entries | Query time entries with grouping | Time Entries |
update-time-entry | Update a time entry | Time Entries |
delete-time-entry | Delete a time entry permanently | Time Entries |
record-token-usage | Record an agent session's token usage on an issue | Token Usage |
create-epic | Create an epic | Epics |
update-epic | Update an epic | Epics |
delete-epic | Delete an epic | Epics |
get-epics | List epics with progress data | Epics |
tick-epic-wish | Tick a Done when wish of an epic | Epics |
untick-epic-wish | Untick a Done when wish of an epic | Epics |
get-labels | List a project's labels | Labels |
create-label | Create a label | Labels |
update-label | Rename or recolor a label | Labels |
delete-label | Delete a label | Labels |
sync-issue-labels | Set, replace, or clear the labels on an issue | Labels |
get-sprints | List sprints for a project, with optional status or single-sprint filter | Sprints |
create-sprint | Create a new sprint | Sprints |
update-sprint | Update sprint details | Sprints |
complete-sprint | Complete the active sprint | Sprints |
delete-sprint | Delete a planned sprint | Sprints |
assign-issues-to-sprint | Bulk-assign many issues to a sprint in one call | Sprints |
prepare-project-context | Gather project + lanes + active sprint + members + current user in one read | Issues |
prepare-issue-context | Gather a single issue's full payload (comments, branches, attachments) and linked epic | Issues |
start-work-on-issue | Pick up an issue end-to-end — assign, move lane, set sprint, link branch | Issues |
kendo-today | Return the Today snapshot (active sprints, my open issues, today's logged minutes) | Issues |
link-branch | Link a Git branch to an issue | Branches |
unlink-branch | Remove a Git branch link from an issue (multi-repo: pass repo_full_name to disambiguate) | Branches |
list-reports | List reports for triage | Reports |
get-report | Fetch a single report with attachments and triage status | Reports |
create-report | Create a new report | Reports |
promote-reports | Promote reports to an issue | Reports |
dismiss-report | Dismiss a report | Reports |
delete-report | Delete a report permanently | Reports |
send-feedback | Send feedback, bug reports, or suggestions about Kendo itself to the Kendo team | Reports |
get-error-groups | Get error groups (recurring exceptions/crashes) across projects or for one | Error Tracking |
fetch-attachment | Fetch attachment bytes (image or text) for multimodal agents | Attachments |
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 Pattern | Description | Page |
|---|---|---|
kendo://projects | List accessible active projects | Resources |
kendo://projects/archived | Archived projects, kept out of the list above | Resources |
kendo://projects/{id} | Project details with GitHub repos | Resources |
kendo://projects/{id}/issues | All issues in a project | Resources |
kendo://issues/{id} | Single issue with comments and time | Resources |
kendo://projects/{id}/lanes | Board lanes with issue counts | Resources |
kendo://projects/{id}/sprints | Sprint list with issue counts | Resources |
kendo://projects/{id}/epics | Epics with status and progress | Resources |
kendo://projects/{id}/members | Project members for assignment | Resources |
kendo://projects/{id}/github-repos | Linked GitHub repositories | Resources |
kendo://teams | Teams and their members | Resources |
See Also
- Workflows — Common multi-step MCP workflows with example prompts
- API Overview — API documentation
- Quick Start — Get started with kendo