@brxce/mcp-server 1.0.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 (106) hide show
  1. package/README.md +220 -0
  2. package/dist/config/environment.d.ts +8 -0
  3. package/dist/config/environment.d.ts.map +1 -0
  4. package/dist/config/environment.js +16 -0
  5. package/dist/config/environment.js.map +1 -0
  6. package/dist/index.d.ts +3 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +167 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/prompts/worknode-prompts.d.ts +7 -0
  11. package/dist/prompts/worknode-prompts.d.ts.map +1 -0
  12. package/dist/prompts/worknode-prompts.js +369 -0
  13. package/dist/prompts/worknode-prompts.js.map +1 -0
  14. package/dist/prompts/workspace-context-prompt.d.ts +4 -0
  15. package/dist/prompts/workspace-context-prompt.d.ts.map +1 -0
  16. package/dist/prompts/workspace-context-prompt.js +101 -0
  17. package/dist/prompts/workspace-context-prompt.js.map +1 -0
  18. package/dist/resources/user-resource.d.ts +4 -0
  19. package/dist/resources/user-resource.d.ts.map +1 -0
  20. package/dist/resources/user-resource.js +40 -0
  21. package/dist/resources/user-resource.js.map +1 -0
  22. package/dist/resources/workspace-members-resource.d.ts +4 -0
  23. package/dist/resources/workspace-members-resource.d.ts.map +1 -0
  24. package/dist/resources/workspace-members-resource.js +39 -0
  25. package/dist/resources/workspace-members-resource.js.map +1 -0
  26. package/dist/resources/workspace-resource.d.ts +4 -0
  27. package/dist/resources/workspace-resource.d.ts.map +1 -0
  28. package/dist/resources/workspace-resource.js +27 -0
  29. package/dist/resources/workspace-resource.js.map +1 -0
  30. package/dist/services/api-client.d.ts +17 -0
  31. package/dist/services/api-client.d.ts.map +1 -0
  32. package/dist/services/api-client.js +118 -0
  33. package/dist/services/api-client.js.map +1 -0
  34. package/dist/tools/meeting-agenda-tool.d.ts +7 -0
  35. package/dist/tools/meeting-agenda-tool.d.ts.map +1 -0
  36. package/dist/tools/meeting-agenda-tool.js +452 -0
  37. package/dist/tools/meeting-agenda-tool.js.map +1 -0
  38. package/dist/tools/meeting-create-tool.d.ts +8 -0
  39. package/dist/tools/meeting-create-tool.d.ts.map +1 -0
  40. package/dist/tools/meeting-create-tool.js +309 -0
  41. package/dist/tools/meeting-create-tool.js.map +1 -0
  42. package/dist/tools/meeting-decisions-tool.d.ts +7 -0
  43. package/dist/tools/meeting-decisions-tool.d.ts.map +1 -0
  44. package/dist/tools/meeting-decisions-tool.js +431 -0
  45. package/dist/tools/meeting-decisions-tool.js.map +1 -0
  46. package/dist/tools/meeting-list-tool.d.ts +7 -0
  47. package/dist/tools/meeting-list-tool.d.ts.map +1 -0
  48. package/dist/tools/meeting-list-tool.js +305 -0
  49. package/dist/tools/meeting-list-tool.js.map +1 -0
  50. package/dist/tools/meeting-notes-tool.d.ts +7 -0
  51. package/dist/tools/meeting-notes-tool.d.ts.map +1 -0
  52. package/dist/tools/meeting-notes-tool.js +318 -0
  53. package/dist/tools/meeting-notes-tool.js.map +1 -0
  54. package/dist/tools/meeting-update-tool.d.ts +7 -0
  55. package/dist/tools/meeting-update-tool.d.ts.map +1 -0
  56. package/dist/tools/meeting-update-tool.js +310 -0
  57. package/dist/tools/meeting-update-tool.js.map +1 -0
  58. package/dist/tools/tag-category-tool.d.ts +4 -0
  59. package/dist/tools/tag-category-tool.d.ts.map +1 -0
  60. package/dist/tools/tag-category-tool.js +293 -0
  61. package/dist/tools/tag-category-tool.js.map +1 -0
  62. package/dist/tools/tag-search-tool.d.ts +4 -0
  63. package/dist/tools/tag-search-tool.d.ts.map +1 -0
  64. package/dist/tools/tag-search-tool.js +358 -0
  65. package/dist/tools/tag-search-tool.js.map +1 -0
  66. package/dist/tools/tag-tool.d.ts +4 -0
  67. package/dist/tools/tag-tool.d.ts.map +1 -0
  68. package/dist/tools/tag-tool.js +450 -0
  69. package/dist/tools/tag-tool.js.map +1 -0
  70. package/dist/tools/worknode-archive-tool.d.ts +7 -0
  71. package/dist/tools/worknode-archive-tool.d.ts.map +1 -0
  72. package/dist/tools/worknode-archive-tool.js +163 -0
  73. package/dist/tools/worknode-archive-tool.js.map +1 -0
  74. package/dist/tools/worknode-create-tool.d.ts +4 -0
  75. package/dist/tools/worknode-create-tool.d.ts.map +1 -0
  76. package/dist/tools/worknode-create-tool.js +382 -0
  77. package/dist/tools/worknode-create-tool.js.map +1 -0
  78. package/dist/tools/worknode-my-work-tool.d.ts +8 -0
  79. package/dist/tools/worknode-my-work-tool.d.ts.map +1 -0
  80. package/dist/tools/worknode-my-work-tool.js +302 -0
  81. package/dist/tools/worknode-my-work-tool.js.map +1 -0
  82. package/dist/tools/worknode-search-tool.d.ts +4 -0
  83. package/dist/tools/worknode-search-tool.d.ts.map +1 -0
  84. package/dist/tools/worknode-search-tool.js +289 -0
  85. package/dist/tools/worknode-search-tool.js.map +1 -0
  86. package/dist/tools/worknode-subtree-tool.d.ts +4 -0
  87. package/dist/tools/worknode-subtree-tool.d.ts.map +1 -0
  88. package/dist/tools/worknode-subtree-tool.js +175 -0
  89. package/dist/tools/worknode-subtree-tool.js.map +1 -0
  90. package/dist/tools/worknode-tag-tool.d.ts +4 -0
  91. package/dist/tools/worknode-tag-tool.d.ts.map +1 -0
  92. package/dist/tools/worknode-tag-tool.js +353 -0
  93. package/dist/tools/worknode-tag-tool.js.map +1 -0
  94. package/dist/tools/worknode-update-tool.d.ts +4 -0
  95. package/dist/tools/worknode-update-tool.d.ts.map +1 -0
  96. package/dist/tools/worknode-update-tool.js +409 -0
  97. package/dist/tools/worknode-update-tool.js.map +1 -0
  98. package/dist/tools/workspace-inbox-tool.d.ts +8 -0
  99. package/dist/tools/workspace-inbox-tool.d.ts.map +1 -0
  100. package/dist/tools/workspace-inbox-tool.js +210 -0
  101. package/dist/tools/workspace-inbox-tool.js.map +1 -0
  102. package/dist/tools/workspace-tree-tool.d.ts +4 -0
  103. package/dist/tools/workspace-tree-tool.d.ts.map +1 -0
  104. package/dist/tools/workspace-tree-tool.js +419 -0
  105. package/dist/tools/workspace-tree-tool.js.map +1 -0
  106. package/package.json +61 -0
