@k-system/tickr-mcp 0.2.0 → 0.4.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/cli/setup.d.ts +8 -0
- package/dist/cli/setup.d.ts.map +1 -0
- package/dist/cli/setup.js +524 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/index.js +8 -118
- package/dist/server.d.ts +2 -0
- package/dist/server.js +174 -0
- package/dist/tools/add-project-member.d.ts +4 -0
- package/dist/tools/add-project-member.js +32 -0
- package/dist/tools/create-label.d.ts +4 -0
- package/dist/tools/create-label.js +30 -0
- package/dist/tools/create-ticket.js +2 -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-label.d.ts +4 -0
- package/dist/tools/delete-label.js +26 -0
- package/dist/tools/fail-dev-task.d.ts +4 -0
- package/dist/tools/fail-dev-task.js +29 -0
- package/dist/tools/get-next-statuses.d.ts +4 -0
- package/dist/tools/get-next-statuses.js +30 -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-relations.d.ts +4 -0
- package/dist/tools/list-relations.js +30 -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-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 +6 -3
package/dist/index.js
CHANGED
|
@@ -1,121 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
import
|
|
5
|
-
import { ApiClient } from "./api-client.js";
|
|
6
|
-
// Tools
|
|
7
|
-
import { registerCreateTicket } from "./tools/create-ticket.js";
|
|
8
|
-
import { registerListTickets } from "./tools/list-tickets.js";
|
|
9
|
-
import { registerGetTicket } from "./tools/get-ticket.js";
|
|
10
|
-
import { registerUpdateTicket } from "./tools/update-ticket.js";
|
|
11
|
-
import { registerAddComment } from "./tools/add-comment.js";
|
|
12
|
-
import { registerUpdateImplementationItem } from "./tools/update-implementation-item.js";
|
|
13
|
-
import { registerSearchTickets } from "./tools/search-tickets.js";
|
|
14
|
-
import { registerTriageList } from "./tools/triage-list.js";
|
|
15
|
-
import { registerTriageAccept } from "./tools/triage-accept.js";
|
|
16
|
-
import { registerTriageReject } from "./tools/triage-reject.js";
|
|
17
|
-
import { registerListLabels } from "./tools/list-labels.js";
|
|
18
|
-
import { registerAddLabel } from "./tools/add-label.js";
|
|
19
|
-
import { registerRemoveLabel } from "./tools/remove-label.js";
|
|
20
|
-
import { registerListCycles } from "./tools/list-cycles.js";
|
|
21
|
-
import { registerAssignCycle } from "./tools/assign-cycle.js";
|
|
22
|
-
import { registerListEpics } from "./tools/list-epics.js";
|
|
23
|
-
import { registerAssignEpic } from "./tools/assign-epic.js";
|
|
24
|
-
import { registerPollDevQueue } from "./tools/poll-dev-queue.js";
|
|
25
|
-
import { registerCompleteDevTask } from "./tools/complete-dev-task.js";
|
|
26
|
-
import { registerWhoami } from "./tools/whoami.js";
|
|
27
|
-
import { registerAddRelation } from "./tools/add-relation.js";
|
|
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
|
-
// Resources
|
|
54
|
-
import { registerTicketResource } from "./resources/ticket-resource.js";
|
|
55
|
-
import { registerProjectResource } from "./resources/project-resource.js";
|
|
56
|
-
async function main() {
|
|
57
|
-
const config = loadConfig();
|
|
58
|
-
const api = new ApiClient(config);
|
|
59
|
-
const server = new McpServer({
|
|
60
|
-
name: "tickr",
|
|
61
|
-
version: "0.1.4",
|
|
62
|
-
});
|
|
63
|
-
// Registrace tools
|
|
64
|
-
registerCreateTicket(server, api);
|
|
65
|
-
registerListTickets(server, api);
|
|
66
|
-
registerGetTicket(server, api);
|
|
67
|
-
registerUpdateTicket(server, api);
|
|
68
|
-
registerAddComment(server, api);
|
|
69
|
-
registerUpdateImplementationItem(server, api);
|
|
70
|
-
registerSearchTickets(server, api);
|
|
71
|
-
registerTriageList(server, api);
|
|
72
|
-
registerTriageAccept(server, api);
|
|
73
|
-
registerTriageReject(server, api);
|
|
74
|
-
registerListLabels(server, api);
|
|
75
|
-
registerAddLabel(server, api);
|
|
76
|
-
registerRemoveLabel(server, api);
|
|
77
|
-
registerListCycles(server, api);
|
|
78
|
-
registerAssignCycle(server, api);
|
|
79
|
-
registerListEpics(server, api);
|
|
80
|
-
registerAssignEpic(server, api);
|
|
81
|
-
registerPollDevQueue(server, api);
|
|
82
|
-
registerCompleteDevTask(server, api);
|
|
83
|
-
registerWhoami(server, api);
|
|
84
|
-
registerAddRelation(server, api);
|
|
85
|
-
registerRemoveRelation(server, api);
|
|
86
|
-
// Phase 2 — Skupina A: Workflow & Status Management
|
|
87
|
-
registerListStatuses(server, api);
|
|
88
|
-
registerListTransitions(server, api);
|
|
89
|
-
registerCreateStatus(server, api);
|
|
90
|
-
registerDeleteStatus(server, api);
|
|
91
|
-
registerApplyPreset(server, api);
|
|
92
|
-
// Phase 2 — Skupina B: Project Management
|
|
93
|
-
registerListProjects(server, api);
|
|
94
|
-
registerGetProject(server, api);
|
|
95
|
-
registerCreateProject(server, api);
|
|
96
|
-
// Phase 2 — Skupina C: Ticket Operations
|
|
97
|
-
registerDeleteTicket(server, api);
|
|
98
|
-
registerGetBoard(server, api);
|
|
99
|
-
registerGetMyTasks(server, api);
|
|
100
|
-
registerListComments(server, api);
|
|
101
|
-
// Phase 2 — Skupina D: Attachments
|
|
102
|
-
registerListAttachments(server, api);
|
|
103
|
-
registerDeleteAttachment(server, api);
|
|
104
|
-
// Phase 2 — Skupina E: Cycles & Epics CRUD
|
|
105
|
-
registerCreateCycle(server, api);
|
|
106
|
-
registerCreateEpic(server, api);
|
|
107
|
-
// Phase 2 — Skupina F: Implementation Items
|
|
108
|
-
registerCreateImplementationItem(server, api);
|
|
109
|
-
registerDeleteImplementationItem(server, api);
|
|
110
|
-
// Registrace resources
|
|
111
|
-
registerTicketResource(server, api);
|
|
112
|
-
registerProjectResource(server, api);
|
|
113
|
-
// Spuštění na stdio transportu
|
|
114
|
-
const transport = new StdioServerTransport();
|
|
115
|
-
await server.connect(transport);
|
|
2
|
+
// CLI setup wizard — spustit místo MCP serveru pokud je argument "setup"
|
|
3
|
+
if (process.argv.includes("setup")) {
|
|
4
|
+
import("./cli/setup.js").then((m) => m.default());
|
|
116
5
|
}
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
}
|
|
6
|
+
else {
|
|
7
|
+
// MCP server — standardní mód
|
|
8
|
+
import("./server.js").then((m) => m.startServer());
|
|
9
|
+
}
|
|
10
|
+
export {};
|
|
121
11
|
//# sourceMappingURL=index.js.map
|
package/dist/server.d.ts
ADDED
package/dist/server.js
ADDED
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
3
|
+
import { loadConfig } from "./config.js";
|
|
4
|
+
import { ApiClient } from "./api-client.js";
|
|
5
|
+
// Tools
|
|
6
|
+
import { registerCreateTicket } from "./tools/create-ticket.js";
|
|
7
|
+
import { registerListTickets } from "./tools/list-tickets.js";
|
|
8
|
+
import { registerGetTicket } from "./tools/get-ticket.js";
|
|
9
|
+
import { registerUpdateTicket } from "./tools/update-ticket.js";
|
|
10
|
+
import { registerAddComment } from "./tools/add-comment.js";
|
|
11
|
+
import { registerUpdateImplementationItem } from "./tools/update-implementation-item.js";
|
|
12
|
+
import { registerSearchTickets } from "./tools/search-tickets.js";
|
|
13
|
+
import { registerTriageList } from "./tools/triage-list.js";
|
|
14
|
+
import { registerTriageAccept } from "./tools/triage-accept.js";
|
|
15
|
+
import { registerTriageReject } from "./tools/triage-reject.js";
|
|
16
|
+
import { registerListLabels } from "./tools/list-labels.js";
|
|
17
|
+
import { registerAddLabel } from "./tools/add-label.js";
|
|
18
|
+
import { registerRemoveLabel } from "./tools/remove-label.js";
|
|
19
|
+
import { registerListCycles } from "./tools/list-cycles.js";
|
|
20
|
+
import { registerAssignCycle } from "./tools/assign-cycle.js";
|
|
21
|
+
import { registerListEpics } from "./tools/list-epics.js";
|
|
22
|
+
import { registerAssignEpic } from "./tools/assign-epic.js";
|
|
23
|
+
import { registerPollDevQueue } from "./tools/poll-dev-queue.js";
|
|
24
|
+
import { registerCompleteDevTask } from "./tools/complete-dev-task.js";
|
|
25
|
+
import { registerWhoami } from "./tools/whoami.js";
|
|
26
|
+
import { registerAddRelation } from "./tools/add-relation.js";
|
|
27
|
+
import { registerRemoveRelation } from "./tools/remove-relation.js";
|
|
28
|
+
// Phase 2 — Skupina A: Workflow & Status Management
|
|
29
|
+
import { registerListStatuses } from "./tools/list-statuses.js";
|
|
30
|
+
import { registerListTransitions } from "./tools/list-transitions.js";
|
|
31
|
+
import { registerCreateStatus } from "./tools/create-status.js";
|
|
32
|
+
import { registerDeleteStatus } from "./tools/delete-status.js";
|
|
33
|
+
import { registerApplyPreset } from "./tools/apply-preset.js";
|
|
34
|
+
// Phase 2 — Skupina B: Project Management
|
|
35
|
+
import { registerListProjects } from "./tools/list-projects.js";
|
|
36
|
+
import { registerGetProject } from "./tools/get-project.js";
|
|
37
|
+
import { registerCreateProject } from "./tools/create-project.js";
|
|
38
|
+
// Phase 2 — Skupina C: Ticket Operations
|
|
39
|
+
import { registerDeleteTicket } from "./tools/delete-ticket.js";
|
|
40
|
+
import { registerGetBoard } from "./tools/get-board.js";
|
|
41
|
+
import { registerGetMyTasks } from "./tools/get-my-tasks.js";
|
|
42
|
+
import { registerListComments } from "./tools/list-comments.js";
|
|
43
|
+
// Phase 2 — Skupina D: Attachments
|
|
44
|
+
import { registerListAttachments } from "./tools/list-attachments.js";
|
|
45
|
+
import { registerDeleteAttachment } from "./tools/delete-attachment.js";
|
|
46
|
+
// Phase 2 — Skupina E: Cycles & Epics CRUD
|
|
47
|
+
import { registerCreateCycle } from "./tools/create-cycle.js";
|
|
48
|
+
import { registerCreateEpic } from "./tools/create-epic.js";
|
|
49
|
+
// Phase 2 — Skupina F: Implementation Items
|
|
50
|
+
import { registerCreateImplementationItem } from "./tools/create-implementation-item.js";
|
|
51
|
+
import { registerDeleteImplementationItem } from "./tools/delete-implementation-item.js";
|
|
52
|
+
// Phase 3 — Skupina A: Workflow & Status
|
|
53
|
+
import { registerUpdateTransitions } from "./tools/update-transitions.js";
|
|
54
|
+
import { registerUpdateStatus } from "./tools/update-status.js";
|
|
55
|
+
import { registerListWorkflowPresets } from "./tools/list-workflow-presets.js";
|
|
56
|
+
import { registerGetNextStatuses } from "./tools/get-next-statuses.js";
|
|
57
|
+
// Phase 3 — Skupina B: Comments & Activity
|
|
58
|
+
import { registerUpdateComment } from "./tools/update-comment.js";
|
|
59
|
+
import { registerDeleteComment } from "./tools/delete-comment.js";
|
|
60
|
+
// Phase 3 — Skupina C: Relations
|
|
61
|
+
import { registerListRelations } from "./tools/list-relations.js";
|
|
62
|
+
// Phase 3 — Skupina D: Dev Queue
|
|
63
|
+
import { registerFailDevTask } from "./tools/fail-dev-task.js";
|
|
64
|
+
import { registerListDevAssignments } from "./tools/list-dev-assignments.js";
|
|
65
|
+
// Phase 3 — Skupina E: Labels CRUD
|
|
66
|
+
import { registerCreateLabel } from "./tools/create-label.js";
|
|
67
|
+
import { registerUpdateLabel } from "./tools/update-label.js";
|
|
68
|
+
import { registerDeleteLabel } from "./tools/delete-label.js";
|
|
69
|
+
// Phase 3 — Skupina F: Cycles/Epics extras
|
|
70
|
+
import { registerUpdateCycle } from "./tools/update-cycle.js";
|
|
71
|
+
import { registerDeleteCycle } from "./tools/delete-cycle.js";
|
|
72
|
+
import { registerUpdateEpic } from "./tools/update-epic.js";
|
|
73
|
+
import { registerDeleteEpic } from "./tools/delete-epic.js";
|
|
74
|
+
// ADR-0026 Phase 2f: Project Members
|
|
75
|
+
import { registerListProjectMembers } from "./tools/list-project-members.js";
|
|
76
|
+
import { registerAddProjectMember } from "./tools/add-project-member.js";
|
|
77
|
+
import { registerUpdateProjectMemberRole } from "./tools/update-project-member-role.js";
|
|
78
|
+
import { registerRemoveProjectMember } from "./tools/remove-project-member.js";
|
|
79
|
+
// Resources
|
|
80
|
+
import { registerTicketResource } from "./resources/ticket-resource.js";
|
|
81
|
+
import { registerProjectResource } from "./resources/project-resource.js";
|
|
82
|
+
export async function startServer() {
|
|
83
|
+
const config = loadConfig();
|
|
84
|
+
const api = new ApiClient(config);
|
|
85
|
+
const server = new McpServer({
|
|
86
|
+
name: "tickr",
|
|
87
|
+
version: "0.1.5",
|
|
88
|
+
});
|
|
89
|
+
// Registrace tools
|
|
90
|
+
registerCreateTicket(server, api);
|
|
91
|
+
registerListTickets(server, api);
|
|
92
|
+
registerGetTicket(server, api);
|
|
93
|
+
registerUpdateTicket(server, api);
|
|
94
|
+
registerAddComment(server, api);
|
|
95
|
+
registerUpdateImplementationItem(server, api);
|
|
96
|
+
registerSearchTickets(server, api);
|
|
97
|
+
registerTriageList(server, api);
|
|
98
|
+
registerTriageAccept(server, api);
|
|
99
|
+
registerTriageReject(server, api);
|
|
100
|
+
registerListLabels(server, api);
|
|
101
|
+
registerAddLabel(server, api);
|
|
102
|
+
registerRemoveLabel(server, api);
|
|
103
|
+
registerListCycles(server, api);
|
|
104
|
+
registerAssignCycle(server, api);
|
|
105
|
+
registerListEpics(server, api);
|
|
106
|
+
registerAssignEpic(server, api);
|
|
107
|
+
registerPollDevQueue(server, api);
|
|
108
|
+
registerCompleteDevTask(server, api);
|
|
109
|
+
registerWhoami(server, api);
|
|
110
|
+
registerAddRelation(server, api);
|
|
111
|
+
registerRemoveRelation(server, api);
|
|
112
|
+
// Phase 2 — Skupina A: Workflow & Status Management
|
|
113
|
+
registerListStatuses(server, api);
|
|
114
|
+
registerListTransitions(server, api);
|
|
115
|
+
registerCreateStatus(server, api);
|
|
116
|
+
registerDeleteStatus(server, api);
|
|
117
|
+
registerApplyPreset(server, api);
|
|
118
|
+
// Phase 2 — Skupina B: Project Management
|
|
119
|
+
registerListProjects(server, api);
|
|
120
|
+
registerGetProject(server, api);
|
|
121
|
+
registerCreateProject(server, api);
|
|
122
|
+
// Phase 2 — Skupina C: Ticket Operations
|
|
123
|
+
registerDeleteTicket(server, api);
|
|
124
|
+
registerGetBoard(server, api);
|
|
125
|
+
registerGetMyTasks(server, api);
|
|
126
|
+
registerListComments(server, api);
|
|
127
|
+
// Phase 2 — Skupina D: Attachments
|
|
128
|
+
registerListAttachments(server, api);
|
|
129
|
+
registerDeleteAttachment(server, api);
|
|
130
|
+
// Phase 2 — Skupina E: Cycles & Epics CRUD
|
|
131
|
+
registerCreateCycle(server, api);
|
|
132
|
+
registerCreateEpic(server, api);
|
|
133
|
+
// Phase 2 — Skupina F: Implementation Items
|
|
134
|
+
registerCreateImplementationItem(server, api);
|
|
135
|
+
registerDeleteImplementationItem(server, api);
|
|
136
|
+
// Phase 3 — Skupina A: Workflow & Status
|
|
137
|
+
registerUpdateTransitions(server, api);
|
|
138
|
+
registerUpdateStatus(server, api);
|
|
139
|
+
registerListWorkflowPresets(server, api);
|
|
140
|
+
registerGetNextStatuses(server, api);
|
|
141
|
+
// Phase 3 — Skupina B: Comments & Activity
|
|
142
|
+
registerUpdateComment(server, api);
|
|
143
|
+
registerDeleteComment(server, api);
|
|
144
|
+
// Phase 3 — Skupina C: Relations
|
|
145
|
+
registerListRelations(server, api);
|
|
146
|
+
// Phase 3 — Skupina D: Dev Queue
|
|
147
|
+
registerFailDevTask(server, api);
|
|
148
|
+
registerListDevAssignments(server, api);
|
|
149
|
+
// Phase 3 — Skupina E: Labels CRUD
|
|
150
|
+
registerCreateLabel(server, api);
|
|
151
|
+
registerUpdateLabel(server, api);
|
|
152
|
+
registerDeleteLabel(server, api);
|
|
153
|
+
// Phase 3 — Skupina F: Cycles/Epics extras
|
|
154
|
+
registerUpdateCycle(server, api);
|
|
155
|
+
registerDeleteCycle(server, api);
|
|
156
|
+
registerUpdateEpic(server, api);
|
|
157
|
+
registerDeleteEpic(server, api);
|
|
158
|
+
// ADR-0026 Phase 2f: Project Members
|
|
159
|
+
registerListProjectMembers(server, api);
|
|
160
|
+
registerAddProjectMember(server, api);
|
|
161
|
+
registerUpdateProjectMemberRole(server, api);
|
|
162
|
+
registerRemoveProjectMember(server, api);
|
|
163
|
+
// Registrace resources
|
|
164
|
+
registerTicketResource(server, api);
|
|
165
|
+
registerProjectResource(server, api);
|
|
166
|
+
// Spuštění na stdio transportu
|
|
167
|
+
const transport = new StdioServerTransport();
|
|
168
|
+
await server.connect(transport);
|
|
169
|
+
}
|
|
170
|
+
startServer().catch((err) => {
|
|
171
|
+
console.error("MCP server failed to start:", err);
|
|
172
|
+
process.exit(1);
|
|
173
|
+
});
|
|
174
|
+
//# sourceMappingURL=server.js.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,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
|
|
@@ -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,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,26 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export function registerDeleteLabel(server, api) {
|
|
3
|
+
server.tool("delete_label", "Delete a label from a project", {
|
|
4
|
+
project: z.string().describe("Project slug"),
|
|
5
|
+
label_id: z.string().describe("UUID of the label to delete"),
|
|
6
|
+
}, async (params) => {
|
|
7
|
+
try {
|
|
8
|
+
await api.delete(`/api/projects/${params.project}/labels/${params.label_id}`);
|
|
9
|
+
return {
|
|
10
|
+
content: [
|
|
11
|
+
{
|
|
12
|
+
type: "text",
|
|
13
|
+
text: `Label ${params.label_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-label.js.map
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export function registerFailDevTask(server, api) {
|
|
3
|
+
server.tool("fail_dev_task", "Mark a dev agent task as failed with a reason", {
|
|
4
|
+
assignment_id: z.string().describe("UUID of the dev agent assignment"),
|
|
5
|
+
reason: z.string().describe("Reason why the task failed"),
|
|
6
|
+
}, async (params) => {
|
|
7
|
+
try {
|
|
8
|
+
const reason = params.reason.replace(/\\n/g, "\n");
|
|
9
|
+
await api.post(`/api/dev-queue/fail/${params.assignment_id}`, {
|
|
10
|
+
reason,
|
|
11
|
+
});
|
|
12
|
+
return {
|
|
13
|
+
content: [
|
|
14
|
+
{
|
|
15
|
+
type: "text",
|
|
16
|
+
text: `Task ${params.assignment_id} marked as failed.`,
|
|
17
|
+
},
|
|
18
|
+
],
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
catch (err) {
|
|
22
|
+
return {
|
|
23
|
+
content: [{ type: "text", text: `Error: ${err instanceof Error ? err.message : String(err)}` }],
|
|
24
|
+
isError: true,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=fail-dev-task.js.map
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export function registerGetNextStatuses(server, api) {
|
|
3
|
+
server.tool("get_next_statuses", "Get available next statuses for a ticket (based on current status and user role)", {
|
|
4
|
+
number: z.string().describe("Ticket display number, e.g. 'TKR-42' or 'TKR-BUG-0042'"),
|
|
5
|
+
}, async (params) => {
|
|
6
|
+
try {
|
|
7
|
+
const statuses = await api.get(`/api/tickets/${params.number}/next-statuses`);
|
|
8
|
+
if (statuses.length === 0) {
|
|
9
|
+
return {
|
|
10
|
+
content: [{ type: "text", text: `No available transitions for ${params.number}` }],
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
const lines = [
|
|
14
|
+
"| # | Status | Emoji | Color | Category |",
|
|
15
|
+
"|---|--------|-------|-------|----------|",
|
|
16
|
+
...statuses.map((s, i) => `| ${i + 1} | ${s.name} | ${s.emoji || "-"} | ${s.color} | ${s.category} |`),
|
|
17
|
+
];
|
|
18
|
+
return {
|
|
19
|
+
content: [{ type: "text", text: lines.join("\n") }],
|
|
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=get-next-statuses.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 registerListDevAssignments(server: McpServer, api: ApiClient): void;
|
|
4
|
+
//# sourceMappingURL=list-dev-assignments.d.ts.map
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export function registerListDevAssignments(server, api) {
|
|
2
|
+
server.tool("list_dev_assignments", "List all dev queue assignments (pending, in-progress, completed, failed)", {}, async () => {
|
|
3
|
+
try {
|
|
4
|
+
const assignments = await api.get("/api/dev-queue/assignments");
|
|
5
|
+
if (assignments.length === 0) {
|
|
6
|
+
return {
|
|
7
|
+
content: [{ type: "text", text: "No dev assignments found." }],
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
const lines = [
|
|
11
|
+
"| # | Ticket | Title | Status | Agent | Assigned | Completed |",
|
|
12
|
+
"|---|--------|-------|--------|-------|----------|-----------|",
|
|
13
|
+
...assignments.map((a, i) => `| ${i + 1} | ${a.ticketDisplayNumber} | ${a.ticketTitle} | ${a.status} | ${a.agentName || "-"} | ${a.assignedAt} | ${a.completedAt || "-"} |`),
|
|
14
|
+
];
|
|
15
|
+
return {
|
|
16
|
+
content: [{ type: "text", text: lines.join("\n") }],
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
catch (err) {
|
|
20
|
+
return {
|
|
21
|
+
content: [{ type: "text", text: `Error: ${err instanceof Error ? err.message : String(err)}` }],
|
|
22
|
+
isError: true,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=list-dev-assignments.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 registerListProjectMembers(server: McpServer, api: ApiClient): void;
|
|
4
|
+
//# sourceMappingURL=list-project-members.d.ts.map
|