@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,369 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * Register WorkNode-related prompts for common user workflows
4
+ */
5
+ export function registerWorknodePrompts(server, apiClient) {
6
+ /**
7
+ * /my-active-work - Show work currently in progress
8
+ */
9
+ server.registerPrompt('my-active-work', {
10
+ description: '현재 진행 중인 나의 작업 목록 (in_progress)',
11
+ argsSchema: {
12
+ workspaceId: z.string().optional().describe('Workspace ID to filter (optional - shows all workspaces if omitted)'),
13
+ },
14
+ }, async (args) => {
15
+ const workspaceId = args.workspaceId ? Number(args.workspaceId) : undefined;
16
+ try {
17
+ // Build query string
18
+ const params = new URLSearchParams({
19
+ mode: 'active',
20
+ scope: 'both',
21
+ });
22
+ if (workspaceId) {
23
+ params.append('workspaceId', workspaceId.toString());
24
+ }
25
+ const response = await apiClient.get(`/mcp/worknodes/my-work?${params.toString()}`);
26
+ if (!response.success || !response.data) {
27
+ return {
28
+ messages: [
29
+ {
30
+ role: 'user',
31
+ content: {
32
+ type: 'text',
33
+ text: '현재 진행 중인 작업을 가져오는 데 실패했습니다.',
34
+ },
35
+ },
36
+ ],
37
+ };
38
+ }
39
+ const { data, meta } = response;
40
+ // Format WorkNodes into readable text
41
+ let workSummary = `# 🚀 현재 진행 중인 작업 (${meta.total}개)\n\n`;
42
+ if (meta.workspace) {
43
+ workSummary += `**Workspace**: #${meta.workspace}\n\n`;
44
+ }
45
+ if (data.length === 0) {
46
+ workSummary += '진행 중인 작업이 없습니다. 새로운 작업을 시작하시겠습니까?\n';
47
+ }
48
+ else {
49
+ // Group by status
50
+ const byStatus = {};
51
+ data.forEach((node) => {
52
+ if (!byStatus[node.status]) {
53
+ byStatus[node.status] = [];
54
+ }
55
+ byStatus[node.status].push(node);
56
+ });
57
+ // Display by status
58
+ for (const [status, nodes] of Object.entries(byStatus)) {
59
+ const statusEmoji = status === 'in_progress' ? '⏳' : '👀';
60
+ workSummary += `## ${statusEmoji} ${status.toUpperCase()} (${nodes.length})\n\n`;
61
+ nodes.forEach(node => {
62
+ const priority = node.priority ? ` [${node.priority}]` : '';
63
+ const dueDate = node.dueDate ? ` 📅 ${new Date(node.dueDate).toLocaleDateString()}` : '';
64
+ const assignees = node.assignee && node.assignee.length > 0 ? ` 👤 ${node.assignee.length} assignee(s)` : '';
65
+ workSummary += `- **${node.title}**${priority}${dueDate}${assignees}\n`;
66
+ workSummary += ` - ID: #${node.id} | Type: ${node.nodeType} | Progress: ${node.progress}%\n`;
67
+ if (node.description) {
68
+ workSummary += ` - ${node.description}\n`;
69
+ }
70
+ workSummary += '\n';
71
+ });
72
+ }
73
+ }
74
+ return {
75
+ messages: [
76
+ {
77
+ role: 'user',
78
+ content: {
79
+ type: 'text',
80
+ text: workSummary,
81
+ },
82
+ },
83
+ ],
84
+ };
85
+ }
86
+ catch (error) {
87
+ return {
88
+ messages: [
89
+ {
90
+ role: 'user',
91
+ content: {
92
+ type: 'text',
93
+ text: `Error fetching active work: ${error.message}`,
94
+ },
95
+ },
96
+ ],
97
+ };
98
+ }
99
+ });
100
+ /**
101
+ * /my-completed-work - Show completed work with time filter
102
+ */
103
+ server.registerPrompt('my-completed-work', {
104
+ description: '완료한 나의 작업 목록 (시간 범위 필터 가능)',
105
+ argsSchema: {
106
+ since: z.string().optional().describe('Time filter: today, yesterday, this-week, last-week, this-month, last-month (default: today)'),
107
+ workspaceId: z.string().optional().describe('Workspace ID to filter (optional)'),
108
+ },
109
+ }, async (args) => {
110
+ const since = args.since || 'today';
111
+ const workspaceId = args.workspaceId ? Number(args.workspaceId) : undefined;
112
+ try {
113
+ const params = new URLSearchParams({
114
+ mode: 'completed',
115
+ scope: 'both',
116
+ completedSince: since,
117
+ });
118
+ if (workspaceId) {
119
+ params.append('workspaceId', workspaceId.toString());
120
+ }
121
+ const response = await apiClient.get(`/mcp/worknodes/my-work?${params.toString()}`);
122
+ if (!response.success || !response.data) {
123
+ return {
124
+ messages: [
125
+ {
126
+ role: 'user',
127
+ content: {
128
+ type: 'text',
129
+ text: '완료한 작업을 가져오는 데 실패했습니다.',
130
+ },
131
+ },
132
+ ],
133
+ };
134
+ }
135
+ const { data, meta } = response;
136
+ const timeLabel = {
137
+ 'today': '오늘',
138
+ 'yesterday': '어제',
139
+ 'this-week': '이번 주',
140
+ 'last-week': '지난 주',
141
+ 'this-month': '이번 달',
142
+ 'last-month': '지난 달',
143
+ }[since] || since;
144
+ let workSummary = `# ✅ ${timeLabel} 완료한 작업 (${meta.total}개)\n\n`;
145
+ if (data.length === 0) {
146
+ workSummary += `${timeLabel}에 완료한 작업이 없습니다.\n`;
147
+ }
148
+ else {
149
+ data.forEach(node => {
150
+ const completedAt = node.completedAt ? new Date(node.completedAt).toLocaleString() : 'N/A';
151
+ const priority = node.priority ? ` [${node.priority}]` : '';
152
+ workSummary += `- **${node.title}**${priority}\n`;
153
+ workSummary += ` - ID: #${node.id} | Type: ${node.nodeType} | Completed: ${completedAt}\n`;
154
+ if (node.description) {
155
+ workSummary += ` - ${node.description}\n`;
156
+ }
157
+ workSummary += '\n';
158
+ });
159
+ }
160
+ return {
161
+ messages: [
162
+ {
163
+ role: 'user',
164
+ content: {
165
+ type: 'text',
166
+ text: workSummary,
167
+ },
168
+ },
169
+ ],
170
+ };
171
+ }
172
+ catch (error) {
173
+ return {
174
+ messages: [
175
+ {
176
+ role: 'user',
177
+ content: {
178
+ type: 'text',
179
+ text: `Error fetching completed work: ${error.message}`,
180
+ },
181
+ },
182
+ ],
183
+ };
184
+ }
185
+ });
186
+ /**
187
+ * /my-urgent-tasks - Show urgent/due-soon tasks
188
+ */
189
+ server.registerPrompt('my-urgent-tasks', {
190
+ description: '긴급하거나 곧 마감인 작업 목록 (critical/urgent 우선순위 또는 마감임박)',
191
+ argsSchema: {
192
+ dueWithin: z.string().optional().describe('Due date filter: today, tomorrow, this-week, next-week (default: today)'),
193
+ workspaceId: z.string().optional().describe('Workspace ID to filter (optional)'),
194
+ },
195
+ }, async (args) => {
196
+ const dueWithin = args.dueWithin || 'today';
197
+ const workspaceId = args.workspaceId ? Number(args.workspaceId) : undefined;
198
+ try {
199
+ const params = new URLSearchParams({
200
+ mode: 'urgent',
201
+ scope: 'both',
202
+ dueWithin,
203
+ });
204
+ if (workspaceId) {
205
+ params.append('workspaceId', workspaceId.toString());
206
+ }
207
+ const response = await apiClient.get(`/mcp/worknodes/my-work?${params.toString()}`);
208
+ if (!response.success || !response.data) {
209
+ return {
210
+ messages: [
211
+ {
212
+ role: 'user',
213
+ content: {
214
+ type: 'text',
215
+ text: '긴급 작업을 가져오는 데 실패했습니다.',
216
+ },
217
+ },
218
+ ],
219
+ };
220
+ }
221
+ const { data, meta } = response;
222
+ const dueLabel = {
223
+ 'today': '오늘',
224
+ 'tomorrow': '내일',
225
+ 'this-week': '이번 주',
226
+ 'next-week': '다음 주',
227
+ }[dueWithin] || dueWithin;
228
+ let workSummary = `# 🚨 긴급 작업 (${dueLabel} 마감 또는 high priority) - ${meta.total}개\n\n`;
229
+ if (data.length === 0) {
230
+ workSummary += `긴급한 작업이 없습니다. 잘하고 계시네요! 👍\n`;
231
+ }
232
+ else {
233
+ // Sort by priority and due date
234
+ const sortedData = data.sort((a, b) => {
235
+ const priorityOrder = { critical: 0, urgent: 1, high: 2, medium: 3, low: 4 };
236
+ const aPriority = priorityOrder[a.priority] ?? 5;
237
+ const bPriority = priorityOrder[b.priority] ?? 5;
238
+ if (aPriority !== bPriority)
239
+ return aPriority - bPriority;
240
+ if (a.dueDate && b.dueDate) {
241
+ return new Date(a.dueDate).getTime() - new Date(b.dueDate).getTime();
242
+ }
243
+ return 0;
244
+ });
245
+ sortedData.forEach((node, index) => {
246
+ const priorityEmoji = {
247
+ critical: '🔥',
248
+ urgent: '⚡',
249
+ high: '🔴',
250
+ medium: '🟡',
251
+ low: '🟢',
252
+ };
253
+ const emoji = node.priority ? (priorityEmoji[node.priority] || '') : '';
254
+ const priority = node.priority ? `${emoji} [${node.priority}]` : '';
255
+ const dueDate = node.dueDate ? ` 📅 ${new Date(node.dueDate).toLocaleString()}` : '';
256
+ const status = node.status ? ` (${node.status})` : '';
257
+ workSummary += `${index + 1}. **${node.title}**${priority}${dueDate}${status}\n`;
258
+ workSummary += ` - ID: #${node.id} | Type: ${node.nodeType} | Progress: ${node.progress}%\n`;
259
+ if (node.description) {
260
+ workSummary += ` - ${node.description}\n`;
261
+ }
262
+ workSummary += '\n';
263
+ });
264
+ }
265
+ return {
266
+ messages: [
267
+ {
268
+ role: 'user',
269
+ content: {
270
+ type: 'text',
271
+ text: workSummary,
272
+ },
273
+ },
274
+ ],
275
+ };
276
+ }
277
+ catch (error) {
278
+ return {
279
+ messages: [
280
+ {
281
+ role: 'user',
282
+ content: {
283
+ type: 'text',
284
+ text: `Error fetching urgent tasks: ${error.message}`,
285
+ },
286
+ },
287
+ ],
288
+ };
289
+ }
290
+ });
291
+ /**
292
+ * /my-inbox - Show inbox (backlog) items
293
+ */
294
+ server.registerPrompt('my-inbox', {
295
+ description: '인박스(backlog) 항목 목록 - 아직 정리되지 않은 작업들',
296
+ argsSchema: {
297
+ workspaceId: z.string().optional().describe('Workspace ID to filter (optional)'),
298
+ },
299
+ }, async (args) => {
300
+ const workspaceId = args.workspaceId ? Number(args.workspaceId) : undefined;
301
+ try {
302
+ const params = new URLSearchParams({
303
+ mode: 'inbox',
304
+ scope: 'both',
305
+ });
306
+ if (workspaceId) {
307
+ params.append('workspaceId', workspaceId.toString());
308
+ }
309
+ const response = await apiClient.get(`/mcp/worknodes/my-work?${params.toString()}`);
310
+ if (!response.success || !response.data) {
311
+ return {
312
+ messages: [
313
+ {
314
+ role: 'user',
315
+ content: {
316
+ type: 'text',
317
+ text: '인박스 항목을 가져오는 데 실패했습니다.',
318
+ },
319
+ },
320
+ ],
321
+ };
322
+ }
323
+ const { data, meta } = response;
324
+ let workSummary = `# 📥 인박스 (Backlog) - ${meta.total}개\n\n`;
325
+ workSummary += '*아직 정리되지 않은 작업들입니다. 적절한 프로젝트/목표에 할당하거나 시작 상태로 변경하세요.*\n\n';
326
+ if (data.length === 0) {
327
+ workSummary += `인박스가 비어있습니다. Inbox Zero 달성! 🎉\n`;
328
+ }
329
+ else {
330
+ data.forEach((node, index) => {
331
+ const priority = node.priority ? ` [${node.priority}]` : '';
332
+ const createdAt = new Date(node.createdAt).toLocaleDateString();
333
+ workSummary += `${index + 1}. **${node.title}**${priority}\n`;
334
+ workSummary += ` - ID: #${node.id} | Type: ${node.nodeType} | Created: ${createdAt}\n`;
335
+ if (node.description) {
336
+ workSummary += ` - ${node.description}\n`;
337
+ }
338
+ workSummary += '\n';
339
+ });
340
+ workSummary += `\n💡 **제안**: 이 항목들을 적절한 프로젝트나 목표에 할당하거나, 불필요한 항목은 삭제하는 것이 좋습니다.\n`;
341
+ }
342
+ return {
343
+ messages: [
344
+ {
345
+ role: 'user',
346
+ content: {
347
+ type: 'text',
348
+ text: workSummary,
349
+ },
350
+ },
351
+ ],
352
+ };
353
+ }
354
+ catch (error) {
355
+ return {
356
+ messages: [
357
+ {
358
+ role: 'user',
359
+ content: {
360
+ type: 'text',
361
+ text: `Error fetching inbox: ${error.message}`,
362
+ },
363
+ },
364
+ ],
365
+ };
366
+ }
367
+ });
368
+ }
369
+ //# sourceMappingURL=worknode-prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worknode-prompts.js","sourceRoot":"","sources":["../../src/prompts/worknode-prompts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { ApiClient } from '../services/api-client.js';
3
+ export declare function registerWorkspaceContextPrompt(server: McpServer, apiClient: ApiClient): void;
4
+ //# sourceMappingURL=workspace-context-prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-context-prompt.d.ts","sourceRoot":"","sources":["../../src/prompts/workspace-context-prompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAG3D,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,QA+GrF"}
@@ -0,0 +1,101 @@
1
+ import { z } from 'zod';
2
+ export function registerWorkspaceContextPrompt(server, apiClient) {
3
+ server.registerPrompt('workspace-context', {
4
+ description: `Establish workspace context before performing workspace-specific operations.
5
+
6
+ **When to use this prompt:**
7
+ - At the start of any workspace-related task
8
+ - When user mentions workspace-specific operations without specifying workspace
9
+ - Before calling any tool that requires workspaceId
10
+
11
+ **This prompt will:**
12
+ 1. Fetch all available workspaces for the authenticated user
13
+ 2. Present them in a clear, selectable format
14
+ 3. Return the selected workspaceId and workspace details
15
+ 4. Set up context for subsequent tool calls
16
+
17
+ **Output Format:**
18
+ Returns formatted workspace list with:
19
+ - Workspace ID (for tool calls)
20
+ - Workspace name
21
+ - Member count
22
+ - User's role in each workspace
23
+ - Default workspace indicator`,
24
+ argsSchema: {
25
+ userIntent: z.string().optional().describe('User\'s original request to help with workspace selection')
26
+ }
27
+ }, async (args) => {
28
+ try {
29
+ // Fetch user with all workspaces
30
+ const response = await apiClient.get('/mcp/user/me');
31
+ if (!response.success || !response.data) {
32
+ return {
33
+ messages: [{
34
+ role: 'assistant',
35
+ content: {
36
+ type: 'text',
37
+ text: 'Failed to fetch workspace information. Please check your authentication.'
38
+ }
39
+ }]
40
+ };
41
+ }
42
+ const { user, workspaces } = response.data;
43
+ if (!workspaces || workspaces.length === 0) {
44
+ return {
45
+ messages: [{
46
+ role: 'assistant',
47
+ content: {
48
+ type: 'text',
49
+ text: '⚠️ No workspaces found. You need to be a member of at least one workspace to continue.'
50
+ }
51
+ }]
52
+ };
53
+ }
54
+ // Format workspace list
55
+ let prompt = `# Available Workspaces for ${user.name || user.username}\n\n`;
56
+ prompt += `You have access to ${workspaces.length} workspace(s):\n\n`;
57
+ workspaces.forEach((ws, index) => {
58
+ const isDefault = ws.id === user.defaultWorkspaceId;
59
+ const role = ws.members.find((m) => m.user.id === user.id)?.role || 'member';
60
+ prompt += `${index + 1}. **${ws.name}** (ID: ${ws.id})${isDefault ? ' 🌟 DEFAULT' : ''}\n`;
61
+ prompt += ` - Your role: ${role}\n`;
62
+ prompt += ` - Members: ${ws.members.length}\n`;
63
+ if (ws.description) {
64
+ prompt += ` - Description: ${ws.description}\n`;
65
+ }
66
+ prompt += `\n`;
67
+ });
68
+ prompt += `\n---\n\n`;
69
+ prompt += `**Next Steps:**\n`;
70
+ prompt += `1. Identify which workspace the user's request relates to\n`;
71
+ prompt += `2. If unclear, ask the user to select from the list above\n`;
72
+ prompt += `3. Use the selected workspace ID in subsequent tool calls\n`;
73
+ prompt += `4. NEVER use arbitrary or guessed workspace IDs\n\n`;
74
+ if (args.userIntent) {
75
+ prompt += `**User's Original Request:** "${args.userIntent}"\n\n`;
76
+ prompt += `Based on this request, determine which workspace is most appropriate or ask the user to clarify.\n`;
77
+ }
78
+ return {
79
+ messages: [{
80
+ role: 'assistant',
81
+ content: {
82
+ type: 'text',
83
+ text: prompt
84
+ }
85
+ }]
86
+ };
87
+ }
88
+ catch (error) {
89
+ return {
90
+ messages: [{
91
+ role: 'assistant',
92
+ content: {
93
+ type: 'text',
94
+ text: `Error fetching workspace context: ${error.message}`
95
+ }
96
+ }]
97
+ };
98
+ }
99
+ });
100
+ }
101
+ //# sourceMappingURL=workspace-context-prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-context-prompt.js","sourceRoot":"","sources":["../../src/prompts/workspace-context-prompt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { ApiClient } from '../services/api-client.js';
3
+ export declare function registerUserResource(server: McpServer, apiClient: ApiClient): void;
4
+ //# sourceMappingURL=user-resource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-resource.d.ts","sourceRoot":"","sources":["../../src/resources/user-resource.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAmDtD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,QA4C3E"}
@@ -0,0 +1,40 @@
1
+ export function registerUserResource(server, apiClient) {
2
+ server.resource('Current User with Workspaces', 'user://me', async (uri) => {
3
+ try {
4
+ const response = await apiClient.get('/mcp/user/me');
5
+ if (!response.success) {
6
+ throw new Error('Failed to fetch user and workspaces');
7
+ }
8
+ const { user, workspaces } = response.data;
9
+ const workspacesWithMembers = workspaces.map((workspace) => {
10
+ const members = workspace.members?.map((member) => ({
11
+ id: member.userId,
12
+ nickname: member.name ?? member.username ?? '',
13
+ role: member.role ?? null,
14
+ joinedAt: member.joinedAt,
15
+ })) ?? [];
16
+ return {
17
+ ...workspace,
18
+ members,
19
+ };
20
+ });
21
+ const payload = {
22
+ user,
23
+ workspaces: workspacesWithMembers,
24
+ };
25
+ return {
26
+ contents: [
27
+ {
28
+ uri: uri.toString(),
29
+ mimeType: 'application/json',
30
+ text: JSON.stringify(payload, null, 2),
31
+ },
32
+ ],
33
+ };
34
+ }
35
+ catch (error) {
36
+ throw new Error(`Failed to fetch user: ${error}`);
37
+ }
38
+ });
39
+ }
40
+ //# sourceMappingURL=user-resource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-resource.js","sourceRoot":"","sources":["../../src/resources/user-resource.ts"],"names":[],"mappings":"AAoDA,MAAM,UAAU,oBAAoB,CAAC,MAAiB,EAAE,SAAoB;IAC1E,MAAM,CAAC,QAAQ,CAAC,8BAA8B,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACzE,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,GAAG,CAA6B,cAAc,CAAC,CAAC;YAEjF,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;gBACtB,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;YACzD,CAAC;YAED,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC;YAE3C,MAAM,qBAAqB,GAAgB,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE;gBACtE,MAAM,OAAO,GACX,SAAS,CAAC,OAAO,EAAE,GAAG,CAAyB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;oBAC1D,EAAE,EAAE,MAAM,CAAC,MAAM;oBACjB,QAAQ,EAAE,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,QAAQ,IAAI,EAAE;oBAC9C,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,IAAI;oBACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ;iBAC1B,CAAC,CAAC,IAAI,EAAE,CAAC;gBAEZ,OAAO;oBACL,GAAG,SAAS;oBACZ,OAAO;iBACR,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,MAAM,OAAO,GAAG;gBACd,IAAI;gBACJ,UAAU,EAAE,qBAAqB;aAClC,CAAC;YAEF,OAAO;gBACL,QAAQ,EAAE;oBACR;wBACE,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE;wBACnB,QAAQ,EAAE,kBAAkB;wBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;qBACvC;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,yBAAyB,KAAK,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { ApiClient } from '../services/api-client.js';
3
+ export declare function registerWorkspaceMembersResource(server: McpServer, apiClient: ApiClient): void;
4
+ //# sourceMappingURL=workspace-members-resource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-members-resource.d.ts","sourceRoot":"","sources":["../../src/resources/workspace-members-resource.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAoBtD,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,QA2CvF"}
@@ -0,0 +1,39 @@
1
+ import { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export function registerWorkspaceMembersResource(server, apiClient) {
3
+ // Workspace members resource (dynamic template)
4
+ const workspaceMembersTemplate = new ResourceTemplate('workspace://{workspaceId}/members', {
5
+ list: undefined, // No listing callback needed
6
+ });
7
+ server.resource('Workspace Members', workspaceMembersTemplate, async (uri, variables) => {
8
+ const workspaceId = variables.workspaceId;
9
+ try {
10
+ const response = await apiClient.get(`/mcp/workspaces/${workspaceId}/members`);
11
+ // Format member list for LLM consumption
12
+ const membersList = response.data.members.map((m, i) => `${i + 1}. ${m.name || m.email} (${m.role})\n - User ID: ${m.userId}\n - Email: ${m.email || 'N/A'}\n - Joined: ${new Date(m.joinedAt).toLocaleDateString()}`).join('\n\n');
13
+ const formattedText = `# Workspace Members: ${response.data.workspaceName}
14
+
15
+ **Workspace ID:** ${response.data.workspaceId}
16
+ **Total Members:** ${response.data.members.length}
17
+
18
+ ## Members
19
+
20
+ ${membersList}
21
+
22
+ ---
23
+ *Use these user IDs when creating meetings or assigning participants.*`;
24
+ return {
25
+ contents: [
26
+ {
27
+ uri: uri.toString(),
28
+ mimeType: 'text/markdown',
29
+ text: formattedText,
30
+ },
31
+ ],
32
+ };
33
+ }
34
+ catch (error) {
35
+ throw new Error(`Failed to fetch workspace members for workspace ${workspaceId}: ${error}`);
36
+ }
37
+ });
38
+ }
39
+ //# sourceMappingURL=workspace-members-resource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-members-resource.js","sourceRoot":"","sources":["../../src/resources/workspace-members-resource.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAqB3E,MAAM,UAAU,gCAAgC,CAAC,MAAiB,EAAE,SAAoB;IACtF,gDAAgD;IAChD,MAAM,wBAAwB,GAAG,IAAI,gBAAgB,CAAC,mCAAmC,EAAE;QACzF,IAAI,EAAE,SAAS,EAAE,6BAA6B;KAC/C,CAAC,CAAC;IAEH,MAAM,CAAC,QAAQ,CAAC,mBAAmB,EAAE,wBAAwB,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE;QACtF,MAAM,WAAW,GAAG,SAAS,CAAC,WAAW,CAAC;QAC1C,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,GAAG,CAClC,mBAAmB,WAAW,UAAU,CACzC,CAAC;YAEF,yCAAyC;YACzC,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACrD,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,IAAI,oBAAoB,CAAC,CAAC,MAAM,iBAAiB,CAAC,CAAC,KAAK,IAAI,KAAK,kBAAkB,IAAI,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,kBAAkB,EAAE,EAAE,CACpK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAEf,MAAM,aAAa,GAAG,wBAAwB,QAAQ,CAAC,IAAI,CAAC,aAAa;;oBAE3D,QAAQ,CAAC,IAAI,CAAC,WAAW;qBACxB,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM;;;;EAI/C,WAAW;;;uEAG0D,CAAC;YAElE,OAAO;gBACL,QAAQ,EAAE;oBACR;wBACE,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE;wBACnB,QAAQ,EAAE,eAAe;wBACzB,IAAI,EAAE,aAAa;qBACpB;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,mDAAmD,WAAW,KAAK,KAAK,EAAE,CAAC,CAAC;QAC9F,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { ApiClient } from '../services/api-client.js';
3
+ export declare function registerWorkspaceResource(server: McpServer, apiClient: ApiClient): void;
4
+ //# sourceMappingURL=workspace-resource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-resource.d.ts","sourceRoot":"","sources":["../../src/resources/workspace-resource.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAetD,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,QAyBhF"}
@@ -0,0 +1,27 @@
1
+ import { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export function registerWorkspaceResource(server, apiClient) {
3
+ // Individual workspace resource (dynamic template)
4
+ // Note: Workspace list is now included in user://me resource
5
+ const workspaceTemplate = new ResourceTemplate('workspace://{id}', {
6
+ list: undefined, // No listing callback needed
7
+ });
8
+ server.resource('Workspace', workspaceTemplate, async (uri, variables) => {
9
+ const workspaceId = variables.id;
10
+ try {
11
+ const workspace = await apiClient.get(`/workspaces/${workspaceId}`);
12
+ return {
13
+ contents: [
14
+ {
15
+ uri: uri.toString(),
16
+ mimeType: 'application/json',
17
+ text: JSON.stringify(workspace, null, 2),
18
+ },
19
+ ],
20
+ };
21
+ }
22
+ catch (error) {
23
+ throw new Error(`Failed to fetch workspace ${workspaceId}: ${error}`);
24
+ }
25
+ });
26
+ }
27
+ //# sourceMappingURL=workspace-resource.js.map