@kanbodev/mcp 1.1.1 → 1.1.3

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 -35
  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.1.1",
16842
+ version: "1.1.3",
16843
16843
  description: "MCP server for Kanbo project management"
16844
16844
  };
16845
16845
  var PAT_CONFIG = {
@@ -24375,7 +24375,8 @@ class KanboClient {
24375
24375
  }
24376
24376
  }
24377
24377
  const headers = {
24378
- "Content-Type": "application/json"
24378
+ "Content-Type": "application/json",
24379
+ "X-Kanbo-Source": "mcp"
24379
24380
  };
24380
24381
  if (this.useOidcAuth) {
24381
24382
  const oidcToken = await fetchOidcToken(this.apiUrl);
@@ -25475,7 +25476,29 @@ var getTicketByKeyTool = {
25475
25476
  var createTicketTool = {
25476
25477
  tool: {
25477
25478
  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.",
25479
+ description: `Create a new ticket in a project.
25480
+
25481
+ IMPORTANT — ALWAYS INCLUDE:
25482
+ - 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.
25483
+ - 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.
25484
+
25485
+ RECOMMENDED WORKFLOW for high-quality tickets:
25486
+ 1. find_similar_tickets — check for duplicates and related tickets first. If related tickets exist, consider linking via parentId.
25487
+ 2. check_clarity — verify the title is specific enough
25488
+ 3. generate_description — AI-generate a structured description (or write your own following the format below)
25489
+ 4. suggest_attributes — AI-suggest priority, size, and tags
25490
+ 5. create_ticket — create with all fields populated, including acceptanceCriteria and parentId if applicable
25491
+ 6. set_ticket_tags — add 2-5 tags after creation
25492
+
25493
+ 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.
25494
+
25495
+ DESCRIPTION STRUCTURE by ticket type:
25496
+ - Bug: <h2>Summary</h2>, <h2>Steps to Reproduce</h2>, <h2>Environment</h2>, <h2>Screenshots / Logs</h2>
25497
+ - Feature: <h2>Problem Statement</h2>, <h2>Proposed Solution</h2>, <h2>User Story</h2>, <h2>Scope</h2>
25498
+ - Task: <h2>Objective</h2>, <h2>Background</h2>, <h2>Technical Approach</h2>, <h2>Files / Areas Affected</h2>
25499
+ - Improvement: <h2>Current Behavior</h2>, <h2>Desired Behavior</h2>, <h2>Why This Matters</h2>, <h2>Proposed Changes</h2>
25500
+ - Story: <h2>User Story</h2>, <h2>Context</h2>, <h2>Design / Mockups</h2>, <h2>Notes</h2>
25501
+ 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
25502
  inputSchema: {
25480
25503
  type: "object",
25481
25504
  properties: {
@@ -25489,7 +25512,7 @@ var createTicketTool = {
25489
25512
  },
25490
25513
  description: {
25491
25514
  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]."`
25515
+ 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
25516
  },
25494
25517
  statusId: {
25495
25518
  type: "string",
@@ -25593,7 +25616,7 @@ var updateTicketTool = {
25593
25616
  },
25594
25617
  description: {
25595
25618
  type: "string",
25596
- description: `New description in markdown (max ${LIMITS.DESCRIPTION_MAX} chars). Structure with ## headings: Requirements, Technical Notes. Use **bold**, \`code\`, bullet lists.`
25619
+ 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
25620
  },
25598
25621
  assigneeId: {
25599
25622
  type: ["string", "null"],
@@ -28512,21 +28535,27 @@ var polishTitleTool = {
28512
28535
  var generateDescriptionTool = {
28513
28536
  tool: {
28514
28537
  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.",
28538
+ description: `AI-generated structured ticket description from a title. Returns a JSON object with two fields:
28539
+ - "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).
28540
+ - "acceptanceCriteria": Array of plain-text criteria strings in Given/When/Then format.
28541
+
28542
+ 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.
28543
+
28544
+ 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
28545
  inputSchema: {
28517
28546
  type: "object",
28518
28547
  properties: {
28519
28548
  title: {
28520
28549
  type: "string",
28521
- description: "Ticket title"
28550
+ description: "Ticket title — be specific and action-oriented for best results"
28522
28551
  },
28523
28552
  projectId: {
28524
28553
  type: "string",
28525
- description: "Project ID (for context)"
28554
+ description: "Project ID (used to gather project context: related tickets, statuses, workflow)"
28526
28555
  },
28527
28556
  releaseId: {
28528
28557
  type: "string",
28529
- description: "Release ID for additional context (optional)"
28558
+ description: "Release ID for additional context — helps generate release-relevant descriptions (optional)"
28530
28559
  }
28531
28560
  },
28532
28561
  required: ["title", "projectId"]
@@ -29351,30 +29380,54 @@ var TOOL_INDEX = {
29351
29380
  },
29352
29381
  content_quality_guidelines: {
29353
29382
  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."
29383
+ 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.',
29384
+ ticket_description: {
29385
+ format: "KanboEditor HTML (TipTap/ProseMirror). Do NOT use markdown syntax use HTML tags.",
29386
+ max_chars: 5000,
29387
+ allowed_tags: "<p>, <h2>, <h3>, <ul>, <ol>, <li>, <strong>, <em>, <code>, <a>. Do NOT use <h1> (reserved for ticket title).",
29388
+ structure: [
29389
+ '1. Overview — <p> with user story: "As a [role], I want [goal], so that [benefit]."',
29390
+ "2. Section headings use <h2> tags matching the ticket type template (see template_structures)",
29391
+ "3. Requirements — <ul>/<li> bullet lists of specific deliverables",
29392
+ "4. Technical Notes — implementation guidance, constraints, <code>API endpoints</code>"
29393
+ ],
29394
+ formatting_rules: [
29395
+ "Use <strong> for key terms and important concepts",
29396
+ "Use <code> for file names, API endpoints, env vars, function names",
29397
+ "Use <ul>/<li> for requirements and lists — NOT <p> with dashes",
29398
+ "Every sentence should add value — avoid generic filler"
29399
+ ],
29400
+ 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>"
29401
+ },
29402
+ template_structures: {
29403
+ description: "Use these <h2> sections based on the ticket typeSlug. Each section should have meaningful content.",
29404
+ bug: ["Summary", "Steps to Reproduce", "Environment", "Screenshots / Logs"],
29405
+ feature: ["Problem Statement", "Proposed Solution", "User Story", "Scope"],
29406
+ task: ["Objective", "Background", "Technical Approach", "Files / Areas Affected", "Dependencies"],
29407
+ story: ["User Story", "Context", "Design / Mockups", "Notes"],
29408
+ improvement: ["Current Behavior", "Desired Behavior", "Why This Matters", "Proposed Changes"],
29409
+ spike: ["Research Question", "Background", "Areas to Investigate", "Timebox", "Expected Output"],
29410
+ docs: ["Documentation Type", "What Needs Documenting", "Target Audience", "Sections to Include"]
29411
+ },
29412
+ acceptance_criteria: {
29413
+ priority: 'HIGH — ALWAYS include acceptance criteria when creating tickets. This is the primary definition of "done".',
29414
+ format: 'JSON string of array: [{"id":"ac-1","text":"...","isChecked":false}]',
29415
+ rules: [
29416
+ "REQUIRED for every ticket — never skip acceptance criteria",
29417
+ "Provide 3-7 specific, testable criteria per ticket",
29418
+ 'Use Given/When/Then format for behavioral criteria: "Given [precondition], when [action], then [expected result]"',
29419
+ 'For simpler criteria, use direct statements: "Users can export data in CSV format"',
29420
+ "Include at least one happy-path criterion and one error/edge-case criterion",
29421
+ 'Each criterion must be verifiable — someone can clearly say "yes, met" or "no, not met"',
29422
+ 'Do NOT include vague criteria like "Code is clean" or "Feature works correctly"'
29423
+ ],
29424
+ 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}]',
29425
+ id_format: "Use unique IDs (ac-1, ac-2, etc.). Set isChecked to false for new tickets. Max 10000 chars total."
29426
+ },
29427
+ 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.",
29428
+ 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.",
29429
+ 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.",
29430
+ 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
29431
  },
29379
29432
  categories: {
29380
29433
  "Organization & Context": {
@@ -29455,8 +29508,8 @@ var TOOL_INDEX = {
29455
29508
  }
29456
29509
  },
29457
29510
  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",
29511
+ "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)",
29512
+ "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
29513
  "Move through workflow": "get_available_transitions → move_ticket (or complete_ticket / abandon_ticket)",
29461
29514
  "Sprint planning": "create_release → list_backlog_tickets → assign_tickets_to_release",
29462
29515
  "Daily standup": "get_my_tickets + get_overdue_tickets + get_tickets_due_soon",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kanbodev/mcp",
3
- "version": "1.1.1",
3
+ "version": "1.1.3",
4
4
  "description": "MCP (Model Context Protocol) server for Kanbo - AI-native project management",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",