@denisixnpm/planka-mcp 2.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.
@@ -0,0 +1,535 @@
1
+ import { buildGroupedSchema } from "../types.js";
2
+ /**
3
+ * Auth tool - authentication operations
4
+ */
5
+ export const authTool = {
6
+ name: "auth",
7
+ description: "Authentication operations for login flows, token management, and terms acceptance.",
8
+ operations: {
9
+ login: {
10
+ method: "POST",
11
+ path: "/access-tokens",
12
+ requiresAuth: false,
13
+ description: "Authenticate with email/username and password",
14
+ },
15
+ logout: {
16
+ method: "DELETE",
17
+ path: "/access-tokens/me",
18
+ description: "Logout current user",
19
+ },
20
+ acceptTerms: {
21
+ method: "POST",
22
+ path: "/access-tokens/accept-terms",
23
+ requiresAuth: false,
24
+ description: "Accept terms during authentication flow",
25
+ },
26
+ oidcExchange: {
27
+ method: "POST",
28
+ path: "/access-tokens/exchange-with-oidc",
29
+ requiresAuth: false,
30
+ description: "Exchange OIDC code for access token",
31
+ },
32
+ revokePending: {
33
+ method: "POST",
34
+ path: "/access-tokens/revoke-pending-token",
35
+ requiresAuth: false,
36
+ description: "Revoke pending authentication token",
37
+ },
38
+ getTerms: {
39
+ method: "GET",
40
+ path: "/terms",
41
+ requiresAuth: false,
42
+ description: "Get terms and conditions",
43
+ },
44
+ },
45
+ inputSchema: buildGroupedSchema(["login", "logout", "acceptTerms", "oidcExchange", "revokePending", "getTerms"], {
46
+ login: "Login with credentials",
47
+ logout: "Logout current session",
48
+ acceptTerms: "Accept terms during auth",
49
+ oidcExchange: "Exchange OIDC code",
50
+ revokePending: "Revoke pending token",
51
+ getTerms: "Get terms document",
52
+ }, {
53
+ data: {
54
+ description: "Auth data: { emailOrUsername?: string, password?: string, token?: string, code?: string }",
55
+ requiredFor: ["login", "acceptTerms", "oidcExchange", "revokePending"],
56
+ },
57
+ query: {
58
+ language: { type: "string", description: "Language code for terms" },
59
+ },
60
+ }),
61
+ };
62
+ /**
63
+ * Projects tool - manages Planka projects
64
+ */
65
+ export const projectsTool = {
66
+ name: "projects",
67
+ description: "Manage Planka projects. Projects are top-level containers for boards.",
68
+ operations: {
69
+ list: {
70
+ method: "GET",
71
+ path: "/projects",
72
+ description: "List all projects accessible to the current user",
73
+ },
74
+ get: {
75
+ method: "GET",
76
+ path: "/projects/{id}",
77
+ description: "Get detailed project information including boards and memberships",
78
+ },
79
+ create: {
80
+ method: "POST",
81
+ path: "/projects",
82
+ description: "Create a new project (you become the project manager)",
83
+ },
84
+ update: {
85
+ method: "PATCH",
86
+ path: "/projects/{id}",
87
+ description: "Update project settings",
88
+ },
89
+ delete: {
90
+ method: "DELETE",
91
+ path: "/projects/{id}",
92
+ description: "Delete a project and all its data",
93
+ },
94
+ },
95
+ inputSchema: buildGroupedSchema(["list", "get", "create", "update", "delete"], {
96
+ list: "List all accessible projects",
97
+ get: "Get project details by ID",
98
+ create: "Create a new project",
99
+ update: "Update project settings",
100
+ delete: "Delete a project",
101
+ }, {
102
+ id: {
103
+ description: "Project ID",
104
+ requiredFor: ["get", "update", "delete"],
105
+ },
106
+ data: {
107
+ description: "Project data: { name: string, type: 'private'|'shared' (required for create), description?: string, backgroundType?: 'gradient'|'image', backgroundGradient?: string }",
108
+ requiredFor: ["create", "update"],
109
+ properties: {
110
+ name: { type: "string", description: "Project name", required: true },
111
+ type: { type: "string", enum: ["private", "shared"], description: "Project visibility type", required: true },
112
+ description: { type: "string", description: "Project description" },
113
+ backgroundType: { type: "string", enum: ["gradient", "image"], description: "Background type" },
114
+ backgroundGradient: { type: "string", description: "Background gradient value" },
115
+ },
116
+ },
117
+ }),
118
+ };
119
+ /**
120
+ * Boards tool - manages boards within projects
121
+ */
122
+ export const boardsTool = {
123
+ name: "boards",
124
+ description: "Manage Planka boards. Boards contain lists and cards for organizing work.",
125
+ operations: {
126
+ get: {
127
+ method: "GET",
128
+ path: "/boards/{id}",
129
+ description: "Get board with lists, cards, labels, and memberships",
130
+ },
131
+ create: {
132
+ method: "POST",
133
+ path: "/projects/{projectId}/boards",
134
+ description: "Create a new board in a project",
135
+ },
136
+ update: {
137
+ method: "PATCH",
138
+ path: "/boards/{id}",
139
+ description: "Update board settings",
140
+ },
141
+ delete: {
142
+ method: "DELETE",
143
+ path: "/boards/{id}",
144
+ description: "Delete a board and all its data",
145
+ },
146
+ },
147
+ inputSchema: buildGroupedSchema(["get", "create", "update", "delete"], {
148
+ get: "Get board details by ID",
149
+ create: "Create a new board in a project",
150
+ update: "Update board settings",
151
+ delete: "Delete a board",
152
+ }, {
153
+ id: {
154
+ description: "Board ID (for get, update, delete) or Project ID (for create, use projectId in data)",
155
+ requiredFor: ["get", "update", "delete"],
156
+ },
157
+ data: {
158
+ description: "Board data: { name: string, position: number (required for create), projectId?: string (for create), defaultView?: 'kanban'|'grid'|'list' }",
159
+ requiredFor: ["create", "update"],
160
+ properties: {
161
+ name: { type: "string", description: "Board name", required: true },
162
+ position: { type: "number", description: "Board position (Planka requires this on create)", required: true },
163
+ projectId: { type: "string", description: "Project ID (for create)" },
164
+ defaultView: { type: "string", enum: ["kanban", "grid", "list"], description: "Default board view" },
165
+ },
166
+ },
167
+ }),
168
+ };
169
+ /**
170
+ * Lists tool - manages lists within boards
171
+ */
172
+ export const listsTool = {
173
+ name: "lists",
174
+ description: "Manage Planka lists. Lists are columns on a board that contain cards.",
175
+ operations: {
176
+ get: {
177
+ method: "GET",
178
+ path: "/lists/{id}",
179
+ description: "Get a list with its cards",
180
+ },
181
+ create: {
182
+ method: "POST",
183
+ path: "/boards/{boardId}/lists",
184
+ description: "Create a new list on a board",
185
+ },
186
+ update: {
187
+ method: "PATCH",
188
+ path: "/lists/{id}",
189
+ description: "Update list name, position, or type",
190
+ },
191
+ delete: {
192
+ method: "DELETE",
193
+ path: "/lists/{id}",
194
+ description: "Delete a list (cards move to trash)",
195
+ },
196
+ },
197
+ inputSchema: buildGroupedSchema(["get", "create", "update", "delete"], {
198
+ get: "Get list details and cards",
199
+ create: "Create a new list on a board",
200
+ update: "Update list settings",
201
+ delete: "Delete a list",
202
+ }, {
203
+ id: {
204
+ description: "List ID (for get, update, delete) or Board ID (for create, use boardId in data)",
205
+ requiredFor: ["get", "update", "delete"],
206
+ },
207
+ data: {
208
+ description: "List data: { name: string, type: 'active'|'closed' (required), position: number (required), boardId?: string (for create) }",
209
+ requiredFor: ["create", "update"],
210
+ properties: {
211
+ name: { type: "string", description: "List name", required: true },
212
+ type: { type: "string", enum: ["active", "closed"], description: "List type", required: true },
213
+ position: { type: "number", description: "List position", required: true },
214
+ boardId: { type: "string", description: "Board ID (for create)" },
215
+ },
216
+ },
217
+ }),
218
+ };
219
+ /**
220
+ * Cards tool - manages cards within lists
221
+ */
222
+ export const cardsTool = {
223
+ name: "cards",
224
+ description: "Manage Planka cards. Cards are individual work items on a board.",
225
+ operations: {
226
+ list: {
227
+ method: "GET",
228
+ path: "/lists/{listId}/cards",
229
+ description: "Get cards from a list with filtering, search, and pagination",
230
+ },
231
+ get: {
232
+ method: "GET",
233
+ path: "/cards/{id}",
234
+ description: "Get card with task lists, attachments, and custom fields",
235
+ },
236
+ create: {
237
+ method: "POST",
238
+ path: "/lists/{listId}/cards",
239
+ description: "Create a new card in a list",
240
+ },
241
+ update: {
242
+ method: "PATCH",
243
+ path: "/cards/{id}",
244
+ description: "Update card properties (can move between lists)",
245
+ },
246
+ delete: {
247
+ method: "DELETE",
248
+ path: "/cards/{id}",
249
+ description: "Delete a card permanently",
250
+ },
251
+ },
252
+ inputSchema: buildGroupedSchema(["list", "get", "create", "update", "delete"], {
253
+ list: "Get cards from a list (requires listId)",
254
+ get: "Get card details by ID",
255
+ create: "Create a new card",
256
+ update: "Update card properties",
257
+ delete: "Delete a card",
258
+ }, {
259
+ id: {
260
+ description: "Card ID (for get, update, delete) or List ID (for list, create)",
261
+ requiredFor: ["list", "get", "update", "delete"],
262
+ },
263
+ data: {
264
+ description: "Card data: { name: string, type: 'project'|'story' (required), position: number (required for create), listId?: string (for create/move), description?: string, dueDate?: string, isDueCompleted?: boolean }",
265
+ requiredFor: ["create", "update"],
266
+ properties: {
267
+ name: { type: "string", description: "Card name", required: true },
268
+ type: { type: "string", enum: ["project", "story"], description: "Card type", required: true },
269
+ position: { type: "number", description: "Card position (Planka requires this on create)", required: true },
270
+ listId: { type: "string", description: "List ID (for create/move)" },
271
+ description: { type: "string", description: "Card description" },
272
+ dueDate: { type: "string", description: "Due date (ISO 8601)" },
273
+ isDueCompleted: { type: "boolean", description: "Whether the due date is completed" },
274
+ },
275
+ },
276
+ query: {
277
+ search: { type: "string", description: "Search term to filter cards" },
278
+ userIds: { type: "string", description: "Comma-separated user IDs to filter by" },
279
+ labelIds: { type: "string", description: "Comma-separated label IDs to filter by" },
280
+ },
281
+ }),
282
+ };
283
+ /**
284
+ * Comments tool - manages comments on cards
285
+ */
286
+ export const commentsTool = {
287
+ name: "comments",
288
+ description: "Manage comments on Planka cards.",
289
+ operations: {
290
+ list: {
291
+ method: "GET",
292
+ path: "/cards/{cardId}/comments",
293
+ description: "Get comments for a card with pagination",
294
+ },
295
+ create: {
296
+ method: "POST",
297
+ path: "/cards/{cardId}/comments",
298
+ description: "Add a comment to a card",
299
+ },
300
+ },
301
+ inputSchema: buildGroupedSchema(["list", "create"], {
302
+ list: "Get comments for a card",
303
+ create: "Add a comment to a card",
304
+ }, {
305
+ id: {
306
+ description: "Card ID to get/add comments",
307
+ requiredFor: ["list", "create"],
308
+ },
309
+ data: {
310
+ description: "Comment data: { text: string }",
311
+ requiredFor: ["create"],
312
+ properties: {
313
+ text: { type: "string", description: "Comment text", required: true },
314
+ },
315
+ },
316
+ query: {
317
+ beforeId: { type: "string", description: "Get comments before this ID (pagination)" },
318
+ },
319
+ }),
320
+ };
321
+ /**
322
+ * Tasks tool - manages task lists and tasks on cards
323
+ */
324
+ export const tasksTool = {
325
+ name: "tasks",
326
+ description: "Manage task lists and tasks on Planka cards. Tasks are checklist items within a card.",
327
+ operations: {
328
+ getList: {
329
+ method: "GET",
330
+ path: "/task-lists/{id}",
331
+ description: "Get a task list with all its tasks",
332
+ },
333
+ createList: {
334
+ method: "POST",
335
+ path: "/cards/{cardId}/task-lists",
336
+ description: "Create a new task list on a card",
337
+ },
338
+ create: {
339
+ method: "POST",
340
+ path: "/task-lists/{taskListId}/tasks",
341
+ description: "Create a new task in a task list",
342
+ },
343
+ update: {
344
+ method: "PATCH",
345
+ path: "/tasks/{id}",
346
+ description: "Update task (name, completion status, assignee)",
347
+ },
348
+ },
349
+ inputSchema: buildGroupedSchema(["getList", "createList", "create", "update"], {
350
+ getList: "Get a task list by ID",
351
+ createList: "Create a task list on a card",
352
+ create: "Create a task in a task list",
353
+ update: "Update a task",
354
+ }, {
355
+ id: {
356
+ description: "Task List ID (for getList), Card ID (for createList), Task List ID (for create, use taskListId in data), or Task ID (for update)",
357
+ requiredFor: ["getList", "createList", "create", "update"],
358
+ },
359
+ data: {
360
+ description: "Data: { name: string, position: number (required for createList/create), cardId?: string (for createList), taskListId?: string (for create), isCompleted?: boolean (for update), assigneeUserId?: string }",
361
+ requiredFor: ["createList", "create", "update"],
362
+ properties: {
363
+ name: { type: "string", description: "Task list/task name", required: true },
364
+ position: { type: "number", description: "Position (required for createList and create)", required: true },
365
+ cardId: { type: "string", description: "Card ID (for createList)" },
366
+ taskListId: { type: "string", description: "Task list ID (for create)" },
367
+ isCompleted: { type: "boolean", description: "Task completion status (for update)" },
368
+ assigneeUserId: { type: "string", description: "Assigned user ID" },
369
+ },
370
+ },
371
+ }),
372
+ };
373
+ /**
374
+ * Labels tool - manages labels on boards and cards
375
+ */
376
+ export const labelsTool = {
377
+ name: "labels",
378
+ description: "Manage labels on Planka boards and cards. Labels help categorize and filter cards.",
379
+ operations: {
380
+ create: {
381
+ method: "POST",
382
+ path: "/boards/{boardId}/labels",
383
+ description: "Create a new label on a board",
384
+ },
385
+ update: {
386
+ method: "PATCH",
387
+ path: "/labels/{id}",
388
+ description: "Update a label",
389
+ },
390
+ delete: {
391
+ method: "DELETE",
392
+ path: "/labels/{id}",
393
+ description: "Delete a label",
394
+ },
395
+ addToCard: {
396
+ method: "POST",
397
+ path: "/cards/{cardId}/card-labels",
398
+ description: "Add a label to a card",
399
+ },
400
+ removeFromCard: {
401
+ method: "DELETE",
402
+ path: "/cards/{cardId}/card-labels/labelId:{labelId}",
403
+ description: "Remove a label from a card",
404
+ },
405
+ },
406
+ inputSchema: buildGroupedSchema(["create", "update", "delete", "addToCard", "removeFromCard"], {
407
+ create: "Create a label on a board",
408
+ update: "Update a label's name, color, or position",
409
+ delete: "Delete a label from a board",
410
+ addToCard: "Add a label to a card",
411
+ removeFromCard: "Remove a label from a card",
412
+ }, {
413
+ id: {
414
+ description: "Board ID (for create), Label ID (for update, delete), or Card ID (for addToCard, removeFromCard)",
415
+ requiredFor: ["create", "update", "delete", "addToCard", "removeFromCard"],
416
+ },
417
+ data: {
418
+ description: "Label data: { name?: string, color: string (required), position: number (required) } for create/update, { labelId: string } for addToCard/removeFromCard. Colors: muddy-grey, autumn-leafs, morning-sky, antique-blue, egg-yellow, desert-sand, dark-granite, fresh-salad, lagoon-blue, midnight-blue, light-orange, pumpkin-orange, light-concrete, sunny-grass, navy-blue, lilac-eyes, apricot-red, orange-peel, silver-glint, bright-moss, deep-ocean, summer-sky, berry-red, light-cocoa, grey-stone, tank-green, coral-green, sugar-plum, pink-tulip, shady-rust, wet-rock, wet-moss, turquoise-sea, lavender-fields, piggy-red, light-mud, gun-metal, modern-green, french-coast, sweet-lilac, red-burgundy, pirate-gold",
419
+ requiredFor: ["create", "update", "addToCard", "removeFromCard"],
420
+ properties: {
421
+ name: { type: "string", description: "Label name" },
422
+ color: { type: "string", description: "Label color (one of the listed colors)", required: true },
423
+ position: { type: "number", description: "Label position", required: true },
424
+ labelId: { type: "string", description: "Label ID (for addToCard/removeFromCard)" },
425
+ },
426
+ },
427
+ }),
428
+ };
429
+ /**
430
+ * Card Members tool - manages card memberships
431
+ */
432
+ export const cardMembersTool = {
433
+ name: "cardMembers",
434
+ description: "Manage user assignments on Planka cards.",
435
+ operations: {
436
+ add: {
437
+ method: "POST",
438
+ path: "/cards/{cardId}/card-memberships",
439
+ description: "Assign a user to a card",
440
+ },
441
+ remove: {
442
+ method: "DELETE",
443
+ path: "/cards/{cardId}/card-memberships/userId:{userId}",
444
+ description: "Remove a user from a card",
445
+ },
446
+ },
447
+ inputSchema: buildGroupedSchema(["add", "remove"], {
448
+ add: "Assign a user to a card",
449
+ remove: "Remove a user from a card",
450
+ }, {
451
+ id: {
452
+ description: "Card ID",
453
+ requiredFor: ["add", "remove"],
454
+ },
455
+ data: {
456
+ description: "Membership data: { userId: string }",
457
+ requiredFor: ["add", "remove"],
458
+ properties: {
459
+ userId: { type: "string", description: "User ID to assign/remove", required: true },
460
+ },
461
+ },
462
+ }),
463
+ };
464
+ /**
465
+ * Bootstrap tool - retrieves application initialization data
466
+ */
467
+ export const bootstrapTool = {
468
+ name: "bootstrap",
469
+ description: "Get Planka application bootstrap data including current user, projects, boards, and notifications.",
470
+ operations: {
471
+ get: {
472
+ method: "GET",
473
+ path: "/bootstrap",
474
+ description: "Get application bootstrap data",
475
+ },
476
+ },
477
+ inputSchema: {
478
+ type: "object",
479
+ properties: {
480
+ action: {
481
+ type: "string",
482
+ enum: ["get"],
483
+ description: "Action: 'get' - Retrieve bootstrap data",
484
+ },
485
+ },
486
+ required: ["action"],
487
+ },
488
+ };
489
+ /**
490
+ * Context tool - selects the working scope (project/board/list/card) so
491
+ * scoped tools default to it instead of repeating ids on every call.
492
+ */
493
+ export const contextTool = {
494
+ name: "context",
495
+ description: "Select the project/board/list/card to work inside. Once set, other tools " +
496
+ "use the scoped ids as defaults when their id/data arguments are omitted, " +
497
+ "so a session can stay inside one board without repeating ids. " +
498
+ "Setting a higher level clears the deeper ones (a new board resets the list).",
499
+ operations: {
500
+ set: {
501
+ method: "POST",
502
+ path: "/context/set",
503
+ requiresAuth: false,
504
+ description: "Set the working scope; returns the scope plus an overview of its contents",
505
+ },
506
+ get: {
507
+ method: "GET",
508
+ path: "/context/get",
509
+ requiresAuth: false,
510
+ description: "Read the current working scope",
511
+ },
512
+ clear: {
513
+ method: "POST",
514
+ path: "/context/clear",
515
+ requiresAuth: false,
516
+ description: "Reset the working scope",
517
+ },
518
+ },
519
+ inputSchema: buildGroupedSchema(["set", "get", "clear"], {
520
+ set: "Set the scope (any subset of projectId, boardId, listId, cardId)",
521
+ get: "Read the current scope",
522
+ clear: "Reset the scope",
523
+ }, {
524
+ data: {
525
+ description: "Scope fields to set: { projectId?, boardId?, listId?, cardId? }",
526
+ requiredFor: ["set"],
527
+ properties: {
528
+ projectId: { type: "string", description: "Project to work inside" },
529
+ boardId: { type: "string", description: "Board to work inside (within the project)" },
530
+ listId: { type: "string", description: "List to create cards in" },
531
+ cardId: { type: "string", description: "Card to operate on (comments, tasks)" },
532
+ },
533
+ },
534
+ }),
535
+ };
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Planka MCP Server - Grouped Tool Definitions
3
+ *
4
+ * This module exports all tool definitions organized by category:
5
+ * - Core: Essential Kanban operations (always enabled) - 10 tools
6
+ * - Admin: Administrative functions requiring admin privileges - 4 tools
7
+ * - Optional: Extended functionality for advanced use cases - 13 tools
8
+ *
9
+ * Total: 27 grouped tools covering 104 API operations
10
+ */
11
+ export type { GroupedToolDefinition, ToolOperation } from "./types.js";
12
+ export { buildGroupedSchema } from "./types.js";
13
+ export { coreTools } from "./core/index.js";
14
+ export { adminTools } from "./admin/index.js";
15
+ export { optionalTools } from "./optional/index.js";
16
+ import { GroupedToolDefinition } from "./types.js";
17
+ /**
18
+ * All tools combined (for reference/documentation)
19
+ */
20
+ export declare const allTools: GroupedToolDefinition[];
21
+ /**
22
+ * Configuration for tool categories
23
+ */
24
+ export interface ToolConfig {
25
+ enableAllTools?: boolean;
26
+ enableAdminTools?: boolean;
27
+ enableOptionalTools?: boolean;
28
+ }
29
+ /**
30
+ * Gets enabled tools based on configuration
31
+ */
32
+ export declare function getEnabledTools(config: ToolConfig): GroupedToolDefinition[];
33
+ /**
34
+ * Tool counts by category
35
+ */
36
+ export declare const toolCounts: {
37
+ core: number;
38
+ coreOperations: number;
39
+ admin: number;
40
+ adminOperations: number;
41
+ optional: number;
42
+ optionalOperations: number;
43
+ total: number;
44
+ totalOperations: number;
45
+ };
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Planka MCP Server - Grouped Tool Definitions
3
+ *
4
+ * This module exports all tool definitions organized by category:
5
+ * - Core: Essential Kanban operations (always enabled) - 10 tools
6
+ * - Admin: Administrative functions requiring admin privileges - 4 tools
7
+ * - Optional: Extended functionality for advanced use cases - 13 tools
8
+ *
9
+ * Total: 27 grouped tools covering 104 API operations
10
+ */
11
+ export { buildGroupedSchema } from "./types.js";
12
+ export { coreTools } from "./core/index.js";
13
+ export { adminTools } from "./admin/index.js";
14
+ export { optionalTools } from "./optional/index.js";
15
+ import { coreTools } from "./core/index.js";
16
+ import { adminTools } from "./admin/index.js";
17
+ import { optionalTools } from "./optional/index.js";
18
+ /**
19
+ * All tools combined (for reference/documentation)
20
+ */
21
+ export const allTools = [
22
+ ...coreTools,
23
+ ...adminTools,
24
+ ...optionalTools,
25
+ ];
26
+ /**
27
+ * Gets enabled tools based on configuration
28
+ */
29
+ export function getEnabledTools(config) {
30
+ const { enableAllTools, enableAdminTools, enableOptionalTools } = config;
31
+ if (enableAllTools) {
32
+ return allTools;
33
+ }
34
+ const tools = [...coreTools];
35
+ if (enableAdminTools) {
36
+ tools.push(...adminTools);
37
+ }
38
+ if (enableOptionalTools) {
39
+ tools.push(...optionalTools);
40
+ }
41
+ return tools;
42
+ }
43
+ /**
44
+ * Count operations in a tool
45
+ */
46
+ function countOperations(tools) {
47
+ return tools.reduce((sum, tool) => sum + Object.keys(tool.operations).length, 0);
48
+ }
49
+ /**
50
+ * Tool counts by category
51
+ */
52
+ export const toolCounts = {
53
+ core: coreTools.length,
54
+ coreOperations: countOperations(coreTools),
55
+ admin: adminTools.length,
56
+ adminOperations: countOperations(adminTools),
57
+ optional: optionalTools.length,
58
+ optionalOperations: countOperations(optionalTools),
59
+ total: allTools.length,
60
+ totalOperations: countOperations(allTools),
61
+ };
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Optional tools - Extended functionality (not essential for basic operations)
3
+ */
4
+ import { GroupedToolDefinition } from "../types.js";
5
+ import { actionsTool, attachmentsTool, boardMembersTool, customFieldsTool, notificationsTool, backgroundImagesTool, cardExtrasTool, commentExtrasTool, listExtrasTool, taskExtrasTool, labelExtrasTool, cardMemberExtrasTool, userInfoTool } from "./tools.js";
6
+ export { actionsTool, attachmentsTool, boardMembersTool, customFieldsTool, notificationsTool, backgroundImagesTool, cardExtrasTool, commentExtrasTool, listExtrasTool, taskExtrasTool, labelExtrasTool, cardMemberExtrasTool, userInfoTool, };
7
+ /**
8
+ * All optional tools combined
9
+ */
10
+ export declare const optionalTools: GroupedToolDefinition[];
@@ -0,0 +1,20 @@
1
+ import { actionsTool, attachmentsTool, boardMembersTool, customFieldsTool, notificationsTool, backgroundImagesTool, cardExtrasTool, commentExtrasTool, listExtrasTool, taskExtrasTool, labelExtrasTool, cardMemberExtrasTool, userInfoTool, } from "./tools.js";
2
+ export { actionsTool, attachmentsTool, boardMembersTool, customFieldsTool, notificationsTool, backgroundImagesTool, cardExtrasTool, commentExtrasTool, listExtrasTool, taskExtrasTool, labelExtrasTool, cardMemberExtrasTool, userInfoTool, };
3
+ /**
4
+ * All optional tools combined
5
+ */
6
+ export const optionalTools = [
7
+ actionsTool,
8
+ attachmentsTool,
9
+ boardMembersTool,
10
+ customFieldsTool,
11
+ notificationsTool,
12
+ backgroundImagesTool,
13
+ cardExtrasTool,
14
+ commentExtrasTool,
15
+ listExtrasTool,
16
+ taskExtrasTool,
17
+ labelExtrasTool,
18
+ cardMemberExtrasTool,
19
+ userInfoTool,
20
+ ];