@omnicoreos/planka-mcp 0.2.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 (126) hide show
  1. package/CHANGELOG.md +86 -0
  2. package/CONTRIBUTING.md +37 -0
  3. package/CREDITS.md +39 -0
  4. package/LICENSE +22 -0
  5. package/README.es.md +213 -0
  6. package/README.md +213 -0
  7. package/dist/client.d.ts +96 -0
  8. package/dist/client.d.ts.map +1 -0
  9. package/dist/client.js +281 -0
  10. package/dist/client.js.map +1 -0
  11. package/dist/errors.d.ts +85 -0
  12. package/dist/errors.d.ts.map +1 -0
  13. package/dist/errors.js +226 -0
  14. package/dist/errors.js.map +1 -0
  15. package/dist/identity.generated.d.ts +3 -0
  16. package/dist/identity.generated.d.ts.map +1 -0
  17. package/dist/identity.generated.js +4 -0
  18. package/dist/identity.generated.js.map +1 -0
  19. package/dist/index.d.ts +3 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +93 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/operations/attachments.d.ts +34 -0
  24. package/dist/operations/attachments.d.ts.map +1 -0
  25. package/dist/operations/attachments.js +89 -0
  26. package/dist/operations/attachments.js.map +1 -0
  27. package/dist/operations/board-id.d.ts +9 -0
  28. package/dist/operations/board-id.d.ts.map +1 -0
  29. package/dist/operations/board-id.js +86 -0
  30. package/dist/operations/board-id.js.map +1 -0
  31. package/dist/operations/boards.d.ts +143 -0
  32. package/dist/operations/boards.d.ts.map +1 -0
  33. package/dist/operations/boards.js +391 -0
  34. package/dist/operations/boards.js.map +1 -0
  35. package/dist/operations/cards.d.ts +36 -0
  36. package/dist/operations/cards.d.ts.map +1 -0
  37. package/dist/operations/cards.js +81 -0
  38. package/dist/operations/cards.js.map +1 -0
  39. package/dist/operations/comments.d.ts +28 -0
  40. package/dist/operations/comments.d.ts.map +1 -0
  41. package/dist/operations/comments.js +53 -0
  42. package/dist/operations/comments.js.map +1 -0
  43. package/dist/operations/labels.d.ts +60 -0
  44. package/dist/operations/labels.d.ts.map +1 -0
  45. package/dist/operations/labels.js +146 -0
  46. package/dist/operations/labels.js.map +1 -0
  47. package/dist/operations/lists.d.ts +15 -0
  48. package/dist/operations/lists.d.ts.map +1 -0
  49. package/dist/operations/lists.js +40 -0
  50. package/dist/operations/lists.js.map +1 -0
  51. package/dist/operations/projects.d.ts +24 -0
  52. package/dist/operations/projects.d.ts.map +1 -0
  53. package/dist/operations/projects.js +61 -0
  54. package/dist/operations/projects.js.map +1 -0
  55. package/dist/operations/tasks.d.ts +30 -0
  56. package/dist/operations/tasks.d.ts.map +1 -0
  57. package/dist/operations/tasks.js +111 -0
  58. package/dist/operations/tasks.js.map +1 -0
  59. package/dist/schemas/entities.d.ts +389 -0
  60. package/dist/schemas/entities.d.ts.map +1 -0
  61. package/dist/schemas/entities.js +202 -0
  62. package/dist/schemas/entities.js.map +1 -0
  63. package/dist/schemas/requests.d.ts +539 -0
  64. package/dist/schemas/requests.d.ts.map +1 -0
  65. package/dist/schemas/requests.js +187 -0
  66. package/dist/schemas/requests.js.map +1 -0
  67. package/dist/schemas/responses.d.ts +2626 -0
  68. package/dist/schemas/responses.d.ts.map +1 -0
  69. package/dist/schemas/responses.js +75 -0
  70. package/dist/schemas/responses.js.map +1 -0
  71. package/dist/tools/attachments.d.ts +270 -0
  72. package/dist/tools/attachments.d.ts.map +1 -0
  73. package/dist/tools/attachments.js +247 -0
  74. package/dist/tools/attachments.js.map +1 -0
  75. package/dist/tools/cards.d.ts +401 -0
  76. package/dist/tools/cards.d.ts.map +1 -0
  77. package/dist/tools/cards.js +368 -0
  78. package/dist/tools/cards.js.map +1 -0
  79. package/dist/tools/comments.d.ts +217 -0
  80. package/dist/tools/comments.d.ts.map +1 -0
  81. package/dist/tools/comments.js +208 -0
  82. package/dist/tools/comments.js.map +1 -0
  83. package/dist/tools/index.d.ts +1293 -0
  84. package/dist/tools/index.d.ts.map +1 -0
  85. package/dist/tools/index.js +62 -0
  86. package/dist/tools/index.js.map +1 -0
  87. package/dist/tools/labels.d.ts +214 -0
  88. package/dist/tools/labels.d.ts.map +1 -0
  89. package/dist/tools/labels.js +302 -0
  90. package/dist/tools/labels.js.map +1 -0
  91. package/dist/tools/lists.d.ts +117 -0
  92. package/dist/tools/lists.d.ts.map +1 -0
  93. package/dist/tools/lists.js +178 -0
  94. package/dist/tools/lists.js.map +1 -0
  95. package/dist/tools/navigation.d.ts +106 -0
  96. package/dist/tools/navigation.d.ts.map +1 -0
  97. package/dist/tools/navigation.js +151 -0
  98. package/dist/tools/navigation.js.map +1 -0
  99. package/dist/tools/queries.d.ts +380 -0
  100. package/dist/tools/queries.d.ts.map +1 -0
  101. package/dist/tools/queries.js +256 -0
  102. package/dist/tools/queries.js.map +1 -0
  103. package/dist/tools/tasks.d.ts +223 -0
  104. package/dist/tools/tasks.d.ts.map +1 -0
  105. package/dist/tools/tasks.js +169 -0
  106. package/dist/tools/tasks.js.map +1 -0
  107. package/docs/planka-2x-gotchas.md +192 -0
  108. package/docs/tools.md +659 -0
  109. package/docs/troubleshooting.md +138 -0
  110. package/package.json +71 -0
  111. package/project.identity.json +7 -0
  112. package/scripts/bootstrap-board.mjs +160 -0
  113. package/scripts/lib/planka-api.mjs +244 -0
  114. package/scripts/lib/workflow-template.mjs +26 -0
  115. package/scripts/setup.mjs +236 -0
  116. package/scripts/setup.sh +48 -0
  117. package/scripts/sync-identity.mjs +57 -0
  118. package/server.json +43 -0
  119. package/tests/smoke/planka-smoke.mjs +920 -0
  120. package/workflow/README.md +232 -0
  121. package/workflow/board-template.md +115 -0
  122. package/workflow/skills/planka-close-card/SKILL.md +81 -0
  123. package/workflow/skills/planka-orchestrator/SKILL.md +126 -0
  124. package/workflow/worktrees/README.md +104 -0
  125. package/workflow/worktrees/wt.conf.example +24 -0
  126. package/workflow/worktrees/wt.sh +345 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Tool registry for PLANKA MCP server.