@@ -0,0 +1,310 @@
1
+ import { z } from 'zod';
2
+ const MeetingStatusSchema = z.enum(['draft', 'scheduled', 'in_progress', 'completed', 'cancelled']);
3
+ const UpdateMeetingChangesSchema = z.object({
4
+ title: z.string().min(1).optional().describe('New meeting title'),
5
+ description: z.string().nullable().optional().describe('New description (null to clear)'),
6
+ scheduledAt: z.string().optional().describe('New scheduled date/time (ISO 8601)'),
7
+ duration: z.number().optional().describe('New duration in minutes'),
8
+ status: MeetingStatusSchema.optional().describe('New status'),
9
+ facilitatorId: z.string().nullable().optional().describe('New facilitator user ID (null to remove)'),
10
+ participantUserIds: z.array(z.string()).optional().describe('Updated participant user IDs')
11
+ });
12
+ const UpdateMeetingSchema = z.object({
13
+ meetingId: z.number().describe('ID of Meeting to update'),
14
+ changes: UpdateMeetingChangesSchema.describe('Changes to apply')
15
+ });
16
+ /**
17
+ * Register Meeting Update Tool with preview-first workflow
18
+ */
19
+ export function registerMeetingUpdateTool(server, apiClient) {
20
+ server.registerTool('brxce_update_meeting', {
21
+ description: `Update a Meeting in BRXCE with **MANDATORY preview-confirm workflow**.
22
+
23
+ ⚠️ **CRITICAL: Meeting Verification Required**
24
+ Before calling this tool, you MUST:
25
+ 1. Use \`brxce_list_meetings\` to find the meeting ID
26
+ 2. NEVER use arbitrary or guessed meetingId values
27
+ 3. Verify the meeting exists in the workspace
28
+ 4. Ensure user has permission to modify the meeting
29
+
30
+ **Example Workflow:**
31
+ \`\`\`
32
+ User: "Change meeting title to 'Q1 Review'"
33
+ LLM:
34
+ 1. Calls brxce_list_meetings to find the meeting
35
+ 2. Finds meeting with ID 24
36
+ 3. Calls brxce_update_meeting with preview: true
37
+ 4. Shows preview to user
38
+ 5. If confirmed, calls again with preview: false
39
+ \`\`\`
40
+
41
+ 🔒 **CRITICAL: Preview-First Policy**
42
+ This tool REQUIRES a two-step workflow to prevent accidental changes:
43
+
44
+ 1️⃣ **PREVIEW** (preview: true) - ALWAYS call this first
45
+ - Validates all proposed changes
46
+ - Shows current vs. proposed values
47
+ - Identifies validation errors and warnings
48
+ - DOES NOT update the meeting
49
+
50
+ 2️⃣ **CONFIRM** (preview: false) - Only after user confirms preview
51
+ - Actually applies the changes
52
+ - Returns updated Meeting
53
+ - Triggers notifications
54
+
55
+ **Supported Changes:**
56
+ - \`title\`: Change meeting title
57
+ - \`description\`: Add/modify/clear description
58
+ - \`scheduledAt\`: Change scheduled date/time
59
+ - \`duration\`: Change meeting duration (in minutes)
60
+ - \`status\`: Change status (draft → scheduled → in_progress → completed)
61
+ - \`facilitatorId\`: Change facilitator (null to remove)
62
+ - \`participantUserIds\`: Update participant list
63
+
64
+ **Validation:**
65
+ - Title cannot be empty
66
+ - Scheduled end must be after scheduled start
67
+ - Facilitator must exist (if provided)
68
+ - All participants must exist
69
+ - Warnings for completed meeting changes
70
+
71
+ **Example Workflow:**
72
+
73
+ User: "Change meeting #24 title to 'Q1 Review Meeting'"
74
+
75
+ Step 1 - Preview:
76
+ \`\`\`json
77
+ {
78
+ "meetingId": 24,
79
+ "changes": {
80
+ "title": "Q1 Review Meeting"
81
+ },
82
+ "preview": true
83
+ }
84
+ \`\`\`
85
+
86
+ LLM: "I'll preview the changes first:
87
+ - Current title: 'Weekly Sync'
88
+ - Proposed title: 'Q1 Review Meeting'
89
+ - No warnings or errors
90
+
91
+ Would you like me to proceed with this update?"
92
+
93
+ User: "Yes"
94
+
95
+ Step 2 - Confirm:
96
+ \`\`\`json
97
+ {
98
+ "meetingId": 24,
99
+ "changes": {
100
+ "title": "Q1 Review Meeting"
101
+ },
102
+ "preview": false
103
+ }
104
+ \`\`\`
105
+
106
+ **Complex Example - Multiple Changes:**
107
+
108
+ \`\`\`json
109
+ {
110
+ "meetingId": 24,
111
+ "changes": {
112
+ "title": "Q1 Planning Session",
113
+ "scheduledAt": "2025-01-15T14:00:00Z",
114
+ "duration": 90,
115
+ "status": "scheduled"
116
+ },
117
+ "preview": true
118
+ }
119
+ \`\`\`
120
+
121
+ **Best Practices:**
122
+
123
+ 1. **ALWAYS preview first** - Never skip preview mode
124
+ 2. **Show preview results** - Present current vs. proposed changes to user
125
+ 3. **Wait for confirmation** - Don't auto-proceed even if preview is valid
126
+ 4. **Check warnings** - Inform user of any warnings from preview
127
+ 5. **Handle errors gracefully** - If preview fails, explain why and suggest fixes
128
+
129
+ **Common Use Cases:**
130
+
131
+ - Update title: "Rename meeting #24 to 'Sprint Planning'"
132
+ - Reschedule: "Move meeting #24 to tomorrow at 2pm"
133
+ - Change status: "Mark meeting #24 as completed"
134
+ - Update participants: "Add john@example.com to meeting #24"
135
+ - Update duration: "Change meeting #24 duration to 90 minutes"
136
+
137
+ ⏰ **TIMEZONE HANDLING:**
138
+ When updating scheduledAt, provide in ISO 8601 format with timezone information.
139
+ The API will store dates in UTC, but the LLM should help users specify dates in their local timezone.
140
+
141
+ Example for Korea Time (UTC+9):
142
+ - User says: "Reschedule to tomorrow at 2pm" → LLM converts to: "2025-10-21T05:00:00.000Z" (2pm KST)
143
+ - User says: "Move to next Monday 10am" → LLM converts to: "2025-10-27T01:00:00.000Z" (10am KST)
144
+
145
+ When updating meetings with dates:
146
+ 1. Check the current date/time from the <env> tag in the system prompt
147
+ 2. Identify the user's timezone (e.g., Asia/Seoul = UTC+9)
148
+ 3. Convert user's local dates to UTC for the API
149
+
150
+ ⚠️ **NEVER**:
151
+ - Skip preview mode
152
+ - Proceed without user confirmation
153
+ - Make changes that fail validation
154
+ - Ignore warnings about completed meetings`,
155
+ inputSchema: {
156
+ meetingId: z.number().describe('ID of Meeting to update'),
157
+ changes: UpdateMeetingChangesSchema.describe('Changes to apply to the meeting'),
158
+ preview: z.boolean().optional().describe('If true, validate but do not update (dry run). ALWAYS use preview: true first!')
159
+ }
160
+ }, async (args) => {
161
+ const { meetingId, changes, preview = true } = args;
162
+ try {
163
+ if (preview) {
164
+ // Preview mode
165
+ const response = await apiClient.post(`/mcp/meetings/${meetingId}/preview`, changes);
166
+ if (!response.success) {
167
+ return {
168
+ content: [
169
+ {
170
+ type: 'text',
171
+ text: `Failed to preview meeting update: ${response.message || 'Unknown error'}`,
172
+ },
173
+ ],
174
+ isError: true,
175
+ };
176
+ }
177
+ const { valid, current, proposed, warnings, errors } = response.data;
178
+ let resultText = '## Meeting Update Preview\n\n';
179
+ resultText += `**Meeting ID**: ${meetingId}\n`;
180
+ resultText += `**Validation**: ${valid ? '✅ VALID' : '❌ INVALID'}\n\n`;
181
+ // Show current state
182
+ resultText += '### Current State:\n\n';
183
+ resultText += `- **Title**: ${current.title}\n`;
184
+ if (current.description) {
185
+ resultText += `- **Description**: ${current.description.substring(0, 100)}${current.description.length > 100 ? '...' : ''}\n`;
186
+ }
187
+ resultText += `- **Scheduled**: ${new Date(current.scheduledAt).toLocaleString()}\n`;
188
+ if (current.duration) {
189
+ resultText += `- **Duration**: ${current.duration} minutes\n`;
190
+ }
191
+ resultText += `- **Status**: ${current.status}\n`;
192
+ if (current.facilitatorId) {
193
+ resultText += `- **Facilitator**: ${current.facilitatorId}\n`;
194
+ }
195
+ resultText += `- **Participants**: ${current.participantCount}\n\n`;
196
+ // Show proposed changes
197
+ resultText += '### Proposed Changes:\n\n';
198
+ const changedFields = [];
199
+ if (changes.title !== undefined) {
200
+ changedFields.push(`**Title**: "${current.title}" → "${proposed.title}"`);
201
+ }
202
+ if (changes.description !== undefined) {
203
+ const desc = proposed.description || '(empty)';
204
+ changedFields.push(`**Description**: Updated`);
205
+ }
206
+ if (changes.scheduledAt !== undefined) {
207
+ changedFields.push(`**Scheduled**: ${new Date(current.scheduledAt).toLocaleString()} → ${new Date(proposed.scheduledAt).toLocaleString()}`);
208
+ }
209
+ if (changes.duration !== undefined) {
210
+ changedFields.push(`**Duration**: ${current.duration || 'N/A'} → ${proposed.duration} minutes`);
211
+ }
212
+ if (changes.status !== undefined) {
213
+ changedFields.push(`**Status**: ${current.status} → ${proposed.status}`);
214
+ }
215
+ if (changes.facilitatorId !== undefined) {
216
+ const oldF = current.facilitatorId || '(none)';
217
+ const newF = proposed.facilitatorId || '(none)';
218
+ changedFields.push(`**Facilitator**: ${oldF} → ${newF}`);
219
+ }
220
+ if (changes.participantUserIds !== undefined) {
221
+ changedFields.push(`**Participants**: ${current.participantCount} → ${proposed.participantCount}`);
222
+ }
223
+ if (changedFields.length > 0) {
224
+ changedFields.forEach(field => resultText += `- ${field}\n`);
225
+ }
226
+ else {
227
+ resultText += '- *(No changes specified)*\n';
228
+ }
229
+ resultText += '\n';
230
+ // Show warnings
231
+ if (warnings && warnings.length > 0) {
232
+ resultText += '### ⚠️ Warnings:\n\n';
233
+ warnings.forEach(w => resultText += `- ${w}\n`);
234
+ resultText += '\n';
235
+ }
236
+ // Show errors
237
+ if (errors && errors.length > 0) {
238
+ resultText += '### ❌ Errors:\n\n';
239
+ errors.forEach(e => resultText += `- ${e}\n`);
240
+ resultText += '\n';
241
+ }
242
+ if (valid) {
243
+ resultText += '✅ **All changes are valid and ready to apply!**\n';
244
+ resultText += '🔒 **To proceed, call this tool again with `preview: false`**\n';
245
+ }
246
+ else {
247
+ resultText += '⚠️ **Cannot proceed due to validation errors.**\n';
248
+ resultText += 'Please fix the errors before updating.\n';
249
+ }
250
+ return {
251
+ content: [
252
+ {
253
+ type: 'text',
254
+ text: resultText,
255
+ },
256
+ ],
257
+ };
258
+ }
259
+ else {
260
+ // Update mode
261
+ const response = await apiClient.put(`/mcp/meetings/${meetingId}`, changes);
262
+ if (!response.success) {
263
+ return {
264
+ content: [
265
+ {
266
+ type: 'text',
267
+ text: `Failed to update meeting: ${response.message || 'Unknown error'}`,
268
+ },
269
+ ],
270
+ isError: true,
271
+ };
272
+ }
273
+ const meeting = response.data;
274
+ let resultText = '## Meeting Update Result\n\n';
275
+ resultText += `✅ **Meeting #${meetingId} updated successfully!**\n\n`;
276
+ resultText += '### Updated Information:\n\n';
277
+ resultText += `- **Title**: ${meeting.title}\n`;
278
+ if (meeting.description) {
279
+ resultText += `- **Description**: ${meeting.description.substring(0, 100)}${meeting.description.length > 100 ? '...' : ''}\n`;
280
+ }
281
+ resultText += `- **Scheduled**: ${new Date(meeting.scheduledStart).toLocaleString()}\n`;
282
+ if (meeting.scheduledEnd) {
283
+ const duration = Math.round((new Date(meeting.scheduledEnd).getTime() - new Date(meeting.scheduledStart).getTime()) / (1000 * 60));
284
+ resultText += `- **Duration**: ${duration} minutes\n`;
285
+ }
286
+ resultText += `- **Status**: ${meeting.status}\n`;
287
+ return {
288
+ content: [
289
+ {
290
+ type: 'text',
291
+ text: resultText,
292
+ },
293
+ ],
294
+ };
295
+ }
296
+ }
297
+ catch (error) {
298
+ return {
299
+ content: [
300
+ {
301
+ type: 'text',
302
+ text: `Error ${preview ? 'previewing' : 'updating'} meeting: ${error.message || 'Unknown error'}`,
303
+ },
304
+ ],
305
+ isError: true,
306
+ };
307
+ }
308
+ });
309
+ }
310
+ //# sourceMappingURL=meeting-update-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meeting-update-tool.js","sourceRoot":"","sources":["../../src/tools/meeting-update-tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { ApiClient } from '../services/api-client.js';
3
+ export declare function registerTagCategoryTools(server: McpServer, apiClient: ApiClient): void;
4
+ //# sourceMappingURL=tag-category-tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tag-category-tool.d.ts","sourceRoot":"","sources":["../../src/tools/tag-category-tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAEtD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,QAmW/E"}
@@ -0,0 +1,293 @@
1
+ import { z } from 'zod';
2
+ export function registerTagCategoryTools(server, apiClient) {
3
+ /**
4
+ * List tag categories in workspace
5
+ */
6
+ server.registerTool('brxce_list_tag_categories', {
7
+ description: `List all tag categories in a workspace.
8
+
9
+ **When to use:**
10
+ - When organizing tags for the first time
11
+ - When user asks "what tag categories exist?" or "show me tag categories"
12
+ - Before creating new tags to see which categories are available
13
+ - To understand the workspace's tag taxonomy
14
+
15
+ **Returns:**
16
+ - Array of tag categories with names, slugs, settings (allowMultiple, isRequired)
17
+ - Tag count for each category
18
+ - Sort order information
19
+
20
+ **Example usage:**
21
+ User: "What tag categories do we have in this workspace?"
22
+ Assistant calls: brxce_list_tag_categories(workspaceId: 4)`,
23
+ inputSchema: {
24
+ workspaceId: z.number().describe('The workspace ID'),
25
+ includeDeleted: z.boolean().optional().describe('Include deleted categories (default: false)')
26
+ }
27
+ }, async (args) => {
28
+ try {
29
+ const { workspaceId, includeDeleted } = args;
30
+ const queryParams = new URLSearchParams();
31
+ if (includeDeleted !== undefined) {
32
+ queryParams.set('includeDeleted', String(includeDeleted));
33
+ }
34
+ const url = `/mcp/workspaces/${workspaceId}/tag-categories${queryParams.toString() ? `?${queryParams.toString()}` : ''}`;
35
+ const response = await apiClient.get(url);
36
+ if (!response.success) {
37
+ return {
38
+ content: [
39
+ {
40
+ type: 'text',
41
+ text: `Failed to list tag categories: ${response.message || 'Unknown error'}`,
42
+ },
43
+ ],
44
+ };
45
+ }
46
+ const { categories, total } = response.data;
47
+ let resultText = `## Tag Categories (Workspace ${workspaceId})\\n\\n`;
48
+ resultText += `Total categories: ${total}\\n\\n`;
49
+ if (categories.length === 0) {
50
+ resultText += `No tag categories found.\\n`;
51
+ }
52
+ else {
53
+ categories.forEach((cat) => {
54
+ resultText += `### ${cat.name} (${cat.slug})\\n`;
55
+ resultText += `- ID: ${cat.id}\\n`;
56
+ if (cat.description)
57
+ resultText += `- Description: ${cat.description}\\n`;
58
+ resultText += `- Tags: ${cat._count.tags}\\n`;
59
+ resultText += `- Allow multiple: ${cat.allowMultiple ? 'Yes' : 'No'}\\n`;
60
+ resultText += `- Required: ${cat.isRequired ? 'Yes' : 'No'}\\n`;
61
+ if (cat.color)
62
+ resultText += `- Color: ${cat.color}\\n`;
63
+ if (cat.icon)
64
+ resultText += `- Icon: ${cat.icon}\\n`;
65
+ resultText += `\\n`;
66
+ });
67
+ }
68
+ return {
69
+ content: [
70
+ {
71
+ type: 'text',
72
+ text: resultText,
73
+ },
74
+ ],
75
+ };
76
+ }
77
+ catch (error) {
78
+ return {
79
+ content: [
80
+ {
81
+ type: 'text',
82
+ text: `Error listing tag categories: ${error.message || 'Unknown error'}`,
83
+ },
84
+ ],
85
+ };
86
+ }
87
+ });
88
+ /**
89
+ * Create tag category
90
+ */
91
+ server.registerTool('brxce_create_tag_category', {
92
+ description: `Create a new tag category in a workspace.
93
+
94
+ **When to use:**
95
+ - When user wants to organize tags by creating a new category
96
+ - Before creating tags that don't fit existing categories
97
+ - To set up workspace taxonomy (e.g., "Tech Stack", "Status", "Priority")
98
+
99
+ **Category types examples:**
100
+ - Tech Stack: react, typescript, node-js
101
+ - Status: active, archived, deprecated
102
+ - Team: frontend, backend, devops
103
+ - Priority: critical, high, medium, low
104
+
105
+ **Settings:**
106
+ - allowMultiple: Can a WorkNode have multiple tags from this category?
107
+ - isRequired: Must WorkNodes have at least one tag from this category?
108
+
109
+ **Example:**
110
+ User: "Create a Tech Stack category for organizing our technologies"
111
+ Assistant calls: brxce_create_tag_category(
112
+ workspaceId: 4,
113
+ name: "Tech Stack",
114
+ slug: "tech-stack",
115
+ allowMultiple: true,
116
+ isRequired: false
117
+ )`,
118
+ inputSchema: {
119
+ workspaceId: z.number().describe('The workspace ID'),
120
+ name: z.string().describe('Category name (e.g., "Tech Stack", "Status")'),
121
+ slug: z.string().describe('URL-friendly slug (e.g., "tech-stack", "status")'),
122
+ description: z.string().optional().describe('Category description'),
123
+ color: z.string().optional().describe('Hex color code (e.g., "#FF5733")'),
124
+ icon: z.string().optional().describe('Icon identifier'),
125
+ allowMultiple: z.boolean().optional().describe('Allow multiple tags from this category (default: true)'),
126
+ isRequired: z.boolean().optional().describe('Is this category required for WorkNodes (default: false)'),
127
+ sortOrder: z.number().optional().describe('Display order (default: 0)')
128
+ }
129
+ }, async (args) => {
130
+ try {
131
+ const url = `/mcp/workspaces/${args.workspaceId}/tag-categories`;
132
+ const response = await apiClient.post(url, {
133
+ name: args.name,
134
+ slug: args.slug,
135
+ description: args.description,
136
+ color: args.color,
137
+ icon: args.icon,
138
+ allowMultiple: args.allowMultiple,
139
+ isRequired: args.isRequired,
140
+ sortOrder: args.sortOrder
141
+ });
142
+ if (!response.success) {
143
+ return {
144
+ content: [
145
+ {
146
+ type: 'text',
147
+ text: `Failed to create tag category: ${response.message || 'Unknown error'}`,
148
+ },
149
+ ],
150
+ };
151
+ }
152
+ const category = response.data;
153
+ return {
154
+ content: [
155
+ {
156
+ type: 'text',
157
+ text: `Tag category "${category.name}" created successfully!\\n\\nID: ${category.id}\\nSlug: ${category.slug}\\nAllow Multiple: ${category.allowMultiple}\\nRequired: ${category.isRequired}`,
158
+ },
159
+ ],
160
+ };
161
+ }
162
+ catch (error) {
163
+ return {
164
+ content: [
165
+ {
166
+ type: 'text',
167
+ text: `Error creating tag category: ${error.message || 'Unknown error'}`,
168
+ },
169
+ ],
170
+ };
171
+ }
172
+ });
173
+ /**
174
+ * Update tag category
175
+ */
176
+ server.registerTool('brxce_update_tag_category', {
177
+ description: `Update an existing tag category.
178
+
179
+ **When to use:**
180
+ - To rename or change category settings
181
+ - To update color/icon for better visual organization
182
+ - To modify allowMultiple or isRequired settings
183
+
184
+ **Example:**
185
+ User: "Make the Tech Stack category required"
186
+ Assistant calls: brxce_update_tag_category(
187
+ workspaceId: 4,
188
+ categoryId: 10,
189
+ isRequired: true
190
+ )`,
191
+ inputSchema: {
192
+ workspaceId: z.number().describe('The workspace ID'),
193
+ categoryId: z.number().describe('Category ID to update'),
194
+ name: z.string().optional().describe('New category name'),
195
+ slug: z.string().optional().describe('New slug'),
196
+ description: z.string().optional().describe('New description'),
197
+ color: z.string().optional().describe('New color'),
198
+ icon: z.string().optional().describe('New icon'),
199
+ allowMultiple: z.boolean().optional().describe('New allowMultiple setting'),
200
+ isRequired: z.boolean().optional().describe('New isRequired setting'),
201
+ sortOrder: z.number().optional().describe('New sort order')
202
+ }
203
+ }, async (args) => {
204
+ try {
205
+ const { workspaceId, categoryId, ...updates } = args;
206
+ const url = `/mcp/workspaces/${workspaceId}/tag-categories/${categoryId}`;
207
+ const response = await apiClient.put(url, updates);
208
+ if (!response.success) {
209
+ return {
210
+ content: [
211
+ {
212
+ type: 'text',
213
+ text: `Failed to update tag category: ${response.message || 'Unknown error'}`,
214
+ },
215
+ ],
216
+ };
217
+ }
218
+ return {
219
+ content: [
220
+ {
221
+ type: 'text',
222
+ text: `Tag category updated successfully!`,
223
+ },
224
+ ],
225
+ };
226
+ }
227
+ catch (error) {
228
+ return {
229
+ content: [
230
+ {
231
+ type: 'text',
232
+ text: `Error updating tag category: ${error.message || 'Unknown error'}`,
233
+ },
234
+ ],
235
+ };
236
+ }
237
+ });
238
+ /**
239
+ * Delete tag category
240
+ */
241
+ server.registerTool('brxce_delete_tag_category', {
242
+ description: `Delete (soft delete) a tag category.
243
+
244
+ **When to use:**
245
+ - When a category is no longer needed
246
+ - To clean up unused tag organization
247
+
248
+ **Note:** This is a soft delete. The category and its tags remain in database but are hidden.
249
+
250
+ **Example:**
251
+ User: "Remove the deprecated Status category"
252
+ Assistant calls: brxce_delete_tag_category(workspaceId: 4, categoryId: 15)`,
253
+ inputSchema: {
254
+ workspaceId: z.number().describe('The workspace ID'),
255
+ categoryId: z.number().describe('Category ID to delete')
256
+ }
257
+ }, async (args) => {
258
+ try {
259
+ const { workspaceId, categoryId } = args;
260
+ const url = `/mcp/workspaces/${workspaceId}/tag-categories/${categoryId}`;
261
+ const response = await apiClient.delete(url);
262
+ if (!response.success) {
263
+ return {
264
+ content: [
265
+ {
266
+ type: 'text',
267
+ text: `Failed to delete tag category: ${response.message || 'Unknown error'}`,
268
+ },
269
+ ],
270
+ };
271
+ }
272
+ return {
273
+ content: [
274
+ {
275
+ type: 'text',
276
+ text: `Tag category deleted successfully.`,
277
+ },
278
+ ],
279
+ };
280
+ }
281
+ catch (error) {
282
+ return {
283
+ content: [
284
+ {
285
+ type: 'text',
286
+ text: `Error deleting tag category: ${error.message || 'Unknown error'}`,
287
+ },
288
+ ],
289
+ };
290
+ }
291
+ });
292
+ }
293
+ //# sourceMappingURL=tag-category-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tag-category-tool.js","sourceRoot":"","sources":["../../src/tools/tag-category-tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { ApiClient } from '../services/api-client.js';
3
+ export declare function registerTagSearchTools(server: McpServer, apiClient: ApiClient): void;
4
+ //# sourceMappingURL=tag-search-tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tag-search-tool.d.ts","sourceRoot":"","sources":["../../src/tools/tag-search-tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAEtD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,QAge7E"}