@neilinger/businessmap-mcp 1.6.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 (175) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +563 -0
  3. package/dist/client/businessmap-client.d.ts +160 -0
  4. package/dist/client/businessmap-client.d.ts.map +1 -0
  5. package/dist/client/businessmap-client.js +325 -0
  6. package/dist/client/businessmap-client.js.map +1 -0
  7. package/dist/client/modules/base-client.d.ts +34 -0
  8. package/dist/client/modules/base-client.d.ts.map +1 -0
  9. package/dist/client/modules/base-client.js +20 -0
  10. package/dist/client/modules/base-client.js.map +1 -0
  11. package/dist/client/modules/board-client.d.ts +82 -0
  12. package/dist/client/modules/board-client.d.ts.map +1 -0
  13. package/dist/client/modules/board-client.js +137 -0
  14. package/dist/client/modules/board-client.js.map +1 -0
  15. package/dist/client/modules/card-client.d.ts +201 -0
  16. package/dist/client/modules/card-client.d.ts.map +1 -0
  17. package/dist/client/modules/card-client.js +251 -0
  18. package/dist/client/modules/card-client.js.map +1 -0
  19. package/dist/client/modules/custom-field-client.d.ts +62 -0
  20. package/dist/client/modules/custom-field-client.d.ts.map +1 -0
  21. package/dist/client/modules/custom-field-client.js +47 -0
  22. package/dist/client/modules/custom-field-client.js.map +1 -0
  23. package/dist/client/modules/index.d.ts +9 -0
  24. package/dist/client/modules/index.d.ts.map +1 -0
  25. package/dist/client/modules/index.js +9 -0
  26. package/dist/client/modules/index.js.map +1 -0
  27. package/dist/client/modules/user-client.d.ts +17 -0
  28. package/dist/client/modules/user-client.d.ts.map +1 -0
  29. package/dist/client/modules/user-client.js +25 -0
  30. package/dist/client/modules/user-client.js.map +1 -0
  31. package/dist/client/modules/utility-client.d.ts +12 -0
  32. package/dist/client/modules/utility-client.d.ts.map +1 -0
  33. package/dist/client/modules/utility-client.js +51 -0
  34. package/dist/client/modules/utility-client.js.map +1 -0
  35. package/dist/client/modules/workflow-client.d.ts +13 -0
  36. package/dist/client/modules/workflow-client.d.ts.map +1 -0
  37. package/dist/client/modules/workflow-client.js +18 -0
  38. package/dist/client/modules/workflow-client.js.map +1 -0
  39. package/dist/client/modules/workspace-client.d.ts +47 -0
  40. package/dist/client/modules/workspace-client.d.ts.map +1 -0
  41. package/dist/client/modules/workspace-client.js +88 -0
  42. package/dist/client/modules/workspace-client.js.map +1 -0
  43. package/dist/config/environment.d.ts +19 -0
  44. package/dist/config/environment.d.ts.map +1 -0
  45. package/dist/config/environment.js +65 -0
  46. package/dist/config/environment.js.map +1 -0
  47. package/dist/index.d.ts +3 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +84 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/schemas/board-schemas.d.ts +133 -0
  52. package/dist/schemas/board-schemas.d.ts.map +1 -0
  53. package/dist/schemas/board-schemas.js +95 -0
  54. package/dist/schemas/board-schemas.js.map +1 -0
  55. package/dist/schemas/bulk-schemas.d.ts +154 -0
  56. package/dist/schemas/bulk-schemas.d.ts.map +1 -0
  57. package/dist/schemas/bulk-schemas.js +69 -0
  58. package/dist/schemas/bulk-schemas.js.map +1 -0
  59. package/dist/schemas/card-schemas.d.ts +1309 -0
  60. package/dist/schemas/card-schemas.d.ts.map +1 -0
  61. package/dist/schemas/card-schemas.js +518 -0
  62. package/dist/schemas/card-schemas.js.map +1 -0
  63. package/dist/schemas/common-schemas.d.ts +47 -0
  64. package/dist/schemas/common-schemas.d.ts.map +1 -0
  65. package/dist/schemas/common-schemas.js +53 -0
  66. package/dist/schemas/common-schemas.js.map +1 -0
  67. package/dist/schemas/custom-field-schemas.d.ts +155 -0
  68. package/dist/schemas/custom-field-schemas.d.ts.map +1 -0
  69. package/dist/schemas/custom-field-schemas.js +78 -0
  70. package/dist/schemas/custom-field-schemas.js.map +1 -0
  71. package/dist/schemas/index.d.ts +9 -0
  72. package/dist/schemas/index.d.ts.map +1 -0
  73. package/dist/schemas/index.js +10 -0
  74. package/dist/schemas/index.js.map +1 -0
  75. package/dist/schemas/user-schemas.d.ts +11 -0
  76. package/dist/schemas/user-schemas.d.ts.map +1 -0
  77. package/dist/schemas/user-schemas.js +10 -0
  78. package/dist/schemas/user-schemas.js.map +1 -0
  79. package/dist/schemas/utility-schemas.d.ts +4 -0
  80. package/dist/schemas/utility-schemas.d.ts.map +1 -0
  81. package/dist/schemas/utility-schemas.js +6 -0
  82. package/dist/schemas/utility-schemas.js.map +1 -0
  83. package/dist/schemas/workflow-schemas.d.ts +22 -0
  84. package/dist/schemas/workflow-schemas.d.ts.map +1 -0
  85. package/dist/schemas/workflow-schemas.js +12 -0
  86. package/dist/schemas/workflow-schemas.js.map +1 -0
  87. package/dist/schemas/workspace-schemas.d.ts +40 -0
  88. package/dist/schemas/workspace-schemas.d.ts.map +1 -0
  89. package/dist/schemas/workspace-schemas.js +23 -0
  90. package/dist/schemas/workspace-schemas.js.map +1 -0
  91. package/dist/server/mcp-server.d.ts +14 -0
  92. package/dist/server/mcp-server.d.ts.map +1 -0
  93. package/dist/server/mcp-server.js +54 -0
  94. package/dist/server/mcp-server.js.map +1 -0
  95. package/dist/server/tools/base-tool.d.ts +34 -0
  96. package/dist/server/tools/base-tool.d.ts.map +1 -0
  97. package/dist/server/tools/base-tool.js +30 -0
  98. package/dist/server/tools/base-tool.js.map +1 -0
  99. package/dist/server/tools/board-tools.d.ts +25 -0
  100. package/dist/server/tools/board-tools.d.ts.map +1 -0
  101. package/dist/server/tools/board-tools.js +347 -0
  102. package/dist/server/tools/board-tools.js.map +1 -0
  103. package/dist/server/tools/card-tools.d.ts +33 -0
  104. package/dist/server/tools/card-tools.d.ts.map +1 -0
  105. package/dist/server/tools/card-tools.js +543 -0
  106. package/dist/server/tools/card-tools.js.map +1 -0
  107. package/dist/server/tools/custom-field-tools.d.ts +13 -0
  108. package/dist/server/tools/custom-field-tools.d.ts.map +1 -0
  109. package/dist/server/tools/custom-field-tools.js +181 -0
  110. package/dist/server/tools/custom-field-tools.js.map +1 -0
  111. package/dist/server/tools/index.d.ts +9 -0
  112. package/dist/server/tools/index.d.ts.map +1 -0
  113. package/dist/server/tools/index.js +9 -0
  114. package/dist/server/tools/index.js.map +1 -0
  115. package/dist/server/tools/user-tools.d.ts +10 -0
  116. package/dist/server/tools/user-tools.d.ts.map +1 -0
  117. package/dist/server/tools/user-tools.js +55 -0
  118. package/dist/server/tools/user-tools.js.map +1 -0
  119. package/dist/server/tools/utility-tools.d.ts +9 -0
  120. package/dist/server/tools/utility-tools.d.ts.map +1 -0
  121. package/dist/server/tools/utility-tools.js +46 -0
  122. package/dist/server/tools/utility-tools.js.map +1 -0
  123. package/dist/server/tools/workflow-tools.d.ts +9 -0
  124. package/dist/server/tools/workflow-tools.d.ts.map +1 -0
  125. package/dist/server/tools/workflow-tools.js +55 -0
  126. package/dist/server/tools/workflow-tools.js.map +1 -0
  127. package/dist/server/tools/workspace-tools.d.ts +14 -0
  128. package/dist/server/tools/workspace-tools.d.ts.map +1 -0
  129. package/dist/server/tools/workspace-tools.js +179 -0
  130. package/dist/server/tools/workspace-tools.js.map +1 -0
  131. package/dist/services/confirmation-builder.d.ts +60 -0
  132. package/dist/services/confirmation-builder.d.ts.map +1 -0
  133. package/dist/services/confirmation-builder.js +170 -0
  134. package/dist/services/confirmation-builder.js.map +1 -0
  135. package/dist/services/dependency-analyzer.d.ts +90 -0
  136. package/dist/services/dependency-analyzer.d.ts.map +1 -0
  137. package/dist/services/dependency-analyzer.js +220 -0
  138. package/dist/services/dependency-analyzer.js.map +1 -0
  139. package/dist/types/base.d.ts +22 -0
  140. package/dist/types/base.d.ts.map +1 -0
  141. package/dist/types/base.js +3 -0
  142. package/dist/types/base.js.map +1 -0
  143. package/dist/types/board.d.ts +129 -0
  144. package/dist/types/board.d.ts.map +1 -0
  145. package/dist/types/board.js +3 -0
  146. package/dist/types/board.js.map +1 -0
  147. package/dist/types/card.d.ts +414 -0
  148. package/dist/types/card.d.ts.map +1 -0
  149. package/dist/types/card.js +3 -0
  150. package/dist/types/card.js.map +1 -0
  151. package/dist/types/custom-field.d.ts +17 -0
  152. package/dist/types/custom-field.d.ts.map +1 -0
  153. package/dist/types/custom-field.js +3 -0
  154. package/dist/types/custom-field.js.map +1 -0
  155. package/dist/types/index.d.ts +9 -0
  156. package/dist/types/index.d.ts.map +1 -0
  157. package/dist/types/index.js +10 -0
  158. package/dist/types/index.js.map +1 -0
  159. package/dist/types/lane.d.ts +16 -0
  160. package/dist/types/lane.d.ts.map +1 -0
  161. package/dist/types/lane.js +3 -0
  162. package/dist/types/lane.js.map +1 -0
  163. package/dist/types/user.d.ts +32 -0
  164. package/dist/types/user.d.ts.map +1 -0
  165. package/dist/types/user.js +3 -0
  166. package/dist/types/user.js.map +1 -0
  167. package/dist/types/workflow.d.ts +8 -0
  168. package/dist/types/workflow.d.ts.map +1 -0
  169. package/dist/types/workflow.js +2 -0
  170. package/dist/types/workflow.js.map +1 -0
  171. package/dist/types/workspace.d.ts +11 -0
  172. package/dist/types/workspace.d.ts.map +1 -0
  173. package/dist/types/workspace.js +3 -0
  174. package/dist/types/workspace.js.map +1 -0
  175. package/package.json +84 -0
