@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.
- package/README.md +220 -0
- package/dist/config/environment.d.ts +8 -0
- package/dist/config/environment.d.ts.map +1 -0
- package/dist/config/environment.js +16 -0
- package/dist/config/environment.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +167 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/worknode-prompts.d.ts +7 -0
- package/dist/prompts/worknode-prompts.d.ts.map +1 -0
- package/dist/prompts/worknode-prompts.js +369 -0
- package/dist/prompts/worknode-prompts.js.map +1 -0
- package/dist/prompts/workspace-context-prompt.d.ts +4 -0
- package/dist/prompts/workspace-context-prompt.d.ts.map +1 -0
- package/dist/prompts/workspace-context-prompt.js +101 -0
- package/dist/prompts/workspace-context-prompt.js.map +1 -0
- package/dist/resources/user-resource.d.ts +4 -0
- package/dist/resources/user-resource.d.ts.map +1 -0
- package/dist/resources/user-resource.js +40 -0
- package/dist/resources/user-resource.js.map +1 -0
- package/dist/resources/workspace-members-resource.d.ts +4 -0
- package/dist/resources/workspace-members-resource.d.ts.map +1 -0
- package/dist/resources/workspace-members-resource.js +39 -0
- package/dist/resources/workspace-members-resource.js.map +1 -0
- package/dist/resources/workspace-resource.d.ts +4 -0
- package/dist/resources/workspace-resource.d.ts.map +1 -0
- package/dist/resources/workspace-resource.js +27 -0
- package/dist/resources/workspace-resource.js.map +1 -0
- package/dist/services/api-client.d.ts +17 -0
- package/dist/services/api-client.d.ts.map +1 -0
- package/dist/services/api-client.js +118 -0
- package/dist/services/api-client.js.map +1 -0
- package/dist/tools/meeting-agenda-tool.d.ts +7 -0
- package/dist/tools/meeting-agenda-tool.d.ts.map +1 -0
- package/dist/tools/meeting-agenda-tool.js +452 -0
- package/dist/tools/meeting-agenda-tool.js.map +1 -0
- package/dist/tools/meeting-create-tool.d.ts +8 -0
- package/dist/tools/meeting-create-tool.d.ts.map +1 -0
- package/dist/tools/meeting-create-tool.js +309 -0
- package/dist/tools/meeting-create-tool.js.map +1 -0
- package/dist/tools/meeting-decisions-tool.d.ts +7 -0
- package/dist/tools/meeting-decisions-tool.d.ts.map +1 -0
- package/dist/tools/meeting-decisions-tool.js +431 -0
- package/dist/tools/meeting-decisions-tool.js.map +1 -0
- package/dist/tools/meeting-list-tool.d.ts +7 -0
- package/dist/tools/meeting-list-tool.d.ts.map +1 -0
- package/dist/tools/meeting-list-tool.js +305 -0
- package/dist/tools/meeting-list-tool.js.map +1 -0
- package/dist/tools/meeting-notes-tool.d.ts +7 -0
- package/dist/tools/meeting-notes-tool.d.ts.map +1 -0
- package/dist/tools/meeting-notes-tool.js +318 -0
- package/dist/tools/meeting-notes-tool.js.map +1 -0
- package/dist/tools/meeting-update-tool.d.ts +7 -0
- package/dist/tools/meeting-update-tool.d.ts.map +1 -0
- package/dist/tools/meeting-update-tool.js +310 -0
- package/dist/tools/meeting-update-tool.js.map +1 -0
- package/dist/tools/tag-category-tool.d.ts +4 -0
- package/dist/tools/tag-category-tool.d.ts.map +1 -0
- package/dist/tools/tag-category-tool.js +293 -0
- package/dist/tools/tag-category-tool.js.map +1 -0
- package/dist/tools/tag-search-tool.d.ts +4 -0
- package/dist/tools/tag-search-tool.d.ts.map +1 -0
- package/dist/tools/tag-search-tool.js +358 -0
- package/dist/tools/tag-search-tool.js.map +1 -0
- package/dist/tools/tag-tool.d.ts +4 -0
- package/dist/tools/tag-tool.d.ts.map +1 -0
- package/dist/tools/tag-tool.js +450 -0
- package/dist/tools/tag-tool.js.map +1 -0
- package/dist/tools/worknode-archive-tool.d.ts +7 -0
- package/dist/tools/worknode-archive-tool.d.ts.map +1 -0
- package/dist/tools/worknode-archive-tool.js +163 -0
- package/dist/tools/worknode-archive-tool.js.map +1 -0
- package/dist/tools/worknode-create-tool.d.ts +4 -0
- package/dist/tools/worknode-create-tool.d.ts.map +1 -0
- package/dist/tools/worknode-create-tool.js +382 -0
- package/dist/tools/worknode-create-tool.js.map +1 -0
- package/dist/tools/worknode-my-work-tool.d.ts +8 -0
- package/dist/tools/worknode-my-work-tool.d.ts.map +1 -0
- package/dist/tools/worknode-my-work-tool.js +302 -0
- package/dist/tools/worknode-my-work-tool.js.map +1 -0
- package/dist/tools/worknode-search-tool.d.ts +4 -0
- package/dist/tools/worknode-search-tool.d.ts.map +1 -0
- package/dist/tools/worknode-search-tool.js +289 -0
- package/dist/tools/worknode-search-tool.js.map +1 -0
- package/dist/tools/worknode-subtree-tool.d.ts +4 -0
- package/dist/tools/worknode-subtree-tool.d.ts.map +1 -0
- package/dist/tools/worknode-subtree-tool.js +175 -0
- package/dist/tools/worknode-subtree-tool.js.map +1 -0
- package/dist/tools/worknode-tag-tool.d.ts +4 -0
- package/dist/tools/worknode-tag-tool.d.ts.map +1 -0
- package/dist/tools/worknode-tag-tool.js +353 -0
- package/dist/tools/worknode-tag-tool.js.map +1 -0
- package/dist/tools/worknode-update-tool.d.ts +4 -0
- package/dist/tools/worknode-update-tool.d.ts.map +1 -0
- package/dist/tools/worknode-update-tool.js +409 -0
- package/dist/tools/worknode-update-tool.js.map +1 -0
- package/dist/tools/workspace-inbox-tool.d.ts +8 -0
- package/dist/tools/workspace-inbox-tool.d.ts.map +1 -0
- package/dist/tools/workspace-inbox-tool.js +210 -0
- package/dist/tools/workspace-inbox-tool.js.map +1 -0
- package/dist/tools/workspace-tree-tool.d.ts +4 -0
- package/dist/tools/workspace-tree-tool.d.ts.map +1 -0
- package/dist/tools/workspace-tree-tool.js +419 -0
- package/dist/tools/workspace-tree-tool.js.map +1 -0
- 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 @@
|
|
|
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"}
|