@k-system/tickr-mcp 0.1.5 → 0.3.0

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 (83) hide show
  1. package/dist/formatters.js +1 -0
  2. package/dist/index.js +103 -1
  3. package/dist/tools/add-project-member.d.ts +4 -0
  4. package/dist/tools/add-project-member.js +32 -0
  5. package/dist/tools/apply-preset.d.ts +4 -0
  6. package/dist/tools/apply-preset.js +26 -0
  7. package/dist/tools/complete-dev-task.js +3 -1
  8. package/dist/tools/create-cycle.d.ts +4 -0
  9. package/dist/tools/create-cycle.js +32 -0
  10. package/dist/tools/create-epic.d.ts +4 -0
  11. package/dist/tools/create-epic.js +36 -0
  12. package/dist/tools/create-implementation-item.d.ts +4 -0
  13. package/dist/tools/create-implementation-item.js +32 -0
  14. package/dist/tools/create-label.d.ts +4 -0
  15. package/dist/tools/create-label.js +30 -0
  16. package/dist/tools/create-project.d.ts +4 -0
  17. package/dist/tools/create-project.js +33 -0
  18. package/dist/tools/create-status.d.ts +4 -0
  19. package/dist/tools/create-status.js +42 -0
  20. package/dist/tools/create-ticket.js +2 -0
  21. package/dist/tools/delete-attachment.d.ts +4 -0
  22. package/dist/tools/delete-attachment.js +26 -0
  23. package/dist/tools/delete-comment.d.ts +4 -0
  24. package/dist/tools/delete-comment.js +22 -0
  25. package/dist/tools/delete-cycle.d.ts +4 -0
  26. package/dist/tools/delete-cycle.js +26 -0
  27. package/dist/tools/delete-epic.d.ts +4 -0
  28. package/dist/tools/delete-epic.js +26 -0
  29. package/dist/tools/delete-implementation-item.d.ts +4 -0
  30. package/dist/tools/delete-implementation-item.js +26 -0
  31. package/dist/tools/delete-label.d.ts +4 -0
  32. package/dist/tools/delete-label.js +26 -0
  33. package/dist/tools/delete-status.d.ts +4 -0
  34. package/dist/tools/delete-status.js +26 -0
  35. package/dist/tools/delete-ticket.d.ts +4 -0
  36. package/dist/tools/delete-ticket.js +25 -0
  37. package/dist/tools/fail-dev-task.d.ts +4 -0
  38. package/dist/tools/fail-dev-task.js +29 -0
  39. package/dist/tools/get-board.d.ts +4 -0
  40. package/dist/tools/get-board.js +37 -0
  41. package/dist/tools/get-my-tasks.d.ts +4 -0
  42. package/dist/tools/get-my-tasks.js +20 -0
  43. package/dist/tools/get-next-statuses.d.ts +4 -0
  44. package/dist/tools/get-next-statuses.js +30 -0
  45. package/dist/tools/get-project.d.ts +4 -0
  46. package/dist/tools/get-project.js +20 -0
  47. package/dist/tools/list-attachments.d.ts +4 -0
  48. package/dist/tools/list-attachments.js +37 -0
  49. package/dist/tools/list-comments.d.ts +4 -0
  50. package/dist/tools/list-comments.js +31 -0
  51. package/dist/tools/list-dev-assignments.d.ts +4 -0
  52. package/dist/tools/list-dev-assignments.js +27 -0
  53. package/dist/tools/list-project-members.d.ts +4 -0
  54. package/dist/tools/list-project-members.js +29 -0
  55. package/dist/tools/list-projects.d.ts +4 -0
  56. package/dist/tools/list-projects.js +22 -0
  57. package/dist/tools/list-relations.d.ts +4 -0
  58. package/dist/tools/list-relations.js +30 -0
  59. package/dist/tools/list-statuses.d.ts +4 -0
  60. package/dist/tools/list-statuses.js +25 -0
  61. package/dist/tools/list-transitions.d.ts +4 -0
  62. package/dist/tools/list-transitions.js +25 -0
  63. package/dist/tools/list-workflow-presets.d.ts +4 -0
  64. package/dist/tools/list-workflow-presets.js +22 -0
  65. package/dist/tools/remove-project-member.d.ts +4 -0
  66. package/dist/tools/remove-project-member.js +26 -0
  67. package/dist/tools/update-comment.d.ts +4 -0
  68. package/dist/tools/update-comment.js +24 -0
  69. package/dist/tools/update-cycle.d.ts +4 -0
  70. package/dist/tools/update-cycle.js +39 -0
  71. package/dist/tools/update-epic.d.ts +4 -0
  72. package/dist/tools/update-epic.js +42 -0
  73. package/dist/tools/update-implementation-item.js +1 -1
  74. package/dist/tools/update-label.d.ts +4 -0
  75. package/dist/tools/update-label.js +33 -0
  76. package/dist/tools/update-project-member-role.d.ts +4 -0
  77. package/dist/tools/update-project-member-role.js +29 -0
  78. package/dist/tools/update-status.d.ts +4 -0
  79. package/dist/tools/update-status.js +39 -0
  80. package/dist/tools/update-ticket.js +12 -4
  81. package/dist/tools/update-transitions.d.ts +4 -0
  82. package/dist/tools/update-transitions.js +37 -0
  83. package/package.json +2 -2