@@ -0,0 +1,181 @@
1
+ import { createErrorResponse, createSuccessResponse } from './base-tool.js';
2
+ import { createCustomFieldSchema, deleteCustomFieldSchema, getCustomFieldSchema, listBoardCustomFieldsSchema, listCustomFieldsSchema, updateCustomFieldSchema, } from '../../schemas/custom-field-schemas.js';
3
+ export class CustomFieldToolHandler {
4
+ registerTools(server, client, readOnlyMode) {
5
+ this.registerListCustomFields(server, client);
6
+ this.registerListBoardCustomFields(server, client);
7
+ this.registerGetCustomField(server, client);
8
+ if (!readOnlyMode) {
9
+ this.registerCreateCustomField(server, client);
10
+ this.registerUpdateCustomField(server, client);
11
+ this.registerDeleteCustomField(server, client);
12
+ }
13
+ }
14
+ registerListCustomFields(server, client) {
15
+ server.registerTool('list_custom_fields', {
16
+ title: 'List Custom Fields',
17
+ description: 'Retrieve a list of all custom field definitions with optional pagination and filtering',
18
+ inputSchema: listCustomFieldsSchema.shape,
19
+ }, async ({ page, page_size, field_type }) => {
20
+ try {
21
+ const customFields = await client.listCustomFields({ page, page_size, field_type });
22
+ return createSuccessResponse(customFields);
23
+ }
24
+ catch (error) {
25
+ return createErrorResponse(error, 'listing custom fields');
26
+ }
27
+ });
28
+ }
29
+ registerListBoardCustomFields(server, client) {
30
+ server.registerTool('list_board_custom_fields', {
31
+ title: 'List Board Custom Fields',
32
+ description: 'Retrieve all custom fields configured for a specific board',
33
+ inputSchema: listBoardCustomFieldsSchema.shape,
34
+ }, async ({ board_id }) => {
35
+ try {
36
+ const customFields = await client.listBoardCustomFields(board_id);
37
+ return createSuccessResponse(customFields);
38
+ }
39
+ catch (error) {
40
+ return createErrorResponse(error, 'listing board custom fields');
41
+ }
42
+ });
43
+ }
44
+ registerGetCustomField(server, client) {
45
+ server.registerTool('get_custom_field', {
46
+ title: 'Get Custom Field',
47
+ description: 'Get details of a specific custom field by ID',
48
+ inputSchema: getCustomFieldSchema.shape,
49
+ }, async ({ custom_field_id }) => {
50
+ try {
51
+ const customField = await client.getCustomField(custom_field_id);
52
+ return createSuccessResponse(customField);
53
+ }
54
+ catch (error) {
55
+ return createErrorResponse(error, 'fetching custom field');
56
+ }
57
+ });
58
+ }
59
+ registerCreateCustomField(server, client) {
60
+ server.registerTool('create_custom_field', {
61
+ title: 'Create Custom Field',
62
+ description: 'Create a new custom field definition for a board',
63
+ inputSchema: createCustomFieldSchema.shape,
64
+ }, async (params) => {
65
+ try {
66
+ const customField = await client.createCustomField(params);
67
+ return createSuccessResponse(customField, 'Custom field created successfully:');
68
+ }
69
+ catch (error) {
70
+ return createErrorResponse(error, 'creating custom field');
71
+ }
72
+ });
73
+ }
74
+ registerUpdateCustomField(server, client) {
75
+ server.registerTool('update_custom_field', {
76
+ title: 'Update Custom Field',
77
+ description: 'Update an existing custom field definition',
78
+ inputSchema: updateCustomFieldSchema.shape,
79
+ }, async ({ custom_field_id, ...params }) => {
80
+ try {
81
+ const customField = await client.updateCustomField(custom_field_id, params);
82
+ return createSuccessResponse(customField, 'Custom field updated successfully:');
83
+ }
84
+ catch (error) {
85
+ return createErrorResponse(error, 'updating custom field');
86
+ }
87
+ });
88
+ }
89
+ registerDeleteCustomField(server, client) {
90
+ server.registerTool('delete_custom_field', {
91
+ title: 'Delete Custom Field',
92
+ description: `Delete a custom field definition. This operation will:
93
+ 1. Analyze dependency impact (affected boards and cards)
94
+ 2. Prompt for explicit confirmation showing field name, board count, card count, and data loss warning
95
+ 3. Cascade delete to all card values only after user confirmation
96
+ 4. Return 403 error for insufficient permissions (requires workspace admin role)`,
97
+ inputSchema: deleteCustomFieldSchema.shape,
98
+ }, async ({ custom_field_id }) => {
99
+ try {
100
+ // Step 1: Pre-delete dependency analysis
101
+ const customField = await client.getCustomField(custom_field_id);
102
+ // Get boards using this custom field
103
+ const boards = await client.getBoards();
104
+ const affectedBoards = [];
105
+ for (const board of boards) {
106
+ if (!board.board_id)
107
+ continue;
108
+ const boardFields = await client.listBoardCustomFields(board.board_id);
109
+ if (boardFields.some((f) => f.field_id === custom_field_id)) {
110
+ affectedBoards.push(board);
111
+ }
112
+ }
113
+ // Estimate affected cards (this is an approximation)
114
+ let affectedCardCount = 0;
115
+ for (const board of affectedBoards) {
116
+ if (!board.board_id)
117
+ continue;
118
+ const cards = await client.getCards(board.board_id);
119
+ affectedCardCount += cards.length;
120
+ }
121
+ // Step 2: Build confirmation prompt
122
+ const confirmationMessage = `
123
+ ⚠️ DELETE CUSTOM FIELD CONFIRMATION ⚠️
124
+
125
+ Field Name: "${customField.name}"
126
+ Field Type: ${customField.type}
127
+ Affected Boards: ${affectedBoards.length}
128
+ Estimated Affected Cards: ${affectedCardCount}
129
+
130
+ ⚠️ DATA LOSS WARNING ⚠️
131
+ Deleting this custom field will permanently remove:
132
+ - The field definition from ${affectedBoards.length} board(s)
133
+ - All custom field values from approximately ${affectedCardCount} card(s)
134
+ - This action CANNOT be undone
135
+
136
+ Affected Boards:
137
+ ${affectedBoards.map((b) => ` - ${b.name} (ID: ${b.board_id})`).join('\n')}
138
+
139
+ To proceed with deletion, you must explicitly confirm this action.
140
+ Type 'DELETE' to confirm or any other response to cancel.
141
+ `;
142
+ return {
143
+ content: [
144
+ {
145
+ type: 'text',
146
+ text: confirmationMessage,
147
+ },
148
+ ],
149
+ isError: false,
150
+ _meta: {
151
+ requiresConfirmation: true,
152
+ confirmationKeyword: 'DELETE',
153
+ onConfirm: async () => {
154
+ try {
155
+ await client.deleteCustomField(custom_field_id);
156
+ return createSuccessResponse({
157
+ custom_field_id,
158
+ deleted_boards: affectedBoards.length,
159
+ deleted_cards: affectedCardCount,
160
+ }, 'Custom field deleted successfully:');
161
+ }
162
+ catch (deleteError) {
163
+ if (deleteError.response?.status === 403) {
164
+ return createErrorResponse(new Error('Insufficient permissions. Custom field definition management requires workspace admin role.'), 'deleting custom field');
165
+ }
166
+ return createErrorResponse(deleteError, 'deleting custom field');
167
+ }
168
+ },
169
+ },
170
+ };
171
+ }
172
+ catch (error) {
173
+ if (error.response?.status === 403) {
174
+ return createErrorResponse(new Error('Insufficient permissions. Custom field definition management requires workspace admin role.'), 'analyzing custom field for deletion');
175
+ }
176
+ return createErrorResponse(error, 'analyzing custom field for deletion');
177
+ }
178
+ });
179
+ }
180
+ }
181
+ //# sourceMappingURL=custom-field-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom-field-tools.js","sourceRoot":"","sources":["../../../src/server/tools/custom-field-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export { BaseToolHandler, createErrorResponse, createSuccessResponse } from './base-tool.js';
2
+ export { BoardToolHandler } from './board-tools.js';
3
+ export { CardToolHandler } from './card-tools.js';
4
+ export { CustomFieldToolHandler } from './custom-field-tools.js';
5
+ export { UserToolHandler } from './user-tools.js';
6
+ export { UtilityToolHandler } from './utility-tools.js';
7
+ export { WorkflowToolHandler } from './workflow-tools.js';
8
+ export { WorkspaceToolHandler } from './workspace-tools.js';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAC7F,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,9 @@
1
+ export { createErrorResponse, createSuccessResponse } from './base-tool.js';
2
+ export { BoardToolHandler } from './board-tools.js';
3
+ export { CardToolHandler } from './card-tools.js';
4
+ export { CustomFieldToolHandler } from './custom-field-tools.js';
5
+ export { UserToolHandler } from './user-tools.js';
6
+ export { UtilityToolHandler } from './utility-tools.js';
7
+ export { WorkflowToolHandler } from './workflow-tools.js';
8
+ export { WorkspaceToolHandler } from './workspace-tools.js';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/server/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAC7F,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { BusinessMapClient } from '../../client/businessmap-client.js';
3
+ import { BaseToolHandler } from './base-tool.js';
4
+ export declare class UserToolHandler implements BaseToolHandler {
5
+ registerTools(server: McpServer, client: BusinessMapClient, readOnlyMode: boolean): void;
6
+ private registerListUsers;
7
+ private registerGetUser;
8
+ private registerGetCurrentUser;
9
+ }
10
+ //# sourceMappingURL=user-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-tools.d.ts","sourceRoot":"","sources":["../../../src/server/tools/user-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAMvE,OAAO,EAAE,eAAe,EAA8C,MAAM,gBAAgB,CAAC;AAE7F,qBAAa,eAAgB,YAAW,eAAe;IACrD,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,iBAAiB,EAAE,YAAY,EAAE,OAAO,GAAG,IAAI;IAMxF,OAAO,CAAC,iBAAiB;IAmBzB,OAAO,CAAC,eAAe;IAmBvB,OAAO,CAAC,sBAAsB;CAkB/B"}
@@ -0,0 +1,55 @@
1
+ import { getCurrentUserSchema, getUserSchema, listUsersSchema, } from '../../schemas/user-schemas.js';
2
+ import { createErrorResponse, createSuccessResponse } from './base-tool.js';
3
+ export class UserToolHandler {
4
+ registerTools(server, client, readOnlyMode) {
5
+ this.registerListUsers(server, client);
6
+ this.registerGetUser(server, client);
7
+ this.registerGetCurrentUser(server, client);
8
+ }
9
+ registerListUsers(server, client) {
10
+ server.registerTool('list_users', {
11
+ title: 'List Users',
12
+ description: 'Get a list of all users',
13
+ inputSchema: listUsersSchema.shape,
14
+ }, async () => {
15
+ try {
16
+ const users = await client.getUsers();
17
+ return createSuccessResponse(users);
18
+ }
19
+ catch (error) {
20
+ return createErrorResponse(error, 'fetching users');
21
+ }
22
+ });
23
+ }
24
+ registerGetUser(server, client) {
25
+ server.registerTool('get_user', {
26
+ title: 'Get User',
27
+ description: 'Get details of a specific user',
28
+ inputSchema: getUserSchema.shape,
29
+ }, async ({ user_id }) => {
30
+ try {
31
+ const user = await client.getUser(user_id);
32
+ return createSuccessResponse(user);
33
+ }
34
+ catch (error) {
35
+ return createErrorResponse(error, 'fetching user');
36
+ }
37
+ });
38
+ }
39
+ registerGetCurrentUser(server, client) {
40
+ server.registerTool('get_current_user', {
41
+ title: 'Get Current User',
42
+ description: 'Get details of the current logged user',
43
+ inputSchema: getCurrentUserSchema.shape,
44
+ }, async () => {
45
+ try {
46
+ const currentUser = await client.getCurrentUser();
47
+ return createSuccessResponse(currentUser);
48
+ }
49
+ catch (error) {
50
+ return createErrorResponse(error, 'fetching current user');
51
+ }
52
+ });
53
+ }
54
+ }
55
+ //# sourceMappingURL=user-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-tools.js","sourceRoot":"","sources":["../../../src/server/tools/user-tools.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,oBAAoB,EACpB,aAAa,EACb,eAAe,GAChB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAmB,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAE7F,MAAM,OAAO,eAAe;IAC1B,aAAa,CAAC,MAAiB,EAAE,MAAyB,EAAE,YAAqB;QAC/E,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACvC,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACrC,IAAI,CAAC,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9C,CAAC;IAEO,iBAAiB,CAAC,MAAiB,EAAE,MAAyB;QACpE,MAAM,CAAC,YAAY,CACjB,YAAY,EACZ;YACE,KAAK,EAAE,YAAY;YACnB,WAAW,EAAE,yBAAyB;YACtC,WAAW,EAAE,eAAe,CAAC,KAAK;SACnC,EACD,KAAK,IAAI,EAAE;YACT,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACtC,OAAO,qBAAqB,CAAC,KAAK,CAAC,CAAC;YACtC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,mBAAmB,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;YACtD,CAAC;QACH,CAAC,CACF,CAAC;IACJ,CAAC;IAEO,eAAe,CAAC,MAAiB,EAAE,MAAyB;QAClE,MAAM,CAAC,YAAY,CACjB,UAAU,EACV;YACE,KAAK,EAAE,UAAU;YACjB,WAAW,EAAE,gCAAgC;YAC7C,WAAW,EAAE,aAAa,CAAC,KAAK;SACjC,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;YACpB,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gBAC3C,OAAO,qBAAqB,CAAC,IAAI,CAAC,CAAC;YACrC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,mBAAmB,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;YACrD,CAAC;QACH,CAAC,CACF,CAAC;IACJ,CAAC;IAEO,sBAAsB,CAAC,MAAiB,EAAE,MAAyB;QACzE,MAAM,CAAC,YAAY,CACjB,kBAAkB,EAClB;YACE,KAAK,EAAE,kBAAkB;YACzB,WAAW,EAAE,wCAAwC;YACrD,WAAW,EAAE,oBAAoB,CAAC,KAAK;SACxC,EACD,KAAK,IAAI,EAAE;YACT,IAAI,CAAC;gBACH,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,cAAc,EAAE,CAAC;gBAClD,OAAO,qBAAqB,CAAC,WAAW,CAAC,CAAC;YAC5C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,mBAAmB,CAAC,KAAK,EAAE,uBAAuB,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC,CACF,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,9 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { BusinessMapClient } from '../../client/businessmap-client.js';
3
+ import { BaseToolHandler } from './base-tool.js';
4
+ export declare class UtilityToolHandler implements BaseToolHandler {
5
+ registerTools(server: McpServer, client: BusinessMapClient, readOnlyMode: boolean): void;
6
+ private registerHealthCheck;
7
+ private registerGetApiInfo;
8
+ }
9
+ //# sourceMappingURL=utility-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utility-tools.d.ts","sourceRoot":"","sources":["../../../src/server/tools/utility-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAEvE,OAAO,EAAE,eAAe,EAA8C,MAAM,gBAAgB,CAAC;AAE7F,qBAAa,kBAAmB,YAAW,eAAe;IACxD,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,iBAAiB,EAAE,YAAY,EAAE,OAAO,GAAG,IAAI;IAKxF,OAAO,CAAC,mBAAmB;IA0B3B,OAAO,CAAC,kBAAkB;CAmB3B"}
@@ -0,0 +1,46 @@
1
+ import { getApiInfoSchema, healthCheckSchema } from '../../schemas/utility-schemas.js';
2
+ import { createErrorResponse, createSuccessResponse } from './base-tool.js';
3
+ export class UtilityToolHandler {
4
+ registerTools(server, client, readOnlyMode) {
5
+ this.registerHealthCheck(server, client);
6
+ this.registerGetApiInfo(server, client);
7
+ }
8
+ registerHealthCheck(server, client) {
9
+ server.registerTool('health_check', {
10
+ title: 'Health Check',
11
+ description: 'Check the connection to BusinessMap API',
12
+ inputSchema: healthCheckSchema.shape,
13
+ }, async () => {
14
+ try {
15
+ const isHealthy = await client.healthCheck();
16
+ return {
17
+ content: [
18
+ {
19
+ type: 'text',
20
+ text: `BusinessMap API Health: ${isHealthy ? 'Healthy' : 'Unhealthy'}`,
21
+ },
22
+ ],
23
+ };
24
+ }
25
+ catch (error) {
26
+ return createErrorResponse(error, 'health check failed');
27
+ }
28
+ });
29
+ }
30
+ registerGetApiInfo(server, client) {
31
+ server.registerTool('get_api_info', {
32
+ title: 'Get API Info',
33
+ description: 'Get information about the BusinessMap API (nota: endpoint /info não existe na API oficial)',
34
+ inputSchema: getApiInfoSchema.shape,
35
+ }, async () => {
36
+ try {
37
+ const apiInfo = await client.getApiInfo();
38
+ return createSuccessResponse(apiInfo);
39
+ }
40
+ catch (error) {
41
+ return createErrorResponse(error, 'fetching API info');
42
+ }
43
+ });
44
+ }
45
+ }
46
+ //# sourceMappingURL=utility-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utility-tools.js","sourceRoot":"","sources":["../../../src/server/tools/utility-tools.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACvF,OAAO,EAAmB,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAE7F,MAAM,OAAO,kBAAkB;IAC7B,aAAa,CAAC,MAAiB,EAAE,MAAyB,EAAE,YAAqB;QAC/E,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACzC,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,CAAC;IAEO,mBAAmB,CAAC,MAAiB,EAAE,MAAyB;QACtE,MAAM,CAAC,YAAY,CACjB,cAAc,EACd;YACE,KAAK,EAAE,cAAc;YACrB,WAAW,EAAE,yCAAyC;YACtD,WAAW,EAAE,iBAAiB,CAAC,KAAK;SACrC,EACD,KAAK,IAAI,EAAE;YACT,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;gBAC7C,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,2BAA2B,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,EAAE;yBACvE;qBACF;iBACF,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,mBAAmB,CAAC,KAAK,EAAE,qBAAqB,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC,CACF,CAAC;IACJ,CAAC;IAEO,kBAAkB,CAAC,MAAiB,EAAE,MAAyB;QACrE,MAAM,CAAC,YAAY,CACjB,cAAc,EACd;YACE,KAAK,EAAE,cAAc;YACrB,WAAW,EACT,4FAA4F;YAC9F,WAAW,EAAE,gBAAgB,CAAC,KAAK;SACpC,EACD,KAAK,IAAI,EAAE;YACT,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;gBAC1C,OAAO,qBAAqB,CAAC,OAAO,CAAC,CAAC;YACxC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,mBAAmB,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAC;YACzD,CAAC;QACH,CAAC,CACF,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,9 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { BusinessMapClient } from '../../client/businessmap-client.js';
3
+ import { BaseToolHandler } from './base-tool.js';
4
+ export declare class WorkflowToolHandler implements BaseToolHandler {
5
+ registerTools(server: McpServer, client: BusinessMapClient, readOnlyMode: boolean): void;
6
+ private registerGetWorkflowCycleTimeColumns;
7
+ private registerGetWorkflowEffectiveCycleTimeColumns;
8
+ }
9
+ //# sourceMappingURL=workflow-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-tools.d.ts","sourceRoot":"","sources":["../../../src/server/tools/workflow-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAEvE,OAAO,EAAE,eAAe,EAA8C,MAAM,gBAAgB,CAAC;AAI7F,qBAAa,mBAAoB,YAAW,eAAe;IACzD,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,iBAAiB,EAAE,YAAY,EAAE,OAAO,GAAG,IAAI;IAKxF,OAAO,CAAC,mCAAmC;IAmB3C,OAAO,CAAC,4CAA4C;CAuCrD"}
@@ -0,0 +1,55 @@
1
+ import { createLoggerSync } from '@toolprint/mcp-logger';
2
+ import { getWorkflowCycleTimeColumnsSchema } from '../../schemas/workflow-schemas.js';
3
+ import { createErrorResponse, createSuccessResponse } from './base-tool.js';
4
+ const logger = createLoggerSync({ level: 'debug' });
5
+ export class WorkflowToolHandler {
6
+ registerTools(server, client, readOnlyMode) {
7
+ this.registerGetWorkflowCycleTimeColumns(server, client);
8
+ this.registerGetWorkflowEffectiveCycleTimeColumns(server, client);
9
+ }
10
+ registerGetWorkflowCycleTimeColumns(server, client) {
11
+ server.registerTool('get_workflow_cycle_time_columns', {
12
+ title: 'Get Workflow Cycle Time Columns',
13
+ description: "Get workflow's cycle time columns",
14
+ inputSchema: getWorkflowCycleTimeColumnsSchema.shape,
15
+ }, async ({ board_id, workflow_id }) => {
16
+ try {
17
+ const columns = await client.getWorkflowCycleTimeColumns(board_id, workflow_id);
18
+ return createSuccessResponse(columns);
19
+ }
20
+ catch (error) {
21
+ return createErrorResponse(error, 'fetching workflow cycle time columns');
22
+ }
23
+ });
24
+ }
25
+ registerGetWorkflowEffectiveCycleTimeColumns(server, client) {
26
+ server.registerTool('get_workflow_effective_cycle_time_columns', {
27
+ title: 'Get Workflow Effective Cycle Time Columns',
28
+ description: "Get workflow's effective cycle time columns (the columns actually used for cycle time calculation with applied filters/logic)",
29
+ inputSchema: getWorkflowCycleTimeColumnsSchema.shape,
30
+ }, async ({ board_id, workflow_id }) => {
31
+ try {
32
+ logger.debug('Fetching effective cycle time columns', {
33
+ boardId: board_id,
34
+ workflowId: workflow_id
35
+ });
36
+ const columns = await client.getWorkflowEffectiveCycleTimeColumns(board_id, workflow_id);
37
+ logger.debug('Received effective cycle time columns', {
38
+ count: columns.length,
39
+ boardId: board_id,
40
+ workflowId: workflow_id
41
+ });
42
+ return createSuccessResponse(columns, `Retrieved ${columns.length} effective cycle time columns for board ${board_id}, workflow ${workflow_id}`);
43
+ }
44
+ catch (error) {
45
+ logger.error('Error fetching effective cycle time columns', {
46
+ boardId: board_id,
47
+ workflowId: workflow_id,
48
+ error: error instanceof Error ? error.message : 'Unknown error'
49
+ });
50
+ return createErrorResponse(error, 'fetching workflow effective cycle time columns');
51
+ }
52
+ });
53
+ }
54
+ }
55
+ //# sourceMappingURL=workflow-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-tools.js","sourceRoot":"","sources":["../../../src/server/tools/workflow-tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,EAAE,iCAAiC,EAAE,MAAM,mCAAmC,CAAC;AACtF,OAAO,EAAmB,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAE7F,MAAM,MAAM,GAAG,gBAAgB,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;AAEpD,MAAM,OAAO,mBAAmB;IAC9B,aAAa,CAAC,MAAiB,EAAE,MAAyB,EAAE,YAAqB;QAC/E,IAAI,CAAC,mCAAmC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACzD,IAAI,CAAC,4CAA4C,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpE,CAAC;IAEO,mCAAmC,CAAC,MAAiB,EAAE,MAAyB;QACtF,MAAM,CAAC,YAAY,CACjB,iCAAiC,EACjC;YACE,KAAK,EAAE,iCAAiC;YACxC,WAAW,EAAE,mCAAmC;YAChD,WAAW,EAAE,iCAAiC,CAAC,KAAK;SACrD,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,EAAE;YAClC,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;gBAChF,OAAO,qBAAqB,CAAC,OAAO,CAAC,CAAC;YACxC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,mBAAmB,CAAC,KAAK,EAAE,sCAAsC,CAAC,CAAC;YAC5E,CAAC;QACH,CAAC,CACF,CAAC;IACJ,CAAC;IAEO,4CAA4C,CAClD,MAAiB,EACjB,MAAyB;QAEzB,MAAM,CAAC,YAAY,CACjB,2CAA2C,EAC3C;YACE,KAAK,EAAE,2CAA2C;YAClD,WAAW,EACT,+HAA+H;YACjI,WAAW,EAAE,iCAAiC,CAAC,KAAK;SACrD,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,EAAE;YAClC,IAAI,CAAC;gBACH,MAAM,CAAC,KAAK,CAAC,uCAAuC,EAAE;oBACpD,OAAO,EAAE,QAAQ;oBACjB,UAAU,EAAE,WAAW;iBACxB,CAAC,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,oCAAoC,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;gBACzF,MAAM,CAAC,KAAK,CAAC,uCAAuC,EAAE;oBACpD,KAAK,EAAE,OAAO,CAAC,MAAM;oBACrB,OAAO,EAAE,QAAQ;oBACjB,UAAU,EAAE,WAAW;iBACxB,CAAC,CAAC;gBACH,OAAO,qBAAqB,CAC1B,OAAO,EACP,aAAa,OAAO,CAAC,MAAM,2CAA2C,QAAQ,cAAc,WAAW,EAAE,CAC1G,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,KAAK,CAAC,6CAA6C,EAAE;oBAC1D,OAAO,EAAE,QAAQ;oBACjB,UAAU,EAAE,WAAW;oBACvB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;iBAChE,CAAC,CAAC;gBACH,OAAO,mBAAmB,CAAC,KAAK,EAAE,gDAAgD,CAAC,CAAC;YACtF,CAAC;QACH,CAAC,CACF,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,14 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { BusinessMapClient } from '../../client/businessmap-client.js';
3
+ import { BaseToolHandler } from './base-tool.js';
4
+ export declare class WorkspaceToolHandler implements BaseToolHandler {
5
+ registerTools(server: McpServer, client: BusinessMapClient, readOnlyMode: boolean): void;
6
+ private registerListWorkspaces;
7
+ private registerGetWorkspace;
8
+ private registerCreateWorkspace;
9
+ private registerUpdateWorkspace;
10
+ private registerArchiveWorkspace;
11
+ private registerBulkArchiveWorkspaces;
12
+ private registerBulkUpdateWorkspaces;
13
+ }
14
+ //# sourceMappingURL=workspace-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-tools.d.ts","sourceRoot":"","sources":["../../../src/server/tools/workspace-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAcvE,OAAO,EAAE,eAAe,EAA8C,MAAM,gBAAgB,CAAC;AAE7F,qBAAa,oBAAqB,YAAW,eAAe;IAC1D,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,iBAAiB,EAAE,YAAY,EAAE,OAAO,GAAG,IAAI;IAaxF,OAAO,CAAC,sBAAsB;IAmB9B,OAAO,CAAC,oBAAoB;IAmB5B,OAAO,CAAC,uBAAuB;IAoB/B,OAAO,CAAC,uBAAuB;IAmB/B,OAAO,CAAC,wBAAwB;IAuBhC,OAAO,CAAC,6BAA6B;IAyErC,OAAO,CAAC,4BAA4B;CAgDrC"}
@@ -0,0 +1,179 @@
1
+ import { archiveWorkspaceSchema, createWorkspaceSchema, getWorkspaceSchema, listWorkspacesSchema, updateWorkspaceSchema, } from '../../schemas/workspace-schemas.js';
2
+ import { bulkArchiveWorkspacesSchema, bulkUpdateWorkspacesSchema, } from '../../schemas/bulk-schemas.js';
3
+ import { DependencyAnalyzer } from '../../services/dependency-analyzer.js';
4
+ import { ConfirmationBuilder } from '../../services/confirmation-builder.js';
5
+ import { createErrorResponse, createSuccessResponse } from './base-tool.js';
6
+ export class WorkspaceToolHandler {
7
+ registerTools(server, client, readOnlyMode) {
8
+ this.registerListWorkspaces(server, client);
9
+ this.registerGetWorkspace(server, client);
10
+ if (!readOnlyMode) {
11
+ this.registerCreateWorkspace(server, client);
12
+ this.registerUpdateWorkspace(server, client);
13
+ this.registerArchiveWorkspace(server, client);
14
+ this.registerBulkArchiveWorkspaces(server, client);
15
+ this.registerBulkUpdateWorkspaces(server, client);
16
+ }
17
+ }
18
+ registerListWorkspaces(server, client) {
19
+ server.registerTool('list_workspaces', {
20
+ title: 'List Workspaces',
21
+ description: 'Get a list of all workspaces',
22
+ inputSchema: listWorkspacesSchema.shape,
23
+ }, async () => {
24
+ try {
25
+ const workspaces = await client.getWorkspaces();
26
+ return createSuccessResponse(workspaces);
27
+ }
28
+ catch (error) {
29
+ return createErrorResponse(error, 'fetching workspaces');
30
+ }
31
+ });
32
+ }
33
+ registerGetWorkspace(server, client) {
34
+ server.registerTool('get_workspace', {
35
+ title: 'Get Workspace',
36
+ description: 'Get details of a specific workspace',
37
+ inputSchema: getWorkspaceSchema.shape,
38
+ }, async ({ workspace_id }) => {
39
+ try {
40
+ const workspace = await client.getWorkspace(workspace_id);
41
+ return createSuccessResponse(workspace);
42
+ }
43
+ catch (error) {
44
+ return createErrorResponse(error, 'fetching workspace');
45
+ }
46
+ });
47
+ }
48
+ registerCreateWorkspace(server, client) {
49
+ server.registerTool('create_workspace', {
50
+ title: 'Create Workspace',
51
+ description: 'Create a new workspace',
52
+ inputSchema: createWorkspaceSchema.shape,
53
+ }, async ({ name, description }) => {
54
+ try {
55
+ const workspace = await client.createWorkspace({ name, description });
56
+ return createSuccessResponse(workspace, 'Workspace created successfully:');
57
+ }
58
+ catch (error) {
59
+ return createErrorResponse(error, 'creating workspace');
60
+ }
61
+ });
62
+ }
63
+ registerUpdateWorkspace(server, client) {
64
+ server.registerTool('update_workspace', {
65
+ title: 'Update Workspace',
66
+ description: 'Update an existing workspace',
67
+ inputSchema: updateWorkspaceSchema.shape,
68
+ }, async ({ workspace_id, name, description }) => {
69
+ try {
70
+ const workspace = await client.updateWorkspace(workspace_id, { name, description });
71
+ return createSuccessResponse(workspace, 'Workspace updated successfully:');
72
+ }
73
+ catch (error) {
74
+ return createErrorResponse(error, 'updating workspace');
75
+ }
76
+ });
77
+ }
78
+ registerArchiveWorkspace(server, client) {
79
+ server.registerTool('archive_workspace', {
80
+ title: 'Archive Workspace',
81
+ description: 'Archive a workspace (soft delete). The API does not support permanent deletion (DELETE returns 405). Only archiving via PATCH is available.',
82
+ inputSchema: archiveWorkspaceSchema.shape,
83
+ }, async ({ workspace_id }) => {
84
+ try {
85
+ const workspace = await client.archiveWorkspace(workspace_id);
86
+ return createSuccessResponse(workspace, 'Workspace archived successfully:');
87
+ }
88
+ catch (error) {
89
+ return createErrorResponse(error, 'archiving workspace');
90
+ }
91
+ });
92
+ }
93
+ registerBulkArchiveWorkspaces(server, client) {
94
+ server.registerTool('bulk_archive_workspaces', {
95
+ title: 'Bulk Archive Workspaces',
96
+ description: 'Archive multiple workspaces with dependency analysis and consolidated confirmation. Maximum 50 workspaces per request.',
97
+ inputSchema: bulkArchiveWorkspacesSchema.shape,
98
+ }, async ({ resource_ids, analyze_dependencies = true }) => {
99
+ try {
100
+ const analyzer = new DependencyAnalyzer(client);
101
+ const confirmationBuilder = new ConfirmationBuilder();
102
+ // Analyze dependencies if requested
103
+ if (analyze_dependencies) {
104
+ const analysis = await analyzer.analyzeWorkspaces(resource_ids);
105
+ const confirmation = confirmationBuilder.buildConfirmation(analysis);
106
+ if (confirmation && confirmation.hasConfirmation) {
107
+ // Return confirmation message for user approval
108
+ return createSuccessResponse({
109
+ requires_confirmation: true,
110
+ confirmation_message: confirmation.message,
111
+ resources_with_dependencies: confirmation.resourcesWithDeps.length,
112
+ resources_without_dependencies: confirmation.resourcesWithoutDeps.length,
113
+ total_impact: confirmation.totalImpact,
114
+ }, 'Confirmation required before archiving:');
115
+ }
116
+ }
117
+ // Execute bulk archive
118
+ const results = await client.bulkArchiveWorkspaces(resource_ids);
119
+ const successes = results.filter((r) => r.success);
120
+ const failures = results.filter((r) => !r.success);
121
+ if (failures.length === 0) {
122
+ // All successful
123
+ const workspaces = successes.map((s) => ({
124
+ id: s.id,
125
+ name: s.workspace?.name || `Workspace ${s.id}`
126
+ }));
127
+ const message = confirmationBuilder.formatSimpleSuccess('workspace', successes.length, workspaces);
128
+ return createSuccessResponse({ archived: successes.length, results }, message);
129
+ }
130
+ else if (successes.length > 0) {
131
+ // Partial success
132
+ const message = confirmationBuilder.formatPartialSuccess('workspace', successes.map((s) => ({ id: s.id, name: s.workspace?.name || `Workspace ${s.id}` })), failures.map((f) => ({ id: f.id, name: `Workspace ${f.id}`, error: f.error || 'Unknown error' })));
133
+ return createSuccessResponse({ successful: successes.length, failed: failures.length, results }, message);
134
+ }
135
+ else {
136
+ // All failed
137
+ return createErrorResponse(new Error(`All ${failures.length} archiving operations failed`), 'bulk archiving workspaces');
138
+ }
139
+ }
140
+ catch (error) {
141
+ return createErrorResponse(error, 'bulk archiving workspaces');
142
+ }
143
+ });
144
+ }
145
+ registerBulkUpdateWorkspaces(server, client) {
146
+ server.registerTool('bulk_update_workspaces', {
147
+ title: 'Bulk Update Workspaces',
148
+ description: 'Update multiple workspaces with the same changes. Maximum 50 workspaces per request.',
149
+ inputSchema: bulkUpdateWorkspacesSchema,
150
+ }, async (params) => {
151
+ const { resource_ids, name, description } = params;
152
+ try {
153
+ const updates = {};
154
+ if (name !== undefined)
155
+ updates.name = name;
156
+ if (description !== undefined)
157
+ updates.description = description;
158
+ const results = await client.bulkUpdateWorkspaces(resource_ids, updates);
159
+ const successes = results.filter((r) => r.success);
160
+ const failures = results.filter((r) => !r.success);
161
+ if (failures.length === 0) {
162
+ return createSuccessResponse({ updated: successes.length, workspaces: successes.map((s) => s.workspace) }, `✓ Successfully updated ${successes.length} workspace${successes.length > 1 ? 's' : ''}`);
163
+ }
164
+ else if (successes.length > 0) {
165
+ const confirmationBuilder = new ConfirmationBuilder();
166
+ const message = confirmationBuilder.formatPartialSuccess('workspace', successes.map((s) => ({ id: s.id, name: s.workspace?.name || `Workspace ${s.id}` })), failures.map((f) => ({ id: f.id, name: `Workspace ${f.id}`, error: f.error || 'Unknown error' })));
167
+ return createSuccessResponse({ successful: successes.length, failed: failures.length, results }, message);
168
+ }
169
+ else {
170
+ return createErrorResponse(new Error(`All ${failures.length} updates failed`), 'bulk updating workspaces');
171
+ }
172
+ }
173
+ catch (error) {
174
+ return createErrorResponse(error, 'bulk updating workspaces');
175
+ }
176
+ });
177
+ }
178
+ }
179
+ //# sourceMappingURL=workspace-tools.js.map