@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.
Files changed (3) hide show
  1. package/README.md +21 -1
  2. package/dist/index.js +88 -36
  3. 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.0.0",
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: "Create a new ticket in a project. For high-quality tickets, always include: description (structured markdown with ## headings), acceptanceCriteria (Given/When/Then JSON), and typeSlug. After creation, call set_ticket_tags to add tags. Call find_similar_tickets first to check for duplicates. Use list_statuses, list_priorities, list_sizes to get required IDs.",
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 in markdown (max ${LIMITS.DESCRIPTION_MAX} chars). Structure with ## headings: "## Requirements" (bullet points), "## Technical Notes" (implementation details, APIs, constraints). Use **bold** for key terms, \`code\` for identifiers, bullet lists for readability. Start with a user story: "As a [role], I want [goal], so that [benefit]."`
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 in markdown (max ${LIMITS.DESCRIPTION_MAX} chars). Structure with ## headings: Requirements, Technical Notes. Use **bold**, \`code\`, bullet lists.`
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: "AI-generated structured ticket description from a title. Returns markdown with headings and bullet points. Use as a starting point, then refine with refine_description if needed. Consumes AI token quota.",
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 (for context)"
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
- "Use markdown. Max 5000 chars. Structure with ## headings:",
29357
- "",
29358
- "As a [role], I want [goal], so that [benefit].",
29359
- "",
29360
- "## Requirements",
29361
- "- Bullet points of what needs to happen",
29362
- "",
29363
- "## Technical Notes",
29364
- "- Implementation hints, APIs, constraints, `code` references",
29365
- "",
29366
- "Use **bold** for key terms, `code` for identifiers, and bullet lists for readability."
29367
- ].join(`
29368
- `),
29369
- acceptance_criteria: [
29370
- 'JSON string of array: [{"id":"ac-1","text":"Given... When... Then...","isChecked":false}]',
29371
- "Write 3-8 criteria per ticket in Given/When/Then format.",
29372
- 'Example: [{"id":"ac-1","text":"Given a user on the login page, When they click Sign in with Google, Then they are redirected to Google OAuth consent screen","isChecked":false}]',
29373
- "Use unique IDs (ac-1, ac-2, etc.). Set isChecked to false for new tickets. Max 10000 chars total."
29374
- ].join(`
29375
- `),
29376
- 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.",
29377
- ticket_type: "Always set typeSlug when creating tickets. Common types: feature, bug, task, improvement. Use list_ticket_types to see project-specific types."
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("kanbo-mcp v1.0.0");
44160
+ console.log(`kanbo-mcp v${SERVER_INFO.version}`);
44109
44161
  }
44110
44162
  async function startMcpServer() {
44111
44163
  console.error("═══════════════════════════════════════════════════════════════");
44112
- console.error(" Kanbo MCP Server v1.0.0");
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}`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kanbodev/mcp",
3
- "version": "1.1.0",
3
+ "version": "1.1.2",
4
4
  "description": "MCP (Model Context Protocol) server for Kanbo - AI-native project management",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",