3
+ */
4
+ import { navigationTools } from "./navigation.js";
5
+ import { cardTools } from "./cards.js";
6
+ import { taskTools } from "./tasks.js";
7
+ import { labelTools } from "./labels.js";
8
+ import { commentTools } from "./comments.js";
9
+ import { listTools } from "./lists.js";
10
+ import { attachmentTools } from "./attachments.js";
11
+ import { queryTools } from "./queries.js";
12
+ /**
13
+ * All registered tools.
14
+ */
15
+ export const allTools = [
16
+ ...navigationTools,
17
+ ...queryTools,
18
+ ...cardTools,
19
+ ...taskTools,
20
+ ...labelTools,
21
+ ...commentTools,
22
+ ...listTools,
23
+ ...attachmentTools,
24
+ ];
25
+ /**
26
+ * Get a tool by name.
27
+ */
28
+ export function getTool(name) {
29
+ return allTools.find((tool) => tool.name === name);
30
+ }
31
+ /**
32
+ * Required inputSchema fields that never arrived.
33
+ *
34
+ * The inputSchema is JSON Schema, not Zod: this only checks presence, which is
35
+ * what stops a missing `tasks` from blowing up inside the handler as "Cannot
36
+ * read properties of undefined (reading 'map')".
37
+ */
38
+ export function findMissingRequiredArgs(tool, args) {
39
+ const required = tool.inputSchema.required ?? [];
40
+ const received = args && typeof args === "object" ? args : {};
41
+ return required.filter((field) => received[field] === undefined || received[field] === null);
42
+ }
43
+ /**
44
+ * Get all tool definitions (for MCP listTools).
45
+ */
46
+ export function getToolDefinitions() {
47
+ return allTools.map((tool) => ({
48
+ name: tool.name,
49
+ description: tool.description,
50
+ inputSchema: tool.inputSchema,
51
+ }));
52
+ }
53
+ // Re-export individual tool groups
54
+ export { navigationTools } from "./navigation.js";
55
+ export { cardTools } from "./cards.js";
56
+ export { taskTools } from "./tasks.js";
57
+ export { labelTools } from "./labels.js";
58
+ export { commentTools } from "./comments.js";
59
+ export { listTools } from "./lists.js";
60
+ export { attachmentTools } from "./attachments.js";
61
+ export { queryTools } from "./queries.js";
62
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C;;GAEG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,GAAG,eAAe;IAClB,GAAG,UAAU;IACb,GAAG,SAAS;IACZ,GAAG,SAAS;IACZ,GAAG,UAAU;IACb,GAAG,YAAY;IACf,GAAG,SAAS;IACZ,GAAG,eAAe;CACnB,CAAC;AA2BF;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAqB,CAAC;AACzE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAAU,EAAE,IAAa;IAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,IAAI,EAAE,CAAC;IACjD,MAAM,QAAQ,GACZ,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAE,IAAgC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5E,OAAO,QAAQ,CAAC,MAAM,CACpB,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,SAAS,IAAI,QAAQ,CAAC,KAAK,CAAC,KAAK,IAAI,CACrE,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC7B,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,WAAW,EAAE,IAAI,CAAC,WAAW;KAC9B,CAAC,CAAC,CAAC;AACN,CAAC;AAED,mCAAmC;AACnC,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,214 @@
1
+ /**
2
+ * Tool: planka_manage_labels
3
+ * Create, update, or delete labels on a board.
4
+ */
5
+ export declare const manageLabelsTool: {
6
+ name: string;
7
+ description: string;
8
+ inputSchema: {
9
+ type: "object";
10
+ properties: {
11
+ action: {
12
+ type: string;
13
+ enum: string[];
14
+ description: string;
15
+ };
16
+ boardId: {
17
+ type: string;
18
+ description: string;
19
+ };
20
+ labelId: {
21
+ type: string;
22
+ description: string;
23
+ };
24
+ name: {
25
+ type: string;
26
+ description: string;
27
+ };
28
+ color: {
29
+ type: string;
30
+ description: string;
31
+ };
32
+ };
33
+ required: string[];
34
+ };
35
+ handler: (params: {
36
+ action: "create" | "update" | "delete";
37
+ boardId?: string;
38
+ labelId?: string;
39
+ name?: string;
40
+ color?: string;
41
+ }) => Promise<{
42
+ content: {
43
+ type: "text";
44
+ text: string;
45
+ }[];
46
+ isError: boolean;
47
+ } | {
48
+ content: {
49
+ type: "text";
50
+ text: string;
51
+ }[];
52
+ isError?: undefined;
53
+ }>;
54
+ };
55
+ /**
56
+ * Tool: planka_set_card_labels
57
+ * Add or remove labels from a card.
58
+ */
59
+ export declare const setCardLabelsTool: {
60
+ name: string;
61
+ description: string;
62
+ inputSchema: {
63
+ type: "object";
64
+ properties: {
65
+ cardId: {
66
+ type: string;
67
+ description: string;
68
+ };
69
+ addLabelIds: {
70
+ type: string;
71
+ items: {
72
+ type: string;
73
+ };
74
+ description: string;
75
+ };
76
+ labelIds: {
77
+ type: string;
78
+ items: {
79
+ type: string;
80
+ };
81
+ description: string;
82
+ };
83
+ removeLabelIds: {
84
+ type: string;
85
+ items: {
86
+ type: string;
87
+ };
88
+ description: string;
89
+ };
90
+ };
91
+ required: string[];
92
+ };
93
+ handler: (params: {
94
+ cardId: string;
95
+ addLabelIds?: string[];
96
+ labelIds?: string[];
97
+ removeLabelIds?: string[];
98
+ }) => Promise<{
99
+ content: {
100
+ type: "text";
101
+ text: string;
102
+ }[];
103
+ isError: boolean;
104
+ } | {
105
+ isError?: true | undefined;
106
+ content: {
107
+ type: "text";
108
+ text: string;
109
+ }[];
110
+ }>;
111
+ };
112
+ export declare const labelTools: ({
113
+ name: string;
114
+ description: string;
115
+ inputSchema: {
116
+ type: "object";
117
+ properties: {
118
+ action: {
119
+ type: string;
120
+ enum: string[];
121
+ description: string;
122
+ };
123
+ boardId: {
124
+ type: string;
125
+ description: string;
126
+ };
127
+ labelId: {
128
+ type: string;
129
+ description: string;
130
+ };
131
+ name: {
132
+ type: string;
133
+ description: string;
134
+ };
135
+ color: {
136
+ type: string;
137
+ description: string;
138
+ };
139
+ };
140
+ required: string[];
141
+ };
142
+ handler: (params: {
143
+ action: "create" | "update" | "delete";
144
+ boardId?: string;
145
+ labelId?: string;
146
+ name?: string;
147
+ color?: string;
148
+ }) => Promise<{
149
+ content: {
150
+ type: "text";
151
+ text: string;
152
+ }[];
153
+ isError: boolean;
154
+ } | {
155
+ content: {
156
+ type: "text";
157
+ text: string;
158
+ }[];
159
+ isError?: undefined;
160
+ }>;
161
+ } | {
162
+ name: string;
163
+ description: string;
164
+ inputSchema: {
165
+ type: "object";
166
+ properties: {
167
+ cardId: {
168
+ type: string;
169
+ description: string;
170
+ };
171
+ addLabelIds: {
172
+ type: string;
173
+ items: {
174
+ type: string;
175
+ };
176
+ description: string;
177
+ };
178
+ labelIds: {
179
+ type: string;
180
+ items: {
181
+ type: string;
182
+ };
183
+ description: string;
184
+ };
185
+ removeLabelIds: {
186
+ type: string;
187
+ items: {
188
+ type: string;
189
+ };
190
+ description: string;
191
+ };
192
+ };
193
+ required: string[];
194
+ };
195
+ handler: (params: {
196
+ cardId: string;
197
+ addLabelIds?: string[];
198
+ labelIds?: string[];
199
+ removeLabelIds?: string[];
200
+ }) => Promise<{
201
+ content: {
202
+ type: "text";
203
+ text: string;
204
+ }[];
205
+ isError: boolean;
206
+ } | {
207
+ isError?: true | undefined;
208
+ content: {
209
+ type: "text";
210
+ text: string;
211
+ }[];
212
+ }>;
213
+ })[];
214
+ //# sourceMappingURL=labels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"labels.d.ts","sourceRoot":"","sources":["../../src/tools/labels.ts"],"names":[],"mappings":"AAgBA;;;GAGG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBA8BH;QACtB,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;QACvC,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB;;;;;;;;;;;;;CA0LF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBA+BJ;QACtB,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;QACvB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;QACpB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;KAC3B;;;;;;;;;;;;;CAiEF,CAAC;AAEF,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBA7SG;QACtB,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;QACvC,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBA+NuB;QACtB,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;QACvB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;QACpB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;KAC3B;;;;;;;;;;;;;IAmE4D,CAAC"}
@@ -0,0 +1,302 @@
1
+ /**
2
+ * Label tools for PLANKA MCP server.
3
+ */
4
+ import { createLabel, updateLabel, deleteLabel, setCardLabels, } from "../operations/labels.js";
5
+ import { LabelColorSchema } from "../schemas/entities.js";
6
+ import { PlankaError } from "../errors.js";
7
+ // Valid colors for the schema description
8
+ const validColors = LabelColorSchema.options.join(", ");
9
+ /**
10
+ * Tool: planka_manage_labels
11
+ * Create, update, or delete labels on a board.
12
+ */
13
+ export const manageLabelsTool = {
14
+ name: "planka_manage_labels",
15
+ description: "Create, update, or delete labels on a board.",
16
+ inputSchema: {
17
+ type: "object",
18
+ properties: {
19
+ action: {
20
+ type: "string",
21
+ enum: ["create", "update", "delete"],
22
+ description: "Action to perform",
23
+ },
24
+ boardId: {
25
+ type: "string",
26
+ description: "Board ID (required for create)",
27
+ },
28
+ labelId: {
29
+ type: "string",
30
+ description: "Label ID (required for update/delete)",
31
+ },
32
+ name: {
33
+ type: "string",
34
+ description: "Label name",
35
+ },
36
+ color: {
37
+ type: "string",
38
+ description: `Label color. Valid colors: ${validColors}`,
39
+ },
40
+ },
41
+ required: ["action"],
42
+ },
43
+ handler: async (params) => {
44
+ try {
45
+ switch (params.action) {
46
+ case "create": {
47
+ if (!params.boardId) {
48
+ return {
49
+ content: [
50
+ {
51
+ type: "text",
52
+ text: "Error: boardId is required for create action",
53
+ },
54
+ ],
55
+ isError: true,
56
+ };
57
+ }
58
+ if (!params.name) {
59
+ return {
60
+ content: [
61
+ {
62
+ type: "text",
63
+ text: "Error: name is required for create action",
64
+ },
65
+ ],
66
+ isError: true,
67
+ };
68
+ }
69
+ if (!params.color) {
70
+ return {
71
+ content: [
72
+ {
73
+ type: "text",
74
+ text: "Error: color is required for create action",
75
+ },
76
+ ],
77
+ isError: true,
78
+ };
79
+ }
80
+ // Validate color
81
+ const colorParse = LabelColorSchema.safeParse(params.color);
82
+ if (!colorParse.success) {
83
+ return {
84
+ content: [
85
+ {
86
+ type: "text",
87
+ text: `Error: Invalid color '${params.color}'. Valid colors: ${validColors}`,
88
+ },
89
+ ],
90
+ isError: true,
91
+ };
92
+ }
93
+ const label = await createLabel({
94
+ boardId: params.boardId,
95
+ name: params.name,
96
+ color: colorParse.data,
97
+ });
98
+ return {
99
+ content: [
100
+ {
101
+ type: "text",
102
+ text: JSON.stringify({
103
+ success: true,
104
+ label: {
105
+ id: label.id,
106
+ name: label.name,
107
+ color: label.color,
108
+ },
109
+ }, null, 2),
110
+ },
111
+ ],
112
+ };
113
+ }
114
+ case "update": {
115
+ if (!params.labelId) {
116
+ return {
117
+ content: [
118
+ {
119
+ type: "text",
120
+ text: "Error: labelId is required for update action",
121
+ },
122
+ ],
123
+ isError: true,
124
+ };
125
+ }
126
+ const updates = { labelId: params.labelId };
127
+ if (params.name !== undefined)
128
+ updates.name = params.name;
129
+ if (params.color !== undefined) {
130
+ const colorParse = LabelColorSchema.safeParse(params.color);
131
+ if (!colorParse.success) {
132
+ return {
133
+ content: [
134
+ {
135
+ type: "text",
136
+ text: `Error: Invalid color '${params.color}'. Valid colors: ${validColors}`,
137
+ },
138
+ ],
139
+ isError: true,
140
+ };
141
+ }
142
+ updates.color = colorParse.data;
143
+ }
144
+ const label = await updateLabel(updates);
145
+ return {
146
+ content: [
147
+ {
148
+ type: "text",
149
+ text: JSON.stringify({
150
+ success: true,
151
+ label: {
152
+ id: label.id,
153
+ name: label.name,
154
+ color: label.color,
155
+ },
156
+ }, null, 2),
157
+ },
158
+ ],
159
+ };
160
+ }
161
+ case "delete": {
162
+ if (!params.labelId) {
163
+ return {
164
+ content: [
165
+ {
166
+ type: "text",
167
+ text: "Error: labelId is required for delete action",
168
+ },
169
+ ],
170
+ isError: true,
171
+ };
172
+ }
173
+ await deleteLabel({ labelId: params.labelId });
174
+ return {
175
+ content: [
176
+ {
177
+ type: "text",
178
+ text: JSON.stringify({
179
+ success: true,
180
+ message: `Label ${params.labelId} deleted`,
181
+ }, null, 2),
182
+ },
183
+ ],
184
+ };
185
+ }
186
+ default:
187
+ return {
188
+ content: [
189
+ {
190
+ type: "text",
191
+ text: `Error: Unknown action '${params.action}'`,
192
+ },
193
+ ],
194
+ isError: true,
195
+ };
196
+ }
197
+ }
198
+ catch (error) {
199
+ if (error instanceof PlankaError) {
200
+ return {
201
+ content: [{ type: "text", text: `Error: ${error.message}` }],
202
+ isError: true,
203
+ };
204
+ }
205
+ throw error;
206
+ }
207
+ },
208
+ };
209
+ /**
210
+ * Tool: planka_set_card_labels
211
+ * Add or remove labels from a card.
212
+ */
213
+ export const setCardLabelsTool = {
214
+ name: "planka_set_card_labels",
215
+ description: "Add or remove labels from a card. Pass label IDs from the board (planka_get_board lists them), not label names. " +
216
+ "Reports what actually landed on the card, verified by re-reading it.",
217
+ inputSchema: {
218
+ type: "object",
219
+ properties: {
220
+ cardId: {
221
+ type: "string",
222
+ description: "The card ID",
223
+ },
224
+ addLabelIds: {
225
+ type: "array",
226
+ items: { type: "string" },
227
+ description: "Label IDs to add. Alias: `labelIds` (both are accepted and merged).",
228
+ },
229
+ labelIds: {
230
+ type: "array",
231
+ items: { type: "string" },
232
+ description: "Alias of addLabelIds. Label IDs to add.",
233
+ },
234
+ removeLabelIds: {
235
+ type: "array",
236
+ items: { type: "string" },
237
+ description: "Label IDs to remove",
238
+ },
239
+ },
240
+ required: ["cardId"],
241
+ },
242
+ handler: async (params) => {
243
+ try {
244
+ // `labelIds` is the name callers reach for first. Accepting only
245
+ // `addLabelIds` meant the argument was dropped and the tool answered
246
+ // `success: true, labelsAdded: 0` without touching the card.
247
+ const toAdd = [
248
+ ...new Set([...(params.addLabelIds ?? []), ...(params.labelIds ?? [])]),
249
+ ];
250
+ const toRemove = params.removeLabelIds ?? [];
251
+ if (toAdd.length === 0 && toRemove.length === 0) {
252
+ return {
253
+ content: [
254
+ {
255
+ type: "text",
256
+ text: "Error: nothing to do — pass addLabelIds (or labelIds) and/or removeLabelIds. " +
257
+ "Label IDs come from planka_get_board.",
258
+ },
259
+ ],
260
+ isError: true,
261
+ };
262
+ }
263
+ const result = await setCardLabels({
264
+ cardId: params.cardId,
265
+ addLabelIds: toAdd,
266
+ removeLabelIds: toRemove,
267
+ });
268
+ const ok = result.failed.length === 0;
269
+ return {
270
+ content: [
271
+ {
272
+ type: "text",
273
+ text: JSON.stringify({
274
+ success: ok,
275
+ cardId: params.cardId,
276
+ labelsAdded: result.added.length,
277
+ labelsRemoved: result.removed.length,
278
+ added: result.added,
279
+ removed: result.removed,
280
+ alreadyPresent: result.alreadyPresent,
281
+ notPresent: result.notPresent,
282
+ failed: result.failed,
283
+ finalLabelIds: result.finalLabelIds,
284
+ }, null, 2),
285
+ },
286
+ ],
287
+ ...(ok ? {} : { isError: true }),
288
+ };
289
+ }
290
+ catch (error) {
291
+ if (error instanceof PlankaError) {
292
+ return {
293
+ content: [{ type: "text", text: `Error: ${error.message}` }],
294
+ isError: true,
295
+ };
296
+ }
297
+ throw error;
298
+ }
299
+ },
300
+ };
301
+ export const labelTools = [manageLabelsTool, setCardLabelsTool];
302
+ //# sourceMappingURL=labels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"labels.js","sourceRoot":"","sources":["../../src/tools/labels.ts"],"names":[],"mappings":"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"}