@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,305 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* Register Meeting List and Detail Tools
|
|
4
|
+
*/
|
|
5
|
+
export function registerMeetingListTools(server, apiClient) {
|
|
6
|
+
/**
|
|
7
|
+
* List meetings tool
|
|
8
|
+
*/
|
|
9
|
+
server.registerTool('brxce_list_meetings', {
|
|
10
|
+
description: `List meetings in a workspace with optional filters.
|
|
11
|
+
|
|
12
|
+
⚠️ **CRITICAL: Workspace Verification Required**
|
|
13
|
+
Before calling this tool, you MUST:
|
|
14
|
+
1. Read the \`user://me\` resource to get available workspaces
|
|
15
|
+
2. Identify the correct workspaceId from the resource data
|
|
16
|
+
3. If user doesn't specify workspace, use their default workspace
|
|
17
|
+
4. NEVER assume or guess workspaceId values
|
|
18
|
+
|
|
19
|
+
**Example Workflow:**
|
|
20
|
+
\`\`\`
|
|
21
|
+
User: "지난 회의들 보여줘"
|
|
22
|
+
LLM:
|
|
23
|
+
1. Reads user://me resource
|
|
24
|
+
2. Finds default workspace: 138
|
|
25
|
+
3. Calls brxce_list_meetings with workspaceId: 138
|
|
26
|
+
\`\`\`
|
|
27
|
+
|
|
28
|
+
**When to use this tool:**
|
|
29
|
+
- "지난 회의들 보여줘" → List recent meetings
|
|
30
|
+
- "이번 주 예정된 미팅 목록" → Filter by date range
|
|
31
|
+
- "완료된 회의들 보여줘" → Filter by status=completed
|
|
32
|
+
- "예정된 회의 뭐가 있어?" → Filter by status=scheduled
|
|
33
|
+
|
|
34
|
+
**Filters:**
|
|
35
|
+
- workspaceId (required): Workspace to search in
|
|
36
|
+
- status: scheduled, in_progress, completed, cancelled
|
|
37
|
+
- from: Start date (ISO 8601)
|
|
38
|
+
- to: End date (ISO 8601)
|
|
39
|
+
- limit: Max results (default: 20, max: 50)
|
|
40
|
+
|
|
41
|
+
**Output:**
|
|
42
|
+
Returns summary list with:
|
|
43
|
+
- Meeting ID, title, scheduled time, duration
|
|
44
|
+
- Status, participant count, item count
|
|
45
|
+
- Quick indicators: hasReview, hasAgenda
|
|
46
|
+
|
|
47
|
+
**Usage Flow:**
|
|
48
|
+
1. Call this tool to get meeting list
|
|
49
|
+
2. User picks a meeting from the list
|
|
50
|
+
3. Call brxce_get_meeting with the ID for full details
|
|
51
|
+
|
|
52
|
+
**Best Practices:**
|
|
53
|
+
- Use date filters for "this week", "last month" queries
|
|
54
|
+
- Use status filter for "upcoming" or "past" meetings
|
|
55
|
+
- Keep limit reasonable (10-20) for better UX
|
|
56
|
+
- Present results in a readable table format
|
|
57
|
+
|
|
58
|
+
⏰ **TIMEZONE HANDLING:**
|
|
59
|
+
ALL date/time fields in the response are in UTC (ISO 8601 format):
|
|
60
|
+
- scheduledAt, completedAt, createdAt, updatedAt
|
|
61
|
+
|
|
62
|
+
When presenting results to the user, you MUST convert UTC timestamps to the user's local timezone:
|
|
63
|
+
1. Check the current date/time from the <env> tag in the system prompt
|
|
64
|
+
2. Identify the user's timezone (e.g., Asia/Seoul = UTC+9)
|
|
65
|
+
3. Convert ALL displayed timestamps from UTC to local time
|
|
66
|
+
4. Format dates in a user-friendly way (e.g., "오후 5:16" not "08:16 UTC")
|
|
67
|
+
|
|
68
|
+
Example conversion (Korea Time, UTC+9):
|
|
69
|
+
- API returns: "scheduledAt": "2025-10-20T08:00:00.000Z" (UTC)
|
|
70
|
+
- Display to user: "예정: 2025-10-20 오후 5:00" (KST)`,
|
|
71
|
+
inputSchema: {
|
|
72
|
+
workspaceId: z.number().describe('Workspace ID (required)'),
|
|
73
|
+
status: z
|
|
74
|
+
.enum(['scheduled', 'in_progress', 'completed', 'cancelled'])
|
|
75
|
+
.optional()
|
|
76
|
+
.describe('Filter by meeting status'),
|
|
77
|
+
from: z
|
|
78
|
+
.string()
|
|
79
|
+
.optional()
|
|
80
|
+
.describe('Start date (ISO 8601, e.g., "2025-01-01T00:00:00Z")'),
|
|
81
|
+
to: z
|
|
82
|
+
.string()
|
|
83
|
+
.optional()
|
|
84
|
+
.describe('End date (ISO 8601, e.g., "2025-01-31T23:59:59Z")'),
|
|
85
|
+
limit: z
|
|
86
|
+
.number()
|
|
87
|
+
.optional()
|
|
88
|
+
.describe('Max results to return (default: 20, max: 50)'),
|
|
89
|
+
},
|
|
90
|
+
}, async (args) => {
|
|
91
|
+
const { workspaceId, status, from, to, limit = 20 } = args;
|
|
92
|
+
try {
|
|
93
|
+
const params = new URLSearchParams({
|
|
94
|
+
workspaceId: workspaceId.toString(),
|
|
95
|
+
});
|
|
96
|
+
if (status)
|
|
97
|
+
params.append('status', status);
|
|
98
|
+
if (from)
|
|
99
|
+
params.append('from', from);
|
|
100
|
+
if (to)
|
|
101
|
+
params.append('to', to);
|
|
102
|
+
if (limit)
|
|
103
|
+
params.append('limit', Math.min(limit, 50).toString());
|
|
104
|
+
const response = await apiClient.get(`/mcp/meetings?${params.toString()}`);
|
|
105
|
+
if (!response.success) {
|
|
106
|
+
return {
|
|
107
|
+
content: [
|
|
108
|
+
{
|
|
109
|
+
type: 'text',
|
|
110
|
+
text: JSON.stringify({
|
|
111
|
+
error: 'Failed to list meetings',
|
|
112
|
+
message: response.message || 'Unknown error',
|
|
113
|
+
}),
|
|
114
|
+
},
|
|
115
|
+
],
|
|
116
|
+
isError: true,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
const { meetings, total } = response.data;
|
|
120
|
+
// Format for LLM
|
|
121
|
+
return {
|
|
122
|
+
content: [
|
|
123
|
+
{
|
|
124
|
+
type: 'text',
|
|
125
|
+
text: JSON.stringify({
|
|
126
|
+
summary: {
|
|
127
|
+
total,
|
|
128
|
+
returned: meetings.length,
|
|
129
|
+
hasMore: total > meetings.length,
|
|
130
|
+
},
|
|
131
|
+
meetings: meetings.map(m => ({
|
|
132
|
+
id: m.id,
|
|
133
|
+
title: m.title,
|
|
134
|
+
scheduledAt: new Date(m.scheduledAt).toLocaleString(),
|
|
135
|
+
duration: m.duration ? `${m.duration} min` : 'N/A',
|
|
136
|
+
status: m.status,
|
|
137
|
+
participants: m.participantCount,
|
|
138
|
+
items: m.itemCount,
|
|
139
|
+
hasReview: m.hasReview,
|
|
140
|
+
hasAgenda: m.hasAgenda,
|
|
141
|
+
})),
|
|
142
|
+
hint: 'Use brxce_get_meeting with a meeting ID to see full details',
|
|
143
|
+
}, null, 2),
|
|
144
|
+
},
|
|
145
|
+
],
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
return {
|
|
150
|
+
content: [
|
|
151
|
+
{
|
|
152
|
+
type: 'text',
|
|
153
|
+
text: JSON.stringify({
|
|
154
|
+
error: 'Failed to list meetings',
|
|
155
|
+
message: error.message,
|
|
156
|
+
details: error.response?.data || error,
|
|
157
|
+
}),
|
|
158
|
+
},
|
|
159
|
+
],
|
|
160
|
+
isError: true,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
/**
|
|
165
|
+
* Get meeting detail tool
|
|
166
|
+
*/
|
|
167
|
+
server.registerTool('brxce_get_meeting', {
|
|
168
|
+
description: `Get detailed information about a specific meeting.
|
|
169
|
+
|
|
170
|
+
**When to use this tool:**
|
|
171
|
+
- "미팅 ID 24 자세히 보여줘" → Get full meeting details
|
|
172
|
+
- After brxce_list_meetings, user selects a meeting → Get details
|
|
173
|
+
- "지난 주간 회의에서 뭘 논의했어?" → Get meeting + review content
|
|
174
|
+
|
|
175
|
+
**Returns:**
|
|
176
|
+
Complete meeting information including:
|
|
177
|
+
- Basic info: title, description, schedule, status
|
|
178
|
+
- Review section: period and completed WorkNodes
|
|
179
|
+
- Agenda items: titles, descriptions, notes, related WorkNodes
|
|
180
|
+
- Participants: names, roles, attendance status
|
|
181
|
+
- Meeting notes: content, authors, timestamps
|
|
182
|
+
- Decisions: made during the meeting
|
|
183
|
+
|
|
184
|
+
**Data Organization:**
|
|
185
|
+
- review[]: Review items with period and workNodeIds
|
|
186
|
+
- agenda[]: Agenda items with descriptions and notes
|
|
187
|
+
- participants[]: Who attended/was invited
|
|
188
|
+
- notes[]: Meeting notes by participants
|
|
189
|
+
- decisions[]: Decisions made during meeting
|
|
190
|
+
|
|
191
|
+
**Best Practices:**
|
|
192
|
+
- Present review and agenda prominently
|
|
193
|
+
- Highlight incomplete agenda items
|
|
194
|
+
- Show participant attendance status
|
|
195
|
+
- Format notes chronologically
|
|
196
|
+
- Link decisions to action items
|
|
197
|
+
|
|
198
|
+
**Next Steps After Getting Details:**
|
|
199
|
+
- Show related WorkNodes using workNodeIds
|
|
200
|
+
- Suggest follow-up actions based on decisions
|
|
201
|
+
- Offer to create new WorkNodes from agenda items`,
|
|
202
|
+
inputSchema: {
|
|
203
|
+
meetingId: z.number().describe('Meeting ID to retrieve'),
|
|
204
|
+
},
|
|
205
|
+
}, async (args) => {
|
|
206
|
+
const { meetingId } = args;
|
|
207
|
+
try {
|
|
208
|
+
const response = await apiClient.get(`/mcp/meetings/${meetingId}`);
|
|
209
|
+
if (!response.success) {
|
|
210
|
+
return {
|
|
211
|
+
content: [
|
|
212
|
+
{
|
|
213
|
+
type: 'text',
|
|
214
|
+
text: JSON.stringify({
|
|
215
|
+
error: 'Failed to get meeting',
|
|
216
|
+
message: response.message || 'Unknown error',
|
|
217
|
+
}),
|
|
218
|
+
},
|
|
219
|
+
],
|
|
220
|
+
isError: true,
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
const meeting = response.data;
|
|
224
|
+
// Format for LLM with clear sections
|
|
225
|
+
return {
|
|
226
|
+
content: [
|
|
227
|
+
{
|
|
228
|
+
type: 'text',
|
|
229
|
+
text: JSON.stringify({
|
|
230
|
+
meeting: {
|
|
231
|
+
id: meeting.id,
|
|
232
|
+
title: meeting.title,
|
|
233
|
+
description: meeting.description,
|
|
234
|
+
scheduledAt: new Date(meeting.scheduledAt).toLocaleString(),
|
|
235
|
+
duration: meeting.duration ? `${meeting.duration} min` : 'N/A',
|
|
236
|
+
status: meeting.status,
|
|
237
|
+
workspaceId: meeting.workspaceId,
|
|
238
|
+
},
|
|
239
|
+
review: meeting.review.map(r => ({
|
|
240
|
+
title: r.title,
|
|
241
|
+
period: r.period
|
|
242
|
+
? `${new Date(r.period.from).toLocaleDateString()} - ${new Date(r.period.to).toLocaleDateString()}`
|
|
243
|
+
: 'N/A',
|
|
244
|
+
completedWorkNodesCount: r.workNodeIds.length,
|
|
245
|
+
workNodeIds: r.workNodeIds,
|
|
246
|
+
})),
|
|
247
|
+
agenda: meeting.agenda.map((a, i) => ({
|
|
248
|
+
order: i + 1,
|
|
249
|
+
title: a.title,
|
|
250
|
+
description: a.description,
|
|
251
|
+
notes: a.notes,
|
|
252
|
+
status: a.status,
|
|
253
|
+
duration: a.duration ? `${a.duration} min` : null,
|
|
254
|
+
relatedWorkNodesCount: a.relatedWorkNodes.length,
|
|
255
|
+
})),
|
|
256
|
+
participants: meeting.participants.map(p => ({
|
|
257
|
+
name: p.name || p.email,
|
|
258
|
+
role: p.role,
|
|
259
|
+
attendance: p.attendanceStatus,
|
|
260
|
+
checkedIn: p.checkedInAt
|
|
261
|
+
? new Date(p.checkedInAt).toLocaleString()
|
|
262
|
+
: 'Not checked in',
|
|
263
|
+
})),
|
|
264
|
+
notes: meeting.notes.map(n => ({
|
|
265
|
+
author: n.author,
|
|
266
|
+
content: n.content,
|
|
267
|
+
visibility: n.visibility,
|
|
268
|
+
createdAt: new Date(n.createdAt).toLocaleString(),
|
|
269
|
+
})),
|
|
270
|
+
decisions: meeting.decisions.map(d => ({
|
|
271
|
+
title: d.title,
|
|
272
|
+
description: d.description,
|
|
273
|
+
type: d.type,
|
|
274
|
+
status: d.status,
|
|
275
|
+
createdAt: new Date(d.createdAt).toLocaleDateString(),
|
|
276
|
+
})),
|
|
277
|
+
stats: {
|
|
278
|
+
totalParticipants: meeting.participants.length,
|
|
279
|
+
totalAgendaItems: meeting.agenda.length,
|
|
280
|
+
totalNotes: meeting.notes.length,
|
|
281
|
+
totalDecisions: meeting.decisions.length,
|
|
282
|
+
},
|
|
283
|
+
}, null, 2),
|
|
284
|
+
},
|
|
285
|
+
],
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
catch (error) {
|
|
289
|
+
return {
|
|
290
|
+
content: [
|
|
291
|
+
{
|
|
292
|
+
type: 'text',
|
|
293
|
+
text: JSON.stringify({
|
|
294
|
+
error: 'Failed to get meeting',
|
|
295
|
+
message: error.message,
|
|
296
|
+
details: error.response?.data || error,
|
|
297
|
+
}),
|
|
298
|
+
},
|
|
299
|
+
],
|
|
300
|
+
isError: true,
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
//# sourceMappingURL=meeting-list-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meeting-list-tool.js","sourceRoot":"","sources":["../../src/tools/meeting-list-tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import type { ApiClient } from '../services/api-client.js';
|
|
3
|
+
/**
|
|
4
|
+
* Register Meeting Notes Tools for LLM-invoked operations
|
|
5
|
+
*/
|
|
6
|
+
export declare function registerMeetingNotesTools(server: McpServer, apiClient: ApiClient): void;
|
|
7
|
+
//# sourceMappingURL=meeting-notes-tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meeting-notes-tool.d.ts","sourceRoot":"","sources":["../../src/tools/meeting-notes-tool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAK3D;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,QAqWhF"}
|
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
const MeetingNoteVisibilitySchema = z.enum(['public', 'private']);
|
|
3
|
+
/**
|
|
4
|
+
* Register Meeting Notes Tools for LLM-invoked operations
|
|
5
|
+
*/
|
|
6
|
+
export function registerMeetingNotesTools(server, apiClient) {
|
|
7
|
+
/**
|
|
8
|
+
* brxce_add_meeting_note - Add a note to a meeting
|
|
9
|
+
*/
|
|
10
|
+
server.registerTool('brxce_add_meeting_note', {
|
|
11
|
+
description: `Add a note to a meeting.
|
|
12
|
+
|
|
13
|
+
**When to use this tool:**
|
|
14
|
+
- User asks to add a note to a meeting
|
|
15
|
+
- User mentions taking meeting notes
|
|
16
|
+
- During or after a meeting to capture discussion points
|
|
17
|
+
|
|
18
|
+
**Input:**
|
|
19
|
+
- meetingId (required): ID of the meeting
|
|
20
|
+
- content (required): The note content
|
|
21
|
+
- visibility (optional): 'public' (visible to all) or 'private' (visible only to author). Default: 'public'
|
|
22
|
+
|
|
23
|
+
**Access Control:**
|
|
24
|
+
- Only workspace members can add notes
|
|
25
|
+
- Private notes are only visible to the author
|
|
26
|
+
- Public notes are visible to all meeting participants
|
|
27
|
+
|
|
28
|
+
**Example:**
|
|
29
|
+
User: "Add a note to meeting #24: Discussed API design patterns"
|
|
30
|
+
LLM calls: brxce_add_meeting_note(meetingId: 24, content: "Discussed API design patterns", visibility: "public")`,
|
|
31
|
+
inputSchema: {
|
|
32
|
+
meetingId: z.number().describe('Meeting ID'),
|
|
33
|
+
content: z.string().min(1).describe('Note content'),
|
|
34
|
+
visibility: MeetingNoteVisibilitySchema.optional().describe('Note visibility (public or private, default: public)')
|
|
35
|
+
}
|
|
36
|
+
}, async (args) => {
|
|
37
|
+
const { meetingId, content, visibility = 'public' } = args;
|
|
38
|
+
try {
|
|
39
|
+
const response = await apiClient.post(`/mcp/meetings/${meetingId}/notes`, { content, visibility });
|
|
40
|
+
if (!response.success) {
|
|
41
|
+
return {
|
|
42
|
+
content: [
|
|
43
|
+
{
|
|
44
|
+
type: 'text',
|
|
45
|
+
text: `Failed to add meeting note: ${response.message || 'Unknown error'}`,
|
|
46
|
+
},
|
|
47
|
+
],
|
|
48
|
+
isError: true,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
const note = response.data;
|
|
52
|
+
let resultText = '## Meeting Note Added\\n\\n';
|
|
53
|
+
resultText += `✅ **Note successfully added to Meeting #${meetingId}**\\n\\n`;
|
|
54
|
+
resultText += `**Note ID:** ${note.id}\\n`;
|
|
55
|
+
resultText += `**Visibility:** ${note.visibility === 'private' ? '🔒 Private (only you can see)' : '👁️ Public (all participants can see)'}\\n`;
|
|
56
|
+
resultText += `**Content:**\\n${note.content}\\n\\n`;
|
|
57
|
+
resultText += `**Created:** ${new Date(note.createdAt).toLocaleString()}\\n`;
|
|
58
|
+
return {
|
|
59
|
+
content: [
|
|
60
|
+
{
|
|
61
|
+
type: 'text',
|
|
62
|
+
text: resultText,
|
|
63
|
+
},
|
|
64
|
+
],
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
return {
|
|
69
|
+
content: [
|
|
70
|
+
{
|
|
71
|
+
type: 'text',
|
|
72
|
+
text: `Error adding meeting note: ${error.message || 'Unknown error'}`,
|
|
73
|
+
},
|
|
74
|
+
],
|
|
75
|
+
isError: true,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
/**
|
|
80
|
+
* brxce_list_meeting_notes - List all notes for a meeting
|
|
81
|
+
*/
|
|
82
|
+
server.registerTool('brxce_list_meeting_notes', {
|
|
83
|
+
description: `List all notes for a meeting.
|
|
84
|
+
|
|
85
|
+
**When to use this tool:**
|
|
86
|
+
- User asks to see meeting notes
|
|
87
|
+
- User wants to review what was discussed
|
|
88
|
+
- Need to check notes before adding new ones
|
|
89
|
+
|
|
90
|
+
**Output:**
|
|
91
|
+
- Returns all public notes and user's private notes
|
|
92
|
+
- Notes are ordered chronologically
|
|
93
|
+
- Each note includes author information
|
|
94
|
+
|
|
95
|
+
**Example:**
|
|
96
|
+
User: "Show me the notes from meeting #24"
|
|
97
|
+
LLM calls: brxce_list_meeting_notes(meetingId: 24)`,
|
|
98
|
+
inputSchema: {
|
|
99
|
+
meetingId: z.number().describe('Meeting ID')
|
|
100
|
+
}
|
|
101
|
+
}, async (args) => {
|
|
102
|
+
const { meetingId } = args;
|
|
103
|
+
try {
|
|
104
|
+
const response = await apiClient.get(`/mcp/meetings/${meetingId}/notes`);
|
|
105
|
+
if (!response.success) {
|
|
106
|
+
return {
|
|
107
|
+
content: [
|
|
108
|
+
{
|
|
109
|
+
type: 'text',
|
|
110
|
+
text: `Failed to list meeting notes: ${response.message || 'Unknown error'}`,
|
|
111
|
+
},
|
|
112
|
+
],
|
|
113
|
+
isError: true,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
const { notes } = response.data;
|
|
117
|
+
if (!notes || notes.length === 0) {
|
|
118
|
+
return {
|
|
119
|
+
content: [
|
|
120
|
+
{
|
|
121
|
+
type: 'text',
|
|
122
|
+
text: `## Meeting #${meetingId} Notes\\n\\nNo notes found for this meeting.`,
|
|
123
|
+
},
|
|
124
|
+
],
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
let resultText = `## Meeting #${meetingId} Notes\\n\\n`;
|
|
128
|
+
resultText += `**Total Notes:** ${notes.length}\\n\\n`;
|
|
129
|
+
notes.forEach((note, index) => {
|
|
130
|
+
resultText += `### Note #${note.id}${note.visibility === 'private' ? ' 🔒 Private' : ''}\\n`;
|
|
131
|
+
resultText += `**Author:** ${note.author.name || note.author.email || 'Unknown'}\\n`;
|
|
132
|
+
resultText += `**Created:** ${new Date(note.createdAt).toLocaleString()}\\n`;
|
|
133
|
+
resultText += `**Content:**\\n${note.content}\\n`;
|
|
134
|
+
if (index < notes.length - 1) {
|
|
135
|
+
resultText += '\\n---\\n\\n';
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
return {
|
|
139
|
+
content: [
|
|
140
|
+
{
|
|
141
|
+
type: 'text',
|
|
142
|
+
text: resultText,
|
|
143
|
+
},
|
|
144
|
+
],
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
return {
|
|
149
|
+
content: [
|
|
150
|
+
{
|
|
151
|
+
type: 'text',
|
|
152
|
+
text: `Error listing meeting notes: ${error.message || 'Unknown error'}`,
|
|
153
|
+
},
|
|
154
|
+
],
|
|
155
|
+
isError: true,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
/**
|
|
160
|
+
* brxce_update_meeting_note - Update a meeting note
|
|
161
|
+
*/
|
|
162
|
+
server.registerTool('brxce_update_meeting_note', {
|
|
163
|
+
description: `Update a meeting note.
|
|
164
|
+
|
|
165
|
+
**When to use this tool:**
|
|
166
|
+
- User wants to edit their note
|
|
167
|
+
- User wants to change visibility (public ↔ private)
|
|
168
|
+
- Correcting or expanding on a previous note
|
|
169
|
+
|
|
170
|
+
**Access Control:**
|
|
171
|
+
- Only the note author can update their notes
|
|
172
|
+
- Cannot update other people's notes
|
|
173
|
+
|
|
174
|
+
**Input:**
|
|
175
|
+
- meetingId (required): ID of the meeting
|
|
176
|
+
- noteId (required): ID of the note to update
|
|
177
|
+
- content (optional): New note content
|
|
178
|
+
- visibility (optional): New visibility setting
|
|
179
|
+
|
|
180
|
+
**Example:**
|
|
181
|
+
User: "Update note #123 in meeting #24 to be private"
|
|
182
|
+
LLM calls: brxce_update_meeting_note(meetingId: 24, noteId: 123, visibility: "private")`,
|
|
183
|
+
inputSchema: {
|
|
184
|
+
meetingId: z.number().describe('Meeting ID'),
|
|
185
|
+
noteId: z.number().describe('Note ID to update'),
|
|
186
|
+
content: z.string().min(1).optional().describe('Updated note content'),
|
|
187
|
+
visibility: MeetingNoteVisibilitySchema.optional().describe('Updated visibility')
|
|
188
|
+
}
|
|
189
|
+
}, async (args) => {
|
|
190
|
+
const { meetingId, noteId, content, visibility } = args;
|
|
191
|
+
if (!content && !visibility) {
|
|
192
|
+
return {
|
|
193
|
+
content: [
|
|
194
|
+
{
|
|
195
|
+
type: 'text',
|
|
196
|
+
text: 'Error: You must provide either content or visibility to update',
|
|
197
|
+
},
|
|
198
|
+
],
|
|
199
|
+
isError: true,
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
try {
|
|
203
|
+
const updateData = {};
|
|
204
|
+
if (content)
|
|
205
|
+
updateData.content = content;
|
|
206
|
+
if (visibility)
|
|
207
|
+
updateData.visibility = visibility;
|
|
208
|
+
const response = await apiClient.put(`/mcp/meetings/${meetingId}/notes/${noteId}`, updateData);
|
|
209
|
+
if (!response.success) {
|
|
210
|
+
return {
|
|
211
|
+
content: [
|
|
212
|
+
{
|
|
213
|
+
type: 'text',
|
|
214
|
+
text: `Failed to update meeting note: ${response.message || 'Unknown error'}`,
|
|
215
|
+
},
|
|
216
|
+
],
|
|
217
|
+
isError: true,
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
const note = response.data;
|
|
221
|
+
let resultText = '## Meeting Note Updated\\n\\n';
|
|
222
|
+
resultText += `✅ **Note #${note.id} successfully updated**\\n\\n`;
|
|
223
|
+
if (content) {
|
|
224
|
+
resultText += `**New Content:**\\n${note.content}\\n\\n`;
|
|
225
|
+
}
|
|
226
|
+
if (visibility) {
|
|
227
|
+
resultText += `**New Visibility:** ${note.visibility === 'private' ? '🔒 Private' : '👁️ Public'}\\n\\n`;
|
|
228
|
+
}
|
|
229
|
+
resultText += `**Last Updated:** ${new Date(note.updatedAt).toLocaleString()}\\n`;
|
|
230
|
+
return {
|
|
231
|
+
content: [
|
|
232
|
+
{
|
|
233
|
+
type: 'text',
|
|
234
|
+
text: resultText,
|
|
235
|
+
},
|
|
236
|
+
],
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
catch (error) {
|
|
240
|
+
return {
|
|
241
|
+
content: [
|
|
242
|
+
{
|
|
243
|
+
type: 'text',
|
|
244
|
+
text: `Error updating meeting note: ${error.message || 'Unknown error'}`,
|
|
245
|
+
},
|
|
246
|
+
],
|
|
247
|
+
isError: true,
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
});
|
|
251
|
+
/**
|
|
252
|
+
* brxce_delete_meeting_note - Delete a meeting note
|
|
253
|
+
*/
|
|
254
|
+
server.registerTool('brxce_delete_meeting_note', {
|
|
255
|
+
description: `Delete a meeting note.
|
|
256
|
+
|
|
257
|
+
**When to use this tool:**
|
|
258
|
+
- User wants to remove a note they created
|
|
259
|
+
- Note contains incorrect or outdated information
|
|
260
|
+
- User accidentally created a duplicate note
|
|
261
|
+
|
|
262
|
+
**Access Control:**
|
|
263
|
+
- Only the note author can delete their notes
|
|
264
|
+
- Cannot delete other people's notes
|
|
265
|
+
- Deletion is permanent and cannot be undone
|
|
266
|
+
|
|
267
|
+
**Input:**
|
|
268
|
+
- meetingId (required): ID of the meeting
|
|
269
|
+
- noteId (required): ID of the note to delete
|
|
270
|
+
|
|
271
|
+
**Example:**
|
|
272
|
+
User: "Delete note #123 from meeting #24"
|
|
273
|
+
LLM calls: brxce_delete_meeting_note(meetingId: 24, noteId: 123)`,
|
|
274
|
+
inputSchema: {
|
|
275
|
+
meetingId: z.number().describe('Meeting ID'),
|
|
276
|
+
noteId: z.number().describe('Note ID to delete')
|
|
277
|
+
}
|
|
278
|
+
}, async (args) => {
|
|
279
|
+
const { meetingId, noteId } = args;
|
|
280
|
+
try {
|
|
281
|
+
const response = await apiClient.delete(`/mcp/meetings/${meetingId}/notes/${noteId}`);
|
|
282
|
+
if (!response.success) {
|
|
283
|
+
return {
|
|
284
|
+
content: [
|
|
285
|
+
{
|
|
286
|
+
type: 'text',
|
|
287
|
+
text: `Failed to delete meeting note: ${response.message || 'Unknown error'}`,
|
|
288
|
+
},
|
|
289
|
+
],
|
|
290
|
+
isError: true,
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
let resultText = '## Meeting Note Deleted\\n\\n';
|
|
294
|
+
resultText += `✅ **Note #${noteId} successfully deleted from Meeting #${meetingId}**\\n\\n`;
|
|
295
|
+
resultText += '⚠️ This action cannot be undone.\\n';
|
|
296
|
+
return {
|
|
297
|
+
content: [
|
|
298
|
+
{
|
|
299
|
+
type: 'text',
|
|
300
|
+
text: resultText,
|
|
301
|
+
},
|
|
302
|
+
],
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
catch (error) {
|
|
306
|
+
return {
|
|
307
|
+
content: [
|
|
308
|
+
{
|
|
309
|
+
type: 'text',
|
|
310
|
+
text: `Error deleting meeting note: ${error.message || 'Unknown error'}`,
|
|
311
|
+
},
|
|
312
|
+
],
|
|
313
|
+
isError: true,
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
//# sourceMappingURL=meeting-notes-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meeting-notes-tool.js","sourceRoot":"","sources":["../../src/tools/meeting-notes-tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import type { ApiClient } from '../services/api-client.js';
|
|
3
|
+
/**
|
|
4
|
+
* Register Meeting Update Tool with preview-first workflow
|
|
5
|
+
*/
|
|
6
|
+
export declare function registerMeetingUpdateTool(server: McpServer, apiClient: ApiClient): void;
|
|
7
|
+
//# sourceMappingURL=meeting-update-tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meeting-update-tool.d.ts","sourceRoot":"","sources":["../../src/tools/meeting-update-tool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAyD3D;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,QA0ThF"}
|