@kanbodev/mcp 1.1.0 → 1.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -1
- package/dist/index.js +88 -36
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -55,7 +55,7 @@ You can create tickets with as much or as little detail as you want:
|
|
|
55
55
|
|
|
56
56
|
> "Create a ticket in the Frontend project called 'Fix login button not responding on mobile'"
|
|
57
57
|
|
|
58
|
-
The assistant will look up your project, find available statuses, priorities, and sizes, then create the ticket. You can also be more specific:
|
|
58
|
+
The assistant will look up your project, check for similar/related tickets, find available statuses, priorities, and sizes, then create the ticket with acceptance criteria. You can also be more specific:
|
|
59
59
|
|
|
60
60
|
> "Create a high-priority bug in Frontend: 'Payment form crashes on Safari'. Assign it to me and put it in the To Do column."
|
|
61
61
|
|
|
@@ -65,6 +65,26 @@ For AI-assisted creation:
|
|
|
65
65
|
|
|
66
66
|
This uses the AI tools (`polish_title`, `generate_description`, `suggest_attributes`) to craft a well-defined ticket before creating it.
|
|
67
67
|
|
|
68
|
+
### Acceptance criteria
|
|
69
|
+
|
|
70
|
+
Every ticket includes structured acceptance criteria — specific, testable conditions that define "done":
|
|
71
|
+
|
|
72
|
+
> "Add acceptance criteria to PROJ-123: users can export in CSV and JSON, progress shows for large exports, and errors display a retry option"
|
|
73
|
+
>
|
|
74
|
+
> "Show me the acceptance criteria for PROJ-45"
|
|
75
|
+
|
|
76
|
+
The assistant uses Given/When/Then format and includes both happy-path and edge-case criteria automatically.
|
|
77
|
+
|
|
78
|
+
### Related tickets and subtasks
|
|
79
|
+
|
|
80
|
+
The assistant checks for duplicates and related work before creating tickets, and supports parent-child relationships for breaking down work:
|
|
81
|
+
|
|
82
|
+
> "Create a subtask under PROJ-100: 'Write unit tests for auth module'"
|
|
83
|
+
>
|
|
84
|
+
> "Show me the child tickets of PROJ-100"
|
|
85
|
+
>
|
|
86
|
+
> "Find tickets similar to 'password reset not working'"
|
|
87
|
+
|
|
68
88
|
### Finding and viewing tickets
|
|
69
89
|
|
|
70
90
|
> "Show me all my assigned tickets"
|
package/dist/index.js
CHANGED
|
@@ -16839,7 +16839,7 @@ var CONFIG = {
|
|
|
16839
16839
|
};
|
|
16840
16840
|
var SERVER_INFO = {
|
|
16841
16841
|
name: "kanbo-mcp",
|
|
16842
|
-
version: "1.
|
|
16842
|
+
version: "1.1.2",
|
|
16843
16843
|
description: "MCP server for Kanbo project management"
|
|
16844
16844
|
};
|
|
16845
16845
|
var PAT_CONFIG = {
|
|
@@ -25475,7 +25475,29 @@ var getTicketByKeyTool = {
|
|
|
25475
25475
|
var createTicketTool = {
|
|
25476
25476
|
tool: {
|
|
25477
25477
|
name: "create_ticket",
|
|
25478
|
-
description:
|
|
25478
|
+
description: `Create a new ticket in a project.
|
|
25479
|
+
|
|
25480
|
+
IMPORTANT — ALWAYS INCLUDE:
|
|
25481
|
+
- acceptanceCriteria: REQUIRED for every ticket. Provide 3-7 specific, testable criteria in Given/When/Then format. Include at least one happy-path and one error/edge-case criterion. This is the primary measure of "done" for a ticket.
|
|
25482
|
+
- find_similar_tickets: ALWAYS check for duplicates/related tickets before creating. Link as parentId if the new ticket is a subtask of an existing one.
|
|
25483
|
+
|
|
25484
|
+
RECOMMENDED WORKFLOW for high-quality tickets:
|
|
25485
|
+
1. find_similar_tickets — check for duplicates and related tickets first. If related tickets exist, consider linking via parentId.
|
|
25486
|
+
2. check_clarity — verify the title is specific enough
|
|
25487
|
+
3. generate_description — AI-generate a structured description (or write your own following the format below)
|
|
25488
|
+
4. suggest_attributes — AI-suggest priority, size, and tags
|
|
25489
|
+
5. create_ticket — create with all fields populated, including acceptanceCriteria and parentId if applicable
|
|
25490
|
+
6. set_ticket_tags — add 2-5 tags after creation
|
|
25491
|
+
|
|
25492
|
+
DESCRIPTION FORMAT: The description field accepts KanboEditor HTML (TipTap/ProseMirror). Use semantic HTML tags: <p>, <h2>, <h3>, <ul>, <ol>, <li>, <strong>, <em>, <code>. Do NOT use <h1> (reserved for title). Do NOT use markdown syntax (## headings, **bold**, etc.) — use HTML tags instead.
|
|
25493
|
+
|
|
25494
|
+
DESCRIPTION STRUCTURE by ticket type:
|
|
25495
|
+
- Bug: <h2>Summary</h2>, <h2>Steps to Reproduce</h2>, <h2>Environment</h2>, <h2>Screenshots / Logs</h2>
|
|
25496
|
+
- Feature: <h2>Problem Statement</h2>, <h2>Proposed Solution</h2>, <h2>User Story</h2>, <h2>Scope</h2>
|
|
25497
|
+
- Task: <h2>Objective</h2>, <h2>Background</h2>, <h2>Technical Approach</h2>, <h2>Files / Areas Affected</h2>
|
|
25498
|
+
- Improvement: <h2>Current Behavior</h2>, <h2>Desired Behavior</h2>, <h2>Why This Matters</h2>, <h2>Proposed Changes</h2>
|
|
25499
|
+
- Story: <h2>User Story</h2>, <h2>Context</h2>, <h2>Design / Mockups</h2>, <h2>Notes</h2>
|
|
25500
|
+
Start with a <p> overview using user story format: "As a [role], I want [goal], so that [benefit]." Use <strong> for key terms, <code> for file names/APIs/env vars, <ul>/<li> for requirements lists.`,
|
|
25479
25501
|
inputSchema: {
|
|
25480
25502
|
type: "object",
|
|
25481
25503
|
properties: {
|
|
@@ -25489,7 +25511,7 @@ var createTicketTool = {
|
|
|
25489
25511
|
},
|
|
25490
25512
|
description: {
|
|
25491
25513
|
type: "string",
|
|
25492
|
-
description: `Ticket description
|
|
25514
|
+
description: `Ticket description as KanboEditor HTML (max ${LIMITS.DESCRIPTION_MAX} chars). Use <p> for paragraphs, <h2>/<h3> for section headings, <ul>/<ol>/<li> for lists, <strong> for emphasis, <code> for technical terms. Start with a <p> overview, then add structured sections per ticket type. Example: "<p>As a user, I want to <strong>export data</strong> in CSV format.</p><h2>Requirements</h2><ul><li>Support CSV and JSON formats</li><li>Show progress for large exports</li></ul><h2>Technical Notes</h2><ul><li>Use existing <code>/api/export</code> endpoint</li></ul>". Use generate_description to AI-generate this, or write manually following the structure in the tool description above.`
|
|
25493
25515
|
},
|
|
25494
25516
|
statusId: {
|
|
25495
25517
|
type: "string",
|
|
@@ -25593,7 +25615,7 @@ var updateTicketTool = {
|
|
|
25593
25615
|
},
|
|
25594
25616
|
description: {
|
|
25595
25617
|
type: "string",
|
|
25596
|
-
description: `New description
|
|
25618
|
+
description: `New description as KanboEditor HTML (max ${LIMITS.DESCRIPTION_MAX} chars). Use <p>, <h2>, <h3>, <ul>, <li>, <strong>, <code> tags. Structure with <h2> section headings per ticket type. Use refine_description to AI-refine an existing description based on feedback instead of rewriting manually.`
|
|
25597
25619
|
},
|
|
25598
25620
|
assigneeId: {
|
|
25599
25621
|
type: ["string", "null"],
|
|
@@ -28512,21 +28534,27 @@ var polishTitleTool = {
|
|
|
28512
28534
|
var generateDescriptionTool = {
|
|
28513
28535
|
tool: {
|
|
28514
28536
|
name: "generate_description",
|
|
28515
|
-
description:
|
|
28537
|
+
description: `AI-generated structured ticket description from a title. Returns a JSON object with two fields:
|
|
28538
|
+
- "description": KanboEditor HTML string with <p>, <h2>, <h3>, <ul>, <li>, <strong>, <code> tags. Structured with section headings appropriate to the ticket type (e.g., Requirements, Technical Notes, Steps to Reproduce).
|
|
28539
|
+
- "acceptanceCriteria": Array of plain-text criteria strings in Given/When/Then format.
|
|
28540
|
+
|
|
28541
|
+
RECOMMENDED WORKFLOW: Call check_clarity first to verify the title is specific enough. If it returns clarifying questions, ask the user, then call generate_description. After generation, call suggest_attributes to auto-fill priority, size, and tags. Then pass the description and acceptanceCriteria to create_ticket.
|
|
28542
|
+
|
|
28543
|
+
The AI gathers project context automatically (related tickets, statuses, workflow) to produce relevant descriptions. Pass releaseId for release-specific context. Consumes AI token quota.`,
|
|
28516
28544
|
inputSchema: {
|
|
28517
28545
|
type: "object",
|
|
28518
28546
|
properties: {
|
|
28519
28547
|
title: {
|
|
28520
28548
|
type: "string",
|
|
28521
|
-
description: "Ticket title"
|
|
28549
|
+
description: "Ticket title — be specific and action-oriented for best results"
|
|
28522
28550
|
},
|
|
28523
28551
|
projectId: {
|
|
28524
28552
|
type: "string",
|
|
28525
|
-
description: "Project ID (
|
|
28553
|
+
description: "Project ID (used to gather project context: related tickets, statuses, workflow)"
|
|
28526
28554
|
},
|
|
28527
28555
|
releaseId: {
|
|
28528
28556
|
type: "string",
|
|
28529
|
-
description: "Release ID for additional context (optional)"
|
|
28557
|
+
description: "Release ID for additional context — helps generate release-relevant descriptions (optional)"
|
|
28530
28558
|
}
|
|
28531
28559
|
},
|
|
28532
28560
|
required: ["title", "projectId"]
|
|
@@ -29351,30 +29379,54 @@ var TOOL_INDEX = {
|
|
|
29351
29379
|
},
|
|
29352
29380
|
content_quality_guidelines: {
|
|
29353
29381
|
description: "Follow these guidelines when creating or updating tickets for professional-quality output.",
|
|
29354
|
-
ticket_title: 'Concise, action-oriented. Start with a verb for tasks/bugs. 1-200 chars. Example: "Implement Google OAuth login flow"',
|
|
29355
|
-
ticket_description:
|
|
29356
|
-
"
|
|
29357
|
-
|
|
29358
|
-
"
|
|
29359
|
-
|
|
29360
|
-
|
|
29361
|
-
|
|
29362
|
-
|
|
29363
|
-
|
|
29364
|
-
|
|
29365
|
-
|
|
29366
|
-
|
|
29367
|
-
|
|
29368
|
-
|
|
29369
|
-
|
|
29370
|
-
|
|
29371
|
-
"
|
|
29372
|
-
|
|
29373
|
-
|
|
29374
|
-
|
|
29375
|
-
|
|
29376
|
-
|
|
29377
|
-
|
|
29382
|
+
ticket_title: 'Concise, action-oriented. Start with a verb for tasks/bugs. 1-200 chars. Example: "Implement Google OAuth login flow". Use polish_title to AI-improve vague titles.',
|
|
29383
|
+
ticket_description: {
|
|
29384
|
+
format: "KanboEditor HTML (TipTap/ProseMirror). Do NOT use markdown syntax — use HTML tags.",
|
|
29385
|
+
max_chars: 5000,
|
|
29386
|
+
allowed_tags: "<p>, <h2>, <h3>, <ul>, <ol>, <li>, <strong>, <em>, <code>, <a>. Do NOT use <h1> (reserved for ticket title).",
|
|
29387
|
+
structure: [
|
|
29388
|
+
'1. Overview — <p> with user story: "As a [role], I want [goal], so that [benefit]."',
|
|
29389
|
+
"2. Section headings — use <h2> tags matching the ticket type template (see template_structures)",
|
|
29390
|
+
"3. Requirements — <ul>/<li> bullet lists of specific deliverables",
|
|
29391
|
+
"4. Technical Notes — implementation guidance, constraints, <code>API endpoints</code>"
|
|
29392
|
+
],
|
|
29393
|
+
formatting_rules: [
|
|
29394
|
+
"Use <strong> for key terms and important concepts",
|
|
29395
|
+
"Use <code> for file names, API endpoints, env vars, function names",
|
|
29396
|
+
"Use <ul>/<li> for requirements and lists — NOT <p> with dashes",
|
|
29397
|
+
"Every sentence should add value — avoid generic filler"
|
|
29398
|
+
],
|
|
29399
|
+
example: "<p>As a project manager, I want to <strong>export project data</strong> in multiple formats, so that I can share reports with stakeholders.</p><h2>Requirements</h2><ul><li>Support CSV, JSON, and PDF export formats</li><li>Include all tickets, comments, and attachment metadata</li><li>Show a progress indicator for exports with more than 100 items</li></ul><h2>Technical Notes</h2><ul><li>Use the existing <code>/api/export</code> endpoint as a base</li><li>Implement streaming for large exports to avoid memory issues</li><li>Rate limit: max 5 exports per user per hour</li></ul>"
|
|
29400
|
+
},
|
|
29401
|
+
template_structures: {
|
|
29402
|
+
description: "Use these <h2> sections based on the ticket typeSlug. Each section should have meaningful content.",
|
|
29403
|
+
bug: ["Summary", "Steps to Reproduce", "Environment", "Screenshots / Logs"],
|
|
29404
|
+
feature: ["Problem Statement", "Proposed Solution", "User Story", "Scope"],
|
|
29405
|
+
task: ["Objective", "Background", "Technical Approach", "Files / Areas Affected", "Dependencies"],
|
|
29406
|
+
story: ["User Story", "Context", "Design / Mockups", "Notes"],
|
|
29407
|
+
improvement: ["Current Behavior", "Desired Behavior", "Why This Matters", "Proposed Changes"],
|
|
29408
|
+
spike: ["Research Question", "Background", "Areas to Investigate", "Timebox", "Expected Output"],
|
|
29409
|
+
docs: ["Documentation Type", "What Needs Documenting", "Target Audience", "Sections to Include"]
|
|
29410
|
+
},
|
|
29411
|
+
acceptance_criteria: {
|
|
29412
|
+
priority: 'HIGH — ALWAYS include acceptance criteria when creating tickets. This is the primary definition of "done".',
|
|
29413
|
+
format: 'JSON string of array: [{"id":"ac-1","text":"...","isChecked":false}]',
|
|
29414
|
+
rules: [
|
|
29415
|
+
"REQUIRED for every ticket — never skip acceptance criteria",
|
|
29416
|
+
"Provide 3-7 specific, testable criteria per ticket",
|
|
29417
|
+
'Use Given/When/Then format for behavioral criteria: "Given [precondition], when [action], then [expected result]"',
|
|
29418
|
+
'For simpler criteria, use direct statements: "Users can export data in CSV format"',
|
|
29419
|
+
"Include at least one happy-path criterion and one error/edge-case criterion",
|
|
29420
|
+
'Each criterion must be verifiable — someone can clearly say "yes, met" or "no, not met"',
|
|
29421
|
+
'Do NOT include vague criteria like "Code is clean" or "Feature works correctly"'
|
|
29422
|
+
],
|
|
29423
|
+
example: '[{"id":"ac-1","text":"Given a user on the project settings page, when they select CSV format and click Export, then a CSV file downloads containing all tickets","isChecked":false},{"id":"ac-2","text":"Given an export with more than 100 items, when export is initiated, then a progress indicator is visible until completion","isChecked":false},{"id":"ac-3","text":"Given an export in progress, when it exceeds 30 seconds, then the user sees a timeout error with a retry option","isChecked":false}]',
|
|
29424
|
+
id_format: "Use unique IDs (ac-1, ac-2, etc.). Set isChecked to false for new tickets. Max 10000 chars total."
|
|
29425
|
+
},
|
|
29426
|
+
tags: "Apply 2-5 tags per ticket AFTER creation using set_ticket_tags. Use lowercase-kebab-case. Common categories: feature area (auth, billing), technology (react, api), work type (feature, bug, refactor). Create missing tags with create_tag first.",
|
|
29427
|
+
ticket_type: "Always set typeSlug when creating tickets. Common types: feature, bug, task, improvement, story, spike, docs. Use list_ticket_types to see project-specific types. The typeSlug determines which template_structure sections to use.",
|
|
29428
|
+
related_tickets: "ALWAYS call find_similar_tickets before creating a ticket to check for duplicates and related work. If a related parent ticket exists, link via parentId when creating. Use get_ticket_children to view subtasks of a ticket.",
|
|
29429
|
+
ai_workflow: "For best results, use the AI tools in this order: find_similar_tickets (check duplicates/related) → check_clarity (verify title) → generate_description (AI-generate HTML + acceptance criteria) → suggest_attributes (AI-suggest priority, size, tags) → create_ticket (ALWAYS include acceptanceCriteria + parentId if related) → set_ticket_tags. The generate_description tool gathers project context (related tickets, workflow) automatically."
|
|
29378
29430
|
},
|
|
29379
29431
|
categories: {
|
|
29380
29432
|
"Organization & Context": {
|
|
@@ -29455,8 +29507,8 @@ var TOOL_INDEX = {
|
|
|
29455
29507
|
}
|
|
29456
29508
|
},
|
|
29457
29509
|
common_workflows: {
|
|
29458
|
-
"Create a high-quality ticket": "list_statuses + list_priorities + list_sizes + list_ticket_types + list_tags (cache IDs) → find_similar_tickets (check duplicates) → create_ticket (with description, acceptanceCriteria, typeSlug) → set_ticket_tags (add 2-5 tags)",
|
|
29459
|
-
"AI-assisted ticket creation": "check_clarity → polish_title → generate_description → suggest_attributes → create_ticket → set_ticket_tags",
|
|
29510
|
+
"Create a high-quality ticket": "list_statuses + list_priorities + list_sizes + list_ticket_types + list_tags (cache IDs) → find_similar_tickets (ALWAYS check for duplicates/related tickets — link via parentId if related) → create_ticket (with description, acceptanceCriteria [REQUIRED], typeSlug) → set_ticket_tags (add 2-5 tags)",
|
|
29511
|
+
"AI-assisted ticket creation": "find_similar_tickets (check duplicates/related first) → check_clarity → polish_title → generate_description → suggest_attributes → create_ticket (ALWAYS include acceptanceCriteria + parentId if related ticket found) → set_ticket_tags",
|
|
29460
29512
|
"Move through workflow": "get_available_transitions → move_ticket (or complete_ticket / abandon_ticket)",
|
|
29461
29513
|
"Sprint planning": "create_release → list_backlog_tickets → assign_tickets_to_release",
|
|
29462
29514
|
"Daily standup": "get_my_tickets + get_overdue_tickets + get_tickets_due_soon",
|
|
@@ -44105,11 +44157,11 @@ function showHelp() {
|
|
|
44105
44157
|
`);
|
|
44106
44158
|
}
|
|
44107
44159
|
function showVersion() {
|
|
44108
|
-
console.log(
|
|
44160
|
+
console.log(`kanbo-mcp v${SERVER_INFO.version}`);
|
|
44109
44161
|
}
|
|
44110
44162
|
async function startMcpServer() {
|
|
44111
44163
|
console.error("═══════════════════════════════════════════════════════════════");
|
|
44112
|
-
console.error(
|
|
44164
|
+
console.error(` Kanbo MCP Server v${SERVER_INFO.version}`);
|
|
44113
44165
|
console.error(" AI-native project management via Model Context Protocol");
|
|
44114
44166
|
console.error("═══════════════════════════════════════════════════════════════");
|
|
44115
44167
|
console.error(` Transport: ${CONFIG.TRANSPORT}`);
|