@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.
- package/dist/formatters.js +1 -0
- package/dist/index.js +103 -1
- package/dist/tools/add-project-member.d.ts +4 -0
- package/dist/tools/add-project-member.js +32 -0
- package/dist/tools/apply-preset.d.ts +4 -0
- package/dist/tools/apply-preset.js +26 -0
- package/dist/tools/complete-dev-task.js +3 -1
- package/dist/tools/create-cycle.d.ts +4 -0
- package/dist/tools/create-cycle.js +32 -0
- package/dist/tools/create-epic.d.ts +4 -0
- package/dist/tools/create-epic.js +36 -0
- package/dist/tools/create-implementation-item.d.ts +4 -0
- package/dist/tools/create-implementation-item.js +32 -0
- package/dist/tools/create-label.d.ts +4 -0
- package/dist/tools/create-label.js +30 -0
- package/dist/tools/create-project.d.ts +4 -0
- package/dist/tools/create-project.js +33 -0
- package/dist/tools/create-status.d.ts +4 -0
- package/dist/tools/create-status.js +42 -0
- package/dist/tools/create-ticket.js +2 -0
- package/dist/tools/delete-attachment.d.ts +4 -0
- package/dist/tools/delete-attachment.js +26 -0
- package/dist/tools/delete-comment.d.ts +4 -0
- package/dist/tools/delete-comment.js +22 -0
- package/dist/tools/delete-cycle.d.ts +4 -0
- package/dist/tools/delete-cycle.js +26 -0
- package/dist/tools/delete-epic.d.ts +4 -0
- package/dist/tools/delete-epic.js +26 -0
- package/dist/tools/delete-implementation-item.d.ts +4 -0
- package/dist/tools/delete-implementation-item.js +26 -0
- package/dist/tools/delete-label.d.ts +4 -0
- package/dist/tools/delete-label.js +26 -0
- package/dist/tools/delete-status.d.ts +4 -0
- package/dist/tools/delete-status.js +26 -0
- package/dist/tools/delete-ticket.d.ts +4 -0
- package/dist/tools/delete-ticket.js +25 -0
- package/dist/tools/fail-dev-task.d.ts +4 -0
- package/dist/tools/fail-dev-task.js +29 -0
- package/dist/tools/get-board.d.ts +4 -0
- package/dist/tools/get-board.js +37 -0
- package/dist/tools/get-my-tasks.d.ts +4 -0
- package/dist/tools/get-my-tasks.js +20 -0
- package/dist/tools/get-next-statuses.d.ts +4 -0
- package/dist/tools/get-next-statuses.js +30 -0
- package/dist/tools/get-project.d.ts +4 -0
- package/dist/tools/get-project.js +20 -0
- package/dist/tools/list-attachments.d.ts +4 -0
- package/dist/tools/list-attachments.js +37 -0
- package/dist/tools/list-comments.d.ts +4 -0
- package/dist/tools/list-comments.js +31 -0
- package/dist/tools/list-dev-assignments.d.ts +4 -0
- package/dist/tools/list-dev-assignments.js +27 -0
- package/dist/tools/list-project-members.d.ts +4 -0
- package/dist/tools/list-project-members.js +29 -0
- package/dist/tools/list-projects.d.ts +4 -0
- package/dist/tools/list-projects.js +22 -0
- package/dist/tools/list-relations.d.ts +4 -0
- package/dist/tools/list-relations.js +30 -0
- package/dist/tools/list-statuses.d.ts +4 -0
- package/dist/tools/list-statuses.js +25 -0
- package/dist/tools/list-transitions.d.ts +4 -0
- package/dist/tools/list-transitions.js +25 -0
- package/dist/tools/list-workflow-presets.d.ts +4 -0
- package/dist/tools/list-workflow-presets.js +22 -0
- package/dist/tools/remove-project-member.d.ts +4 -0
- package/dist/tools/remove-project-member.js +26 -0
- package/dist/tools/update-comment.d.ts +4 -0
- package/dist/tools/update-comment.js +24 -0
- package/dist/tools/update-cycle.d.ts +4 -0
- package/dist/tools/update-cycle.js +39 -0
- package/dist/tools/update-epic.d.ts +4 -0
- package/dist/tools/update-epic.js +42 -0
- package/dist/tools/update-implementation-item.js +1 -1
- package/dist/tools/update-label.d.ts +4 -0
- package/dist/tools/update-label.js +33 -0
- package/dist/tools/update-project-member-role.d.ts +4 -0
- package/dist/tools/update-project-member-role.js +29 -0
- package/dist/tools/update-status.d.ts +4 -0
- package/dist/tools/update-status.js +39 -0
- package/dist/tools/update-ticket.js +12 -4
- package/dist/tools/update-transitions.d.ts +4 -0
- package/dist/tools/update-transitions.js +37 -0
- package/package.json +2 -2
package/dist/formatters.js
CHANGED
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.
|
|
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,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,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,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,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,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,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,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,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,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,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,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
|