@@ -5,6 +5,7 @@ export function formatTicketMarkdown(t) {
5
5
  "",
6
6
  `| Field | Value |`,
7
7
  `|-------|-------|`,
8
+ `| Id | ${t.id} |`,
8
9
  `| Type | ${t.type} |`,
9
10
  `| Status | ${t.status} |`,
10
11
  `| Priority | ${t.priority} |`,
package/dist/index.js CHANGED
@@ -26,6 +26,57 @@ import { registerCompleteDevTask } from "./tools/complete-dev-task.js";
26
26
  import { registerWhoami } from "./tools/whoami.js";
27
27
  import { registerAddRelation } from "./tools/add-relation.js";
28
28
  import { registerRemoveRelation } from "./tools/remove-relation.js";
29
+ // Phase 2 — Skupina A: Workflow & Status Management
30
+ import { registerListStatuses } from "./tools/list-statuses.js";
31
+ import { registerListTransitions } from "./tools/list-transitions.js";
32
+ import { registerCreateStatus } from "./tools/create-status.js";
33
+ import { registerDeleteStatus } from "./tools/delete-status.js";
34
+ import { registerApplyPreset } from "./tools/apply-preset.js";
35
+ // Phase 2 — Skupina B: Project Management
36
+ import { registerListProjects } from "./tools/list-projects.js";
37
+ import { registerGetProject } from "./tools/get-project.js";
38
+ import { registerCreateProject } from "./tools/create-project.js";
39
+ // Phase 2 — Skupina C: Ticket Operations
40
+ import { registerDeleteTicket } from "./tools/delete-ticket.js";
41
+ import { registerGetBoard } from "./tools/get-board.js";
42
+ import { registerGetMyTasks } from "./tools/get-my-tasks.js";
43
+ import { registerListComments } from "./tools/list-comments.js";
44
+ // Phase 2 — Skupina D: Attachments
45
+ import { registerListAttachments } from "./tools/list-attachments.js";
46
+ import { registerDeleteAttachment } from "./tools/delete-attachment.js";
47
+ // Phase 2 — Skupina E: Cycles & Epics CRUD
48
+ import { registerCreateCycle } from "./tools/create-cycle.js";
49
+ import { registerCreateEpic } from "./tools/create-epic.js";
50
+ // Phase 2 — Skupina F: Implementation Items
51
+ import { registerCreateImplementationItem } from "./tools/create-implementation-item.js";
52
+ import { registerDeleteImplementationItem } from "./tools/delete-implementation-item.js";
53
+ // Phase 3 — Skupina A: Workflow & Status
54
+ import { registerUpdateTransitions } from "./tools/update-transitions.js";
55
+ import { registerUpdateStatus } from "./tools/update-status.js";
56
+ import { registerListWorkflowPresets } from "./tools/list-workflow-presets.js";
57
+ import { registerGetNextStatuses } from "./tools/get-next-statuses.js";
58
+ // Phase 3 — Skupina B: Comments & Activity
59
+ import { registerUpdateComment } from "./tools/update-comment.js";
60
+ import { registerDeleteComment } from "./tools/delete-comment.js";
61
+ // Phase 3 — Skupina C: Relations
62
+ import { registerListRelations } from "./tools/list-relations.js";
63
+ // Phase 3 — Skupina D: Dev Queue
64
+ import { registerFailDevTask } from "./tools/fail-dev-task.js";
65
+ import { registerListDevAssignments } from "./tools/list-dev-assignments.js";
66
+ // Phase 3 — Skupina E: Labels CRUD
67
+ import { registerCreateLabel } from "./tools/create-label.js";
68
+ import { registerUpdateLabel } from "./tools/update-label.js";
69
+ import { registerDeleteLabel } from "./tools/delete-label.js";
70
+ // Phase 3 — Skupina F: Cycles/Epics extras
71
+ import { registerUpdateCycle } from "./tools/update-cycle.js";
72
+ import { registerDeleteCycle } from "./tools/delete-cycle.js";
73
+ import { registerUpdateEpic } from "./tools/update-epic.js";
74
+ import { registerDeleteEpic } from "./tools/delete-epic.js";
75
+ // ADR-0026 Phase 2f: Project Members
76
+ import { registerListProjectMembers } from "./tools/list-project-members.js";
77
+ import { registerAddProjectMember } from "./tools/add-project-member.js";
78
+ import { registerUpdateProjectMemberRole } from "./tools/update-project-member-role.js";
79
+ import { registerRemoveProjectMember } from "./tools/remove-project-member.js";
29
80
  // Resources
30
81
  import { registerTicketResource } from "./resources/ticket-resource.js";
31
82
  import { registerProjectResource } from "./resources/project-resource.js";
@@ -34,7 +85,7 @@ async function main() {
34
85
  const api = new ApiClient(config);
35
86
  const server = new McpServer({
36
87
  name: "tickr",
37
- version: "0.1.4",
88
+ version: "0.1.5",
38
89
  });
39
90
  // Registrace tools
40
91
  registerCreateTicket(server, api);
@@ -59,6 +110,57 @@ async function main() {
59
110
  registerWhoami(server, api);
60
111
  registerAddRelation(server, api);
61
112
  registerRemoveRelation(server, api);
113
+ // Phase 2 — Skupina A: Workflow & Status Management
114
+ registerListStatuses(server, api);
115
+ registerListTransitions(server, api);
116
+ registerCreateStatus(server, api);
117
+ registerDeleteStatus(server, api);
118
+ registerApplyPreset(server, api);
119
+ // Phase 2 — Skupina B: Project Management
120
+ registerListProjects(server, api);
121
+ registerGetProject(server, api);
122
+ registerCreateProject(server, api);
123
+ // Phase 2 — Skupina C: Ticket Operations
124
+ registerDeleteTicket(server, api);
125
+ registerGetBoard(server, api);
126
+ registerGetMyTasks(server, api);
127
+ registerListComments(server, api);
128
+ // Phase 2 — Skupina D: Attachments
129
+ registerListAttachments(server, api);
130
+ registerDeleteAttachment(server, api);
131
+ // Phase 2 — Skupina E: Cycles & Epics CRUD
132
+ registerCreateCycle(server, api);
133
+ registerCreateEpic(server, api);
134
+ // Phase 2 — Skupina F: Implementation Items
135
+ registerCreateImplementationItem(server, api);
136
+ registerDeleteImplementationItem(server, api);
137
+ // Phase 3 — Skupina A: Workflow & Status
138
+ registerUpdateTransitions(server, api);
139
+ registerUpdateStatus(server, api);
140
+ registerListWorkflowPresets(server, api);
141
+ registerGetNextStatuses(server, api);
142
+ // Phase 3 — Skupina B: Comments & Activity
143
+ registerUpdateComment(server, api);
144
+ registerDeleteComment(server, api);
145
+ // Phase 3 — Skupina C: Relations
146
+ registerListRelations(server, api);
147
+ // Phase 3 — Skupina D: Dev Queue
148
+ registerFailDevTask(server, api);
149
+ registerListDevAssignments(server, api);
150
+ // Phase 3 — Skupina E: Labels CRUD
151
+ registerCreateLabel(server, api);
152
+ registerUpdateLabel(server, api);
153
+ registerDeleteLabel(server, api);
154
+ // Phase 3 — Skupina F: Cycles/Epics extras
155
+ registerUpdateCycle(server, api);
156
+ registerDeleteCycle(server, api);
157
+ registerUpdateEpic(server, api);
158
+ registerDeleteEpic(server, api);
159
+ // ADR-0026 Phase 2f: Project Members
160
+ registerListProjectMembers(server, api);
161
+ registerAddProjectMember(server, api);
162
+ registerUpdateProjectMemberRole(server, api);
163
+ registerRemoveProjectMember(server, api);
62
164
  // Registrace resources
63
165
  registerTicketResource(server, api);
64
166
  registerProjectResource(server, api);
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { ApiClient } from "../api-client.js";
3
+ export declare function registerAddProjectMember(server: McpServer, api: ApiClient): void;
4
+ //# sourceMappingURL=add-project-member.d.ts.map
@@ -0,0 +1,32 @@
1
+ import { z } from "zod";
2
+ export function registerAddProjectMember(server, api) {
3
+ server.tool("add_project_member", "Add a member to a project with a specific role", {
4
+ project: z.string().describe("Project slug"),
5
+ user_id: z.string().describe("UUID of the user to add"),
6
+ role: z
7
+ .enum(["Viewer", "Developer", "Analytic", "Editor", "ProjectAdmin"])
8
+ .describe("Project role for the user"),
9
+ }, async (params) => {
10
+ try {
11
+ await api.post(`/api/projects/${params.project}/members`, {
12
+ userId: params.user_id,
13
+ role: params.role,
14
+ });
15
+ return {
16
+ content: [
17
+ {
18
+ type: "text",
19
+ text: `Member added to project "${params.project}" with role ${params.role}`,
20
+ },
21
+ ],
22
+ };
23
+ }
24
+ catch (err) {
25
+ return {
26
+ content: [{ type: "text", text: `Error: ${err instanceof Error ? err.message : String(err)}` }],
27
+ isError: true,
28
+ };
29
+ }
30
+ });
31
+ }
32
+ //# sourceMappingURL=add-project-member.js.map
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { ApiClient } from "../api-client.js";
3
+ export declare function registerApplyPreset(server: McpServer, api: ApiClient): void;
4
+ //# sourceMappingURL=apply-preset.d.ts.map
@@ -0,0 +1,26 @@
1
+ import { z } from "zod";
2
+ export function registerApplyPreset(server, api) {
3
+ server.tool("apply_preset", "Apply a workflow preset to a project (replaces current statuses and transitions)", {
4
+ project: z.string().describe("Project slug"),
5
+ preset_id: z.string().describe("Preset ID to apply"),
6
+ }, async (params) => {
7
+ try {
8
+ await api.post(`/api/projects/${params.project}/apply-preset`, { presetId: params.preset_id });
9
+ return {
10
+ content: [
11
+ {
12
+ type: "text",
13
+ text: `Preset "${params.preset_id}" applied to project ${params.project}`,
14
+ },
15
+ ],
16
+ };
17
+ }
18
+ catch (err) {
19
+ return {
20
+ content: [{ type: "text", text: `Error: ${err instanceof Error ? err.message : String(err)}` }],
21
+ isError: true,
22
+ };
23
+ }
24
+ });
25
+ }
26
+ //# sourceMappingURL=apply-preset.js.map
@@ -5,12 +5,14 @@ export function registerCompleteDevTask(server, api) {
5
5
  summary: z.string().describe("Summary of what was done"),
6
6
  branch: z.string().optional().describe("Git branch name"),
7
7
  commit_hash: z.string().optional().describe("Last commit SHA"),
8
+ files_changed: z.array(z.string()).optional().describe("List of changed file paths"),
8
9
  }, async (params) => {
9
10
  try {
10
11
  await api.post(`/api/dev-queue/complete/${params.assignment_id}`, {
11
- resultSummary: params.summary,
12
+ resultSummary: params.summary.replace(/\\n/g, "\n"),
12
13
  branchName: params.branch ?? null,
13
14
  commitHash: params.commit_hash ?? null,
15
+ filesChanged: params.files_changed ?? null,
14
16
  });
15
17
  return {
16
18
  content: [
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { ApiClient } from "../api-client.js";
3
+ export declare function registerCreateCycle(server: McpServer, api: ApiClient): void;
4
+ //# sourceMappingURL=create-cycle.d.ts.map
@@ -0,0 +1,32 @@
1
+ import { z } from "zod";
2
+ export function registerCreateCycle(server, api) {
3
+ server.tool("create_cycle", "Create a new cycle (sprint) in a project", {
4
+ project: z.string().describe("Project slug"),
5
+ name: z.string().describe("Cycle name"),
6
+ startDate: z.string().describe("Start date (ISO 8601, e.g. '2026-03-15')"),
7
+ endDate: z.string().describe("End date (ISO 8601, e.g. '2026-03-29')"),
8
+ }, async (params) => {
9
+ try {
10
+ const result = await api.post(`/api/projects/${params.project}/cycles`, {
11
+ name: params.name,
12
+ startDate: params.startDate,
13
+ endDate: params.endDate,
14
+ });
15
+ return {
16
+ content: [
17
+ {
18
+ type: "text",
19
+ text: `Created cycle #${result.number}${result.name ? ` "${result.name}"` : ""} (${result.id})`,
20
+ },
21
+ ],
22
+ };
23
+ }
24
+ catch (err) {
25
+ return {
26
+ content: [{ type: "text", text: `Error: ${err instanceof Error ? err.message : String(err)}` }],
27
+ isError: true,
28
+ };
29
+ }
30
+ });
31
+ }
32
+ //# sourceMappingURL=create-cycle.js.map
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { ApiClient } from "../api-client.js";
3
+ export declare function registerCreateEpic(server: McpServer, api: ApiClient): void;
4
+ //# sourceMappingURL=create-epic.d.ts.map
@@ -0,0 +1,36 @@
1
+ import { z } from "zod";
2
+ export function registerCreateEpic(server, api) {
3
+ server.tool("create_epic", "Create a new epic in a project", {
4
+ project: z.string().describe("Project slug"),
5
+ name: z.string().describe("Epic name"),
6
+ description: z.string().optional().describe("Epic description"),
7
+ color: z.string().optional().describe("Epic color hex code (e.g. #6366f1)"),
8
+ start_date: z.string().optional().describe("Start date (YYYY-MM-DD)"),
9
+ target_date: z.string().optional().describe("Target date (YYYY-MM-DD)"),
10
+ }, async (params) => {
11
+ try {
12
+ const result = await api.post(`/api/projects/${params.project}/epics`, {
13
+ name: params.name,
14
+ description: params.description,
15
+ color: params.color,
16
+ startDate: params.start_date,
17
+ targetDate: params.target_date,
18
+ });
19
+ return {
20
+ content: [
21
+ {
22
+ type: "text",
23
+ text: `Created epic "${result.name}" (${result.id})`,
24
+ },
25
+ ],
26
+ };
27
+ }
28
+ catch (err) {
29
+ return {
30
+ content: [{ type: "text", text: `Error: ${err instanceof Error ? err.message : String(err)}` }],
31
+ isError: true,
32
+ };
33
+ }
34
+ });
35
+ }
36
+ //# sourceMappingURL=create-epic.js.map
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { ApiClient } from "../api-client.js";
3
+ export declare function registerCreateImplementationItem(server: McpServer, api: ApiClient): void;
4
+ //# sourceMappingURL=create-implementation-item.d.ts.map
@@ -0,0 +1,32 @@
1
+ import { z } from "zod";
2
+ export function registerCreateImplementationItem(server, api) {
3
+ server.tool("create_implementation_item", "Add a new implementation item to a ticket", {
4
+ number: z.string().describe("Ticket display number, e.g. 'TKR-42' (legacy) or 'TKR-BUG-0042' (typed)"),
5
+ area: z.string().describe("Area: Database, API, Frontend, MCP, etc."),
6
+ fileOrDetail: z.string().describe("Specific file path or description of the work"),
7
+ note: z.string().optional().describe("Additional note"),
8
+ }, async (params) => {
9
+ try {
10
+ const result = await api.post(`/api/tickets/${params.number}/items`, {
11
+ area: params.area,
12
+ fileOrDetail: params.fileOrDetail,
13
+ note: params.note?.replace(/\\n/g, "\n"),
14
+ });
15
+ return {
16
+ content: [
17
+ {
18
+ type: "text",
19
+ text: `Added implementation item "${result.area}: ${result.fileOrDetail}" to ${params.number}`,
20
+ },
21
+ ],
22
+ };
23
+ }
24
+ catch (err) {
25
+ return {
26
+ content: [{ type: "text", text: `Error: ${err instanceof Error ? err.message : String(err)}` }],
27
+ isError: true,
28
+ };
29
+ }
30
+ });
31
+ }
32
+ //# sourceMappingURL=create-implementation-item.js.map
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { ApiClient } from "../api-client.js";
3
+ export declare function registerCreateLabel(server: McpServer, api: ApiClient): void;
4
+ //# sourceMappingURL=create-label.d.ts.map
@@ -0,0 +1,30 @@
1
+ import { z } from "zod";
2
+ export function registerCreateLabel(server, api) {
3
+ server.tool("create_label", "Create a new label in a project", {
4
+ project: z.string().describe("Project slug"),
5
+ name: z.string().describe("Label name"),
6
+ color: z.string().describe("Hex color code, e.g. '#ef4444'"),
7
+ }, async (params) => {
8
+ try {
9
+ const result = await api.post(`/api/projects/${params.project}/labels`, {
10
+ name: params.name,
11
+ color: params.color,
12
+ });
13
+ return {
14
+ content: [
15
+ {
16
+ type: "text",
17
+ text: `Created label "${result.name}" (${result.id}) with color ${result.color}`,
18
+ },
19
+ ],
20
+ };
21
+ }
22
+ catch (err) {
23
+ return {
24
+ content: [{ type: "text", text: `Error: ${err instanceof Error ? err.message : String(err)}` }],
25
+ isError: true,
26
+ };
27
+ }
28
+ });
29
+ }
30
+ //# sourceMappingURL=create-label.js.map
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { ApiClient } from "../api-client.js";
3
+ export declare function registerCreateProject(server: McpServer, api: ApiClient): void;
4
+ //# sourceMappingURL=create-project.d.ts.map
@@ -0,0 +1,33 @@
1
+ import { z } from "zod";
2
+ export function registerCreateProject(server, api) {
3
+ server.tool("create_project", "Create a new project", {
4
+ name: z.string().describe("Project display name"),
5
+ slug: z.string().describe("URL-safe project slug (unique)"),
6
+ prefix: z.string().describe("Ticket prefix, e.g. 'VLX', 'TKR'"),
7
+ description: z.string().optional().describe("Project description"),
8
+ }, async (params) => {
9
+ try {
10
+ const result = await api.post("/api/projects", {
11
+ name: params.name,
12
+ slug: params.slug,
13
+ prefix: params.prefix,
14
+ description: params.description,
15
+ });
16
+ return {
17
+ content: [
18
+ {
19
+ type: "text",
20
+ text: `Created project "${result.name}" (${result.slug})`,
21
+ },
22
+ ],
23
+ };
24
+ }
25
+ catch (err) {
26
+ return {
27
+ content: [{ type: "text", text: `Error: ${err instanceof Error ? err.message : String(err)}` }],
28
+ isError: true,
29
+ };
30
+ }
31
+ });
32
+ }
33
+ //# sourceMappingURL=create-project.js.map
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { ApiClient } from "../api-client.js";
3
+ export declare function registerCreateStatus(server: McpServer, api: ApiClient): void;
4
+ //# sourceMappingURL=create-status.d.ts.map
@@ -0,0 +1,42 @@
1
+ import { z } from "zod";
2
+ export function registerCreateStatus(server, api) {
3
+ server.tool("create_status", "Create a new workflow status in a project", {
4
+ project: z.string().describe("Project slug"),
5
+ name: z.string().describe("Status display name"),
6
+ slug: z.string().describe("Status slug (URL-safe identifier)"),
7
+ emoji: z.string().optional().describe("Emoji icon for the status"),
8
+ color: z.string().describe("Hex color code, e.g. '#3b82f6'"),
9
+ category: z.string().describe("Category: backlog, active, done, cancelled"),
10
+ sortOrder: z.number().describe("Sort order (0-based)"),
11
+ isDefault: z.boolean().optional().default(false).describe("Whether this is the default status for new tickets"),
12
+ isTerminal: z.boolean().optional().default(false).describe("Whether this is a terminal (closed) status"),
13
+ }, async (params) => {
14
+ try {
15
+ const result = await api.post(`/api/projects/${params.project}/statuses`, {
16
+ name: params.name,
17
+ slug: params.slug,
18
+ emoji: params.emoji,
19
+ color: params.color,
20
+ category: params.category,
21
+ sortOrder: params.sortOrder,
22
+ isDefault: params.isDefault,
23
+ isTerminal: params.isTerminal,
24
+ });
25
+ return {
26
+ content: [
27
+ {
28
+ type: "text",
29
+ text: `Created status "${result.name}" (${result.id})`,
30
+ },
31
+ ],
32
+ };
33
+ }
34
+ catch (err) {
35
+ return {
36
+ content: [{ type: "text", text: `Error: ${err instanceof Error ? err.message : String(err)}` }],
37
+ isError: true,
38
+ };
39
+ }
40
+ });
41
+ }
42
+ //# sourceMappingURL=create-status.js.map
@@ -8,6 +8,7 @@ export function registerCreateTicket(server, api) {
8
8
  priority: z.enum(["P0", "P1", "P2", "P3"]).default("P2"),
9
9
  content: z.string().optional().describe("Markdown content (analysis, solution)"),
10
10
  affected_parts: z.array(z.string()).optional(),
11
+ due_date: z.string().optional().describe("Due date in YYYY-MM-DD format"),
11
12
  }, async (params) => {
12
13
  try {
13
14
  // Unescapovat double-escaped newlines z MCP tool parametrů
@@ -19,6 +20,7 @@ export function registerCreateTicket(server, api) {
19
20
  priority: params.priority,
20
21
  content,
21
22
  affectedParts: params.affected_parts,
23
+ dueDate: params.due_date,
22
24
  });
23
25
  return {
24
26
  content: [
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { ApiClient } from "../api-client.js";
3
+ export declare function registerDeleteAttachment(server: McpServer, api: ApiClient): void;
4
+ //# sourceMappingURL=delete-attachment.d.ts.map
@@ -0,0 +1,26 @@
1
+ import { z } from "zod";
2
+ export function registerDeleteAttachment(server, api) {
3
+ server.tool("delete_attachment", "Delete an attachment from a ticket", {
4
+ number: z.string().describe("Ticket display number, e.g. 'TKR-42' (legacy) or 'TKR-BUG-0042' (typed)"),
5
+ attachment_id: z.string().describe("Attachment ID to delete"),
6
+ }, async (params) => {
7
+ try {
8
+ await api.delete(`/api/tickets/${params.number}/attachments/${params.attachment_id}`);
9
+ return {
10
+ content: [
11
+ {
12
+ type: "text",
13
+ text: `Attachment ${params.attachment_id} deleted from ${params.number}`,
14
+ },
15
+ ],
16
+ };
17
+ }
18
+ catch (err) {
19
+ return {
20
+ content: [{ type: "text", text: `Error: ${err instanceof Error ? err.message : String(err)}` }],
21
+ isError: true,
22
+ };
23
+ }
24
+ });
25
+ }
26
+ //# sourceMappingURL=delete-attachment.js.map
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { ApiClient } from "../api-client.js";
3
+ export declare function registerDeleteComment(server: McpServer, api: ApiClient): void;
4
+ //# sourceMappingURL=delete-comment.d.ts.map
@@ -0,0 +1,22 @@
1
+ import { z } from "zod";
2
+ export function registerDeleteComment(server, api) {
3
+ server.tool("delete_comment", "Delete a comment", {
4
+ comment_id: z.string().describe("UUID of the comment to delete"),
5
+ }, async (params) => {
6
+ try {
7
+ await api.delete(`/api/comments/${params.comment_id}`);
8
+ return {
9
+ content: [
10
+ { type: "text", text: `Comment ${params.comment_id} deleted` },
11
+ ],
12
+ };
13
+ }
14
+ catch (err) {
15
+ return {
16
+ content: [{ type: "text", text: `Error: ${err instanceof Error ? err.message : String(err)}` }],
17
+ isError: true,
18
+ };
19
+ }
20
+ });
21
+ }
22
+ //# sourceMappingURL=delete-comment.js.map
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { ApiClient } from "../api-client.js";
3
+ export declare function registerDeleteCycle(server: McpServer, api: ApiClient): void;
4
+ //# sourceMappingURL=delete-cycle.d.ts.map
@@ -0,0 +1,26 @@
1
+ import { z } from "zod";
2
+ export function registerDeleteCycle(server, api) {
3
+ server.tool("delete_cycle", "Delete a cycle (sprint) from a project", {
4
+ project: z.string().describe("Project slug"),
5
+ cycle_id: z.string().describe("UUID of the cycle to delete"),
6
+ }, async (params) => {
7
+ try {
8
+ await api.delete(`/api/projects/${params.project}/cycles/${params.cycle_id}`);
9
+ return {
10
+ content: [
11
+ {
12
+ type: "text",
13
+ text: `Cycle ${params.cycle_id} deleted from project ${params.project}`,
14
+ },
15
+ ],
16
+ };
17
+ }
18
+ catch (err) {
19
+ return {
20
+ content: [{ type: "text", text: `Error: ${err instanceof Error ? err.message : String(err)}` }],
21
+ isError: true,
22
+ };
23
+ }
24
+ });
25
+ }
26
+ //# sourceMappingURL=delete-cycle.js.map
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { ApiClient } from "../api-client.js";
3
+ export declare function registerDeleteEpic(server: McpServer, api: ApiClient): void;
4
+ //# sourceMappingURL=delete-epic.d.ts.map
@@ -0,0 +1,26 @@
1
+ import { z } from "zod";
2
+ export function registerDeleteEpic(server, api) {
3
+ server.tool("delete_epic", "Delete an epic from a project", {
4
+ project: z.string().describe("Project slug"),
5
+ epic_id: z.string().describe("UUID of the epic to delete"),
6
+ }, async (params) => {
7
+ try {
8
+ await api.delete(`/api/projects/${params.project}/epics/${params.epic_id}`);
9
+ return {
10
+ content: [
11
+ {
12
+ type: "text",
13
+ text: `Epic ${params.epic_id} deleted from project ${params.project}`,
14
+ },
15
+ ],
16
+ };
17
+ }
18
+ catch (err) {
19
+ return {
20
+ content: [{ type: "text", text: `Error: ${err instanceof Error ? err.message : String(err)}` }],
21
+ isError: true,
22
+ };
23
+ }
24
+ });
25
+ }
26
+ //# sourceMappingURL=delete-epic.js.map
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { ApiClient } from "../api-client.js";
3
+ export declare function registerDeleteImplementationItem(server: McpServer, api: ApiClient): void;
4
+ //# sourceMappingURL=delete-implementation-item.d.ts.map
@@ -0,0 +1,26 @@
1
+ import { z } from "zod";
2
+ export function registerDeleteImplementationItem(server, api) {
3
+ server.tool("delete_implementation_item", "Delete an implementation item from a ticket", {
4
+ number: z.string().describe("Ticket display number, e.g. 'TKR-42' (legacy) or 'TKR-BUG-0042' (typed)"),
5
+ item_id: z.string().describe("Implementation item ID to delete"),
6
+ }, async (params) => {
7
+ try {
8
+ await api.delete(`/api/tickets/${params.number}/items/${params.item_id}`);
9
+ return {
10
+ content: [
11
+ {
12
+ type: "text",
13
+ text: `Implementation item ${params.item_id} deleted from ${params.number}`,
14
+ },
15
+ ],
16
+ };
17
+ }
18
+ catch (err) {
19
+ return {
20
+ content: [{ type: "text", text: `Error: ${err instanceof Error ? err.message : String(err)}` }],
21
+ isError: true,
22
+ };
23
+ }
24
+ });
25
+ }
26
+ //# sourceMappingURL=delete-implementation-item.js.map