@brxce/mcp-server 1.0.0 → 1.0.1
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 +3 -3
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +24 -10
- package/dist/index.js.map +1 -1
- package/dist/prompts/worknode-prompts.d.ts.map +1 -1
- package/dist/prompts/worknode-prompts.js +43 -15
- package/dist/prompts/worknode-prompts.js.map +1 -1
- package/dist/prompts/workspace-context-prompt.js +6 -6
- package/dist/prompts/workspace-context-prompt.js.map +1 -1
- package/dist/resources/user-resource.d.ts.map +1 -1
- package/dist/resources/user-resource.js +12 -1
- package/dist/resources/user-resource.js.map +1 -1
- package/dist/resources/workspace-members-resource.d.ts.map +1 -1
- package/dist/resources/workspace-members-resource.js +12 -3
- package/dist/resources/workspace-members-resource.js.map +1 -1
- package/dist/resources/workspace-resource.d.ts.map +1 -1
- package/dist/resources/workspace-resource.js +9 -1
- package/dist/resources/workspace-resource.js.map +1 -1
- package/dist/services/api-client.d.ts.map +1 -1
- package/dist/services/api-client.js +2 -6
- package/dist/services/api-client.js.map +1 -1
- package/dist/tools/meeting-agenda-tool.js +1 -1
- package/dist/tools/meeting-agenda-tool.js.map +1 -1
- package/dist/tools/meeting-create-tool.d.ts.map +1 -1
- package/dist/tools/meeting-create-tool.js +2 -2
- package/dist/tools/meeting-create-tool.js.map +1 -1
- package/dist/tools/meeting-decisions-tool.js +1 -1
- package/dist/tools/meeting-decisions-tool.js.map +1 -1
- package/dist/tools/meeting-list-tool.d.ts.map +1 -1
- package/dist/tools/meeting-list-tool.js +1 -1
- package/dist/tools/meeting-list-tool.js.map +1 -1
- package/dist/tools/tag-category-tool.js +4 -4
- package/dist/tools/tag-category-tool.js.map +1 -1
- package/dist/tools/tag-search-tool.js +3 -3
- package/dist/tools/tag-search-tool.js.map +1 -1
- package/dist/tools/tag-tool.js +5 -5
- package/dist/tools/tag-tool.js.map +1 -1
- package/dist/tools/worknode-archive-tool.d.ts.map +1 -1
- package/dist/tools/worknode-archive-tool.js +2 -2
- package/dist/tools/worknode-archive-tool.js.map +1 -1
- package/dist/tools/worknode-create-tool.d.ts.map +1 -1
- package/dist/tools/worknode-create-tool.js +113 -225
- package/dist/tools/worknode-create-tool.js.map +1 -1
- package/dist/tools/worknode-my-work-tool.d.ts.map +1 -1
- package/dist/tools/worknode-my-work-tool.js +1 -8
- package/dist/tools/worknode-my-work-tool.js.map +1 -1
- package/dist/tools/worknode-plan-organize-tool.d.ts +4 -0
- package/dist/tools/worknode-plan-organize-tool.d.ts.map +1 -0
- package/dist/tools/worknode-plan-organize-tool.js +356 -0
- package/dist/tools/worknode-plan-organize-tool.js.map +1 -0
- package/dist/tools/worknode-read-tool.d.ts +4 -0
- package/dist/tools/worknode-read-tool.d.ts.map +1 -0
- package/dist/tools/worknode-read-tool.js +312 -0
- package/dist/tools/worknode-read-tool.js.map +1 -0
- package/dist/tools/worknode-search-tool.d.ts.map +1 -1
- package/dist/tools/worknode-search-tool.js +25 -44
- package/dist/tools/worknode-search-tool.js.map +1 -1
- package/dist/tools/worknode-subtree-tool.d.ts.map +1 -1
- package/dist/tools/worknode-subtree-tool.js +8 -12
- package/dist/tools/worknode-subtree-tool.js.map +1 -1
- package/dist/tools/worknode-tag-tool.js +8 -8
- package/dist/tools/worknode-tag-tool.js.map +1 -1
- package/dist/tools/worknode-update-tool.d.ts.map +1 -1
- package/dist/tools/worknode-update-tool.js +104 -173
- package/dist/tools/worknode-update-tool.js.map +1 -1
- package/dist/tools/workspace-inbox-tool.d.ts.map +1 -1
- package/dist/tools/workspace-inbox-tool.js +3 -2
- package/dist/tools/workspace-inbox-tool.js.map +1 -1
- package/dist/tools/workspace-list-tool.d.ts +8 -0
- package/dist/tools/workspace-list-tool.d.ts.map +1 -0
- package/dist/tools/workspace-list-tool.js +113 -0
- package/dist/tools/workspace-list-tool.js.map +1 -0
- package/dist/tools/workspace-members-list-tool.d.ts +8 -0
- package/dist/tools/workspace-members-list-tool.d.ts.map +1 -0
- package/dist/tools/workspace-members-list-tool.js +207 -0
- package/dist/tools/workspace-members-list-tool.js.map +1 -0
- package/dist/tools/workspace-statistics-tool.d.ts +8 -0
- package/dist/tools/workspace-statistics-tool.d.ts.map +1 -0
- package/dist/tools/workspace-statistics-tool.js +300 -0
- package/dist/tools/workspace-statistics-tool.js.map +1 -0
- package/dist/tools/workspace-tree-tool.d.ts.map +1 -1
- package/dist/tools/workspace-tree-tool.js +6 -12
- package/dist/tools/workspace-tree-tool.js.map +1 -1
- package/package.json +11 -10
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-list-tool.js","sourceRoot":"","sources":["../../src/tools/workspace-list-tool.ts"],"names":[],"mappings":"AAkBA;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,MAAiB,EAAE,SAAoB;IAC/E,MAAM,CAAC,YAAY,CACjB,uBAAuB,EACvB;QACE,WAAW,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0DAkDuC;QACpD,WAAW,EAAE,EAAE;KAChB,EACD,KAAK,EAAE,IAAyB,EAAE,EAAE;QAClC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,GAAG,CAAwB,iBAAiB,CAAC,CAAC;YAE/E,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACxC,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gCACnB,KAAK,EAAE,4BAA4B;gCACnC,OAAO,EAAE,oCAAoC;6BAC9C,CAAC;yBACH;qBACF;oBACD,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;YAED,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC;YAEjC,2CAA2C;YAC3C,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;4BACE,KAAK,EAAE,UAAU,CAAC,MAAM;4BACxB,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;gCAClC,EAAE,EAAE,EAAE,CAAC,EAAE;gCACT,IAAI,EAAE,EAAE,CAAC,IAAI;gCACb,IAAI,EAAE,EAAE,CAAC,IAAI;gCACb,IAAI,EAAE,EAAE,CAAC,aAAa;gCACtB,IAAI,EAAE,EAAE,CAAC,QAAQ;gCACjB,QAAQ,EAAE,EAAE,CAAC,QAAQ;6BACtB,CAAC,CAAC;yBACJ,EACD,IAAI,EACJ,CAAC,CACF;qBACF;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,KAAK,EAAE,4BAA4B;4BACnC,OAAO,EAAE,KAAK,CAAC,OAAO;yBACvB,CAAC;qBACH;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import type { ApiClient } from '../services/api-client.js';
|
|
3
|
+
/**
|
|
4
|
+
* Register Workspace Members List tool for LLM-invoked queries
|
|
5
|
+
* This tool allows the LLM to list all members of a specific workspace
|
|
6
|
+
*/
|
|
7
|
+
export declare function registerWorkspaceMembersListTool(server: McpServer, apiClient: ApiClient): void;
|
|
8
|
+
//# sourceMappingURL=workspace-members-list-tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-members-list-tool.d.ts","sourceRoot":"","sources":["../../src/tools/workspace-members-list-tool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAqB3D;;;GAGG;AACH,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,QAwNvF"}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* Register Workspace Members List tool for LLM-invoked queries
|
|
4
|
+
* This tool allows the LLM to list all members of a specific workspace
|
|
5
|
+
*/
|
|
6
|
+
export function registerWorkspaceMembersListTool(server, apiClient) {
|
|
7
|
+
server.registerTool('brxce_list_workspace_members', {
|
|
8
|
+
description: `List all members of a specific workspace.
|
|
9
|
+
|
|
10
|
+
⚠️ **CRITICAL: Workspace Verification Required**
|
|
11
|
+
Before calling this tool, you MUST:
|
|
12
|
+
1. Read the \`user://me\` resource to get available workspaces
|
|
13
|
+
2. Identify the correct workspaceId from the resource data
|
|
14
|
+
3. If user doesn't specify workspace, use their default workspace
|
|
15
|
+
4. NEVER assume or guess workspaceId values
|
|
16
|
+
|
|
17
|
+
**Example Workflow:**
|
|
18
|
+
\`\`\`
|
|
19
|
+
User: "Who are the members of BRXCE Development workspace?"
|
|
20
|
+
LLM:
|
|
21
|
+
1. Reads user://me resource
|
|
22
|
+
2. Finds workspace: {id: 138, name: "BRXCE Development"}
|
|
23
|
+
3. Calls brxce_list_workspace_members with workspaceId: 138
|
|
24
|
+
\`\`\`
|
|
25
|
+
|
|
26
|
+
**When to use this tool:**
|
|
27
|
+
The LLM should call this tool when the user asks about:
|
|
28
|
+
- "Who are the members of workspace X?"
|
|
29
|
+
- "Show me team members"
|
|
30
|
+
- "Who can I assign this task to?"
|
|
31
|
+
- "List all people in this workspace"
|
|
32
|
+
- When creating meetings and need to select participants
|
|
33
|
+
|
|
34
|
+
**Output Format:**
|
|
35
|
+
Returns JSON with:
|
|
36
|
+
- workspaceId: The workspace ID
|
|
37
|
+
- workspaceName: The workspace name
|
|
38
|
+
- totalMembers: Total number of members
|
|
39
|
+
- members: Array of member objects
|
|
40
|
+
- userId: User ID (use this for assignee/participant fields)
|
|
41
|
+
- email: Email address
|
|
42
|
+
- name: Display name
|
|
43
|
+
- role: Role in workspace (e.g., "owner", "admin", "member")
|
|
44
|
+
- joinedAt: When they joined (ISO 8601, UTC)
|
|
45
|
+
|
|
46
|
+
**Best Practices:**
|
|
47
|
+
1. Always verify workspaceId exists via user://me resource first
|
|
48
|
+
2. Use userId when assigning WorkNodes or adding meeting participants
|
|
49
|
+
3. Show user-friendly names (name or username) in UI, but use userId internally
|
|
50
|
+
4. Cache member list to avoid repeated calls during task assignment
|
|
51
|
+
|
|
52
|
+
**Common Use Cases:**
|
|
53
|
+
1. **Meeting Creation**: Get member list to select participants
|
|
54
|
+
\`\`\`
|
|
55
|
+
User: "Create a meeting with the team"
|
|
56
|
+
LLM:
|
|
57
|
+
1. Get workspace ID from context
|
|
58
|
+
2. Call brxce_list_workspace_members
|
|
59
|
+
3. Show member list for user to select
|
|
60
|
+
4. Use selected userId values in brxce_create_meeting
|
|
61
|
+
\`\`\`
|
|
62
|
+
|
|
63
|
+
2. **Task Assignment**: Get member list to assign WorkNode
|
|
64
|
+
\`\`\`
|
|
65
|
+
User: "Assign this task to someone"
|
|
66
|
+
LLM:
|
|
67
|
+
1. Get workspace ID from WorkNode context
|
|
68
|
+
2. Call brxce_list_workspace_members
|
|
69
|
+
3. Show member list
|
|
70
|
+
4. Use selected userId in brxce_update_worknodes
|
|
71
|
+
\`\`\`
|
|
72
|
+
|
|
73
|
+
3. **Team Overview**: Show who's in the workspace
|
|
74
|
+
\`\`\`
|
|
75
|
+
User: "Who's on the team?"
|
|
76
|
+
LLM:
|
|
77
|
+
1. Get default workspace ID
|
|
78
|
+
2. Call brxce_list_workspace_members
|
|
79
|
+
3. Format as readable list with roles
|
|
80
|
+
\`\`\`
|
|
81
|
+
|
|
82
|
+
⏰ **TIMEZONE HANDLING:**
|
|
83
|
+
The \`joinedAt\` field is in UTC (ISO 8601 format).
|
|
84
|
+
When presenting to the user, convert to their local timezone:
|
|
85
|
+
1. Check the current date/time from the <env> tag
|
|
86
|
+
2. Identify the user's timezone (e.g., Asia/Seoul = UTC+9)
|
|
87
|
+
3. Convert UTC timestamps to local time
|
|
88
|
+
4. Format in user-friendly way (e.g., "가입: 2025-10-20")
|
|
89
|
+
|
|
90
|
+
Example conversion (Korea Time, UTC+9):
|
|
91
|
+
- API returns: "joinedAt": "2025-10-20T08:16:25.556Z" (UTC)
|
|
92
|
+
- Display to user: "가입: 2025-10-20 오후 5:16" (KST)`,
|
|
93
|
+
inputSchema: {
|
|
94
|
+
workspaceId: z
|
|
95
|
+
.string()
|
|
96
|
+
.uuid()
|
|
97
|
+
.describe('Workspace ID (get from user://me resource)'),
|
|
98
|
+
},
|
|
99
|
+
}, async (args) => {
|
|
100
|
+
const { workspaceId } = args;
|
|
101
|
+
// Validate workspaceId
|
|
102
|
+
if (!workspaceId || typeof workspaceId !== 'string') {
|
|
103
|
+
return {
|
|
104
|
+
content: [
|
|
105
|
+
{
|
|
106
|
+
type: 'text',
|
|
107
|
+
text: JSON.stringify({
|
|
108
|
+
error: 'Invalid workspace ID',
|
|
109
|
+
message: 'workspaceId is required and must be a UUID string',
|
|
110
|
+
hint: 'Use user://me resource to get valid workspace IDs',
|
|
111
|
+
}),
|
|
112
|
+
},
|
|
113
|
+
],
|
|
114
|
+
isError: true,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
try {
|
|
118
|
+
const response = await apiClient.get(`/mcp/workspaces/${workspaceId}/members`);
|
|
119
|
+
if (!response.success || !response.data) {
|
|
120
|
+
return {
|
|
121
|
+
content: [
|
|
122
|
+
{
|
|
123
|
+
type: 'text',
|
|
124
|
+
text: JSON.stringify({
|
|
125
|
+
error: 'Failed to fetch workspace members',
|
|
126
|
+
message: response.message || 'API returned unsuccessful response',
|
|
127
|
+
workspaceId,
|
|
128
|
+
}),
|
|
129
|
+
},
|
|
130
|
+
],
|
|
131
|
+
isError: true,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
const { workspaceId: wsId, workspaceName, members } = response.data;
|
|
135
|
+
// Return structured JSON for LLM to format
|
|
136
|
+
return {
|
|
137
|
+
content: [
|
|
138
|
+
{
|
|
139
|
+
type: 'text',
|
|
140
|
+
text: JSON.stringify({
|
|
141
|
+
workspaceId: wsId,
|
|
142
|
+
workspaceName,
|
|
143
|
+
totalMembers: members.length,
|
|
144
|
+
members: members.map((member) => ({
|
|
145
|
+
userId: member.userId,
|
|
146
|
+
name: member.name,
|
|
147
|
+
email: member.email,
|
|
148
|
+
role: member.role,
|
|
149
|
+
joinedAt: member.joinedAt,
|
|
150
|
+
})),
|
|
151
|
+
}, null, 2),
|
|
152
|
+
},
|
|
153
|
+
],
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
// Handle 404 - workspace not found or no access
|
|
158
|
+
if (error.response?.status === 404) {
|
|
159
|
+
return {
|
|
160
|
+
content: [
|
|
161
|
+
{
|
|
162
|
+
type: 'text',
|
|
163
|
+
text: JSON.stringify({
|
|
164
|
+
error: 'Workspace not found',
|
|
165
|
+
message: `Workspace with ID ${workspaceId} does not exist or you don't have access to it`,
|
|
166
|
+
workspaceId,
|
|
167
|
+
hint: 'Use user://me resource to get valid workspace IDs',
|
|
168
|
+
}),
|
|
169
|
+
},
|
|
170
|
+
],
|
|
171
|
+
isError: true,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
// Handle 403 - access denied
|
|
175
|
+
if (error.response?.status === 403) {
|
|
176
|
+
return {
|
|
177
|
+
content: [
|
|
178
|
+
{
|
|
179
|
+
type: 'text',
|
|
180
|
+
text: JSON.stringify({
|
|
181
|
+
error: 'Access denied',
|
|
182
|
+
message: `You don't have permission to view members of workspace ${workspaceId}`,
|
|
183
|
+
workspaceId,
|
|
184
|
+
}),
|
|
185
|
+
},
|
|
186
|
+
],
|
|
187
|
+
isError: true,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
// General error
|
|
191
|
+
return {
|
|
192
|
+
content: [
|
|
193
|
+
{
|
|
194
|
+
type: 'text',
|
|
195
|
+
text: JSON.stringify({
|
|
196
|
+
error: 'Failed to fetch workspace members',
|
|
197
|
+
message: error.message,
|
|
198
|
+
workspaceId,
|
|
199
|
+
}),
|
|
200
|
+
},
|
|
201
|
+
],
|
|
202
|
+
isError: true,
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=workspace-members-list-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-members-list-tool.js","sourceRoot":"","sources":["../../src/tools/workspace-members-list-tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import type { ApiClient } from '../services/api-client.js';
|
|
3
|
+
/**
|
|
4
|
+
* Register Workspace Statistics tool for analytics and insights
|
|
5
|
+
* Provides comprehensive statistics about workspace progress and team performance
|
|
6
|
+
*/
|
|
7
|
+
export declare function registerWorkspaceStatisticsTool(server: McpServer, apiClient: ApiClient): void;
|
|
8
|
+
//# sourceMappingURL=workspace-statistics-tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-statistics-tool.d.ts","sourceRoot":"","sources":["../../src/tools/workspace-statistics-tool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AA0D3D;;;GAGG;AACH,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,QAuTtF"}
|
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* Register Workspace Statistics tool for analytics and insights
|
|
4
|
+
* Provides comprehensive statistics about workspace progress and team performance
|
|
5
|
+
*/
|
|
6
|
+
export function registerWorkspaceStatisticsTool(server, apiClient) {
|
|
7
|
+
server.registerTool('brxce_workspace_statistics', {
|
|
8
|
+
description: `Get comprehensive statistics and analytics for a workspace.
|
|
9
|
+
|
|
10
|
+
⚠️ **CRITICAL: Workspace Verification Required**
|
|
11
|
+
Before calling this tool, you MUST:
|
|
12
|
+
1. Read the \`user://me\` resource to get available workspaces
|
|
13
|
+
2. Identify the correct workspaceId from the resource data
|
|
14
|
+
3. If user doesn't specify workspace, use their default workspace
|
|
15
|
+
4. NEVER assume or guess workspaceId values
|
|
16
|
+
|
|
17
|
+
**Example Workflow:**
|
|
18
|
+
\`\`\`
|
|
19
|
+
User: "이번 주 우리 팀 진행 상황 정리해줘"
|
|
20
|
+
LLM:
|
|
21
|
+
1. Reads user://me resource
|
|
22
|
+
2. Finds workspace: {id: 138, name: "BRXCE Development"}
|
|
23
|
+
3. Calls brxce_workspace_statistics with workspaceId: 138, period: "this-week"
|
|
24
|
+
4. Formats statistics in readable Korean format
|
|
25
|
+
\`\`\`
|
|
26
|
+
|
|
27
|
+
**When to use this tool:**
|
|
28
|
+
The LLM should call this tool when the user asks about:
|
|
29
|
+
- "우리 팀 진행 상황 어때?" → Use with period: "all"
|
|
30
|
+
- "이번 주 완료한 작업 몇 개야?" → Use with period: "this-week"
|
|
31
|
+
- "누가 제일 많이 작업하고 있어?" → Check memberStats
|
|
32
|
+
- "마감 임박한 작업 있어?" → Check dueDates.dueToday, dueDates.dueThisWeek
|
|
33
|
+
- "전체적인 통계 보여줘" → Use with period: "all"
|
|
34
|
+
|
|
35
|
+
**Time Periods:**
|
|
36
|
+
- \`today\`: 오늘 생성/완료된 작업 중심 통계
|
|
37
|
+
- \`this-week\`: 이번 주 작업 중심 통계
|
|
38
|
+
- \`this-month\`: 이번 달 작업 중심 통계
|
|
39
|
+
- \`all\`: 전체 작업 통계 (default)
|
|
40
|
+
|
|
41
|
+
**Output Format:**
|
|
42
|
+
Returns comprehensive statistics including:
|
|
43
|
+
|
|
44
|
+
1. **Overview** - 전체 개요
|
|
45
|
+
- totalNodes: 전체 작업 수
|
|
46
|
+
- activeNodes: 진행 중인 작업 수 (완료/취소 제외)
|
|
47
|
+
- completedNodes: 완료된 작업 수
|
|
48
|
+
- completionRate: 완료율 (%)
|
|
49
|
+
|
|
50
|
+
2. **By Status** - 상태별 분포
|
|
51
|
+
- backlog: 백로그 (인박스)
|
|
52
|
+
- not_started: 시작 전
|
|
53
|
+
- in_progress: 진행 중
|
|
54
|
+
- in_review: 리뷰 중
|
|
55
|
+
- completed: 완료
|
|
56
|
+
- cancelled: 취소
|
|
57
|
+
|
|
58
|
+
3. **By Priority** - 우선순위별 분포
|
|
59
|
+
- critical: 긴급
|
|
60
|
+
- urgent: 시급
|
|
61
|
+
- high: 높음
|
|
62
|
+
- medium: 보통
|
|
63
|
+
- low: 낮음
|
|
64
|
+
|
|
65
|
+
4. **By Node Type** - 타입별 분포
|
|
66
|
+
- goal: 목표
|
|
67
|
+
- project: 프로젝트
|
|
68
|
+
- subproject: 하위 프로젝트
|
|
69
|
+
- task: 작업
|
|
70
|
+
- subtask: 하위 작업
|
|
71
|
+
|
|
72
|
+
5. **Member Stats** - 팀원별 통계
|
|
73
|
+
- userId: 사용자 ID
|
|
74
|
+
- name: 이름
|
|
75
|
+
- email: 이메일
|
|
76
|
+
- totalAssigned: 할당된 총 작업 수
|
|
77
|
+
- inProgress: 진행 중인 작업 수
|
|
78
|
+
- completed: 완료한 작업 수
|
|
79
|
+
- completionRate: 완료율 (%)
|
|
80
|
+
|
|
81
|
+
6. **Due Dates** - 마감일 현황
|
|
82
|
+
- overdue: 마감 지난 작업 수
|
|
83
|
+
- dueToday: 오늘 마감 작업 수
|
|
84
|
+
- dueThisWeek: 이번 주 마감 작업 수
|
|
85
|
+
- dueThisMonth: 이번 달 마감 작업 수
|
|
86
|
+
|
|
87
|
+
**Best Practices:**
|
|
88
|
+
1. Always verify workspaceId via user://me resource first
|
|
89
|
+
2. Use appropriate period based on user's question
|
|
90
|
+
3. Format statistics in user-friendly Korean when presenting
|
|
91
|
+
4. Highlight important metrics (overdue, high completion rates, etc.)
|
|
92
|
+
5. Suggest actionable insights based on statistics
|
|
93
|
+
|
|
94
|
+
**Common Use Cases:**
|
|
95
|
+
|
|
96
|
+
1. **Team Progress Review**:
|
|
97
|
+
\`\`\`
|
|
98
|
+
User: "우리 팀 이번 주 진행 상황 보고서 만들어줘"
|
|
99
|
+
LLM:
|
|
100
|
+
1. Get workspace ID from context
|
|
101
|
+
2. Call brxce_workspace_statistics(workspaceId: 138, period: "this-week")
|
|
102
|
+
3. Format as progress report:
|
|
103
|
+
- "이번 주 총 15개 작업 중 8개 완료 (53% 완료율)"
|
|
104
|
+
- "3개 진행 중, 4개 대기 중"
|
|
105
|
+
- "마감 지난 작업: 2개 (주의 필요)"
|
|
106
|
+
\`\`\`
|
|
107
|
+
|
|
108
|
+
2. **Team Member Workload**:
|
|
109
|
+
\`\`\`
|
|
110
|
+
User: "누가 제일 바빠?"
|
|
111
|
+
LLM:
|
|
112
|
+
1. Call brxce_workspace_statistics
|
|
113
|
+
2. Sort memberStats by totalAssigned
|
|
114
|
+
3. Present: "김개발님이 현재 12개 작업 진행 중 (가장 많음)"
|
|
115
|
+
\`\`\`
|
|
116
|
+
|
|
117
|
+
3. **Priority Analysis**:
|
|
118
|
+
\`\`\`
|
|
119
|
+
User: "긴급한 작업 얼마나 남았어?"
|
|
120
|
+
LLM:
|
|
121
|
+
1. Call brxce_workspace_statistics
|
|
122
|
+
2. Check byPriority.critical and byPriority.urgent
|
|
123
|
+
3. Present: "긴급 작업 5개, 시급 작업 3개 남아있습니다"
|
|
124
|
+
\`\`\`
|
|
125
|
+
|
|
126
|
+
4. **Deadline Tracking**:
|
|
127
|
+
\`\`\`
|
|
128
|
+
User: "이번 주 마감 작업 있어?"
|
|
129
|
+
LLM:
|
|
130
|
+
1. Call brxce_workspace_statistics
|
|
131
|
+
2. Check dueDates
|
|
132
|
+
3. Present: "오늘 마감 2개, 이번 주 마감 5개 있습니다"
|
|
133
|
+
\`\`\`
|
|
134
|
+
|
|
135
|
+
⏰ **TIMEZONE HANDLING:**
|
|
136
|
+
All date calculations are performed in UTC on the backend.
|
|
137
|
+
When presenting results to the user, dates are already processed relative to the server's timezone.
|
|
138
|
+
|
|
139
|
+
**Example Output:**
|
|
140
|
+
\`\`\`json
|
|
141
|
+
{
|
|
142
|
+
"workspaceId": 138,
|
|
143
|
+
"workspaceName": "BRXCE Development",
|
|
144
|
+
"period": "this-week",
|
|
145
|
+
"overview": {
|
|
146
|
+
"totalNodes": 45,
|
|
147
|
+
"activeNodes": 23,
|
|
148
|
+
"completedNodes": 18,
|
|
149
|
+
"completionRate": 40
|
|
150
|
+
},
|
|
151
|
+
"byStatus": {
|
|
152
|
+
"backlog": 5,
|
|
153
|
+
"not_started": 8,
|
|
154
|
+
"in_progress": 10,
|
|
155
|
+
"in_review": 4,
|
|
156
|
+
"completed": 18,
|
|
157
|
+
"cancelled": 0
|
|
158
|
+
},
|
|
159
|
+
"memberStats": [
|
|
160
|
+
{
|
|
161
|
+
"userId": "user-123",
|
|
162
|
+
"name": "김개발",
|
|
163
|
+
"email": "dev@example.com",
|
|
164
|
+
"totalAssigned": 12,
|
|
165
|
+
"inProgress": 5,
|
|
166
|
+
"completed": 7,
|
|
167
|
+
"completionRate": 58
|
|
168
|
+
}
|
|
169
|
+
],
|
|
170
|
+
"dueDates": {
|
|
171
|
+
"overdue": 2,
|
|
172
|
+
"dueToday": 3,
|
|
173
|
+
"dueThisWeek": 5,
|
|
174
|
+
"dueThisMonth": 8
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
\`\`\``,
|
|
178
|
+
inputSchema: {
|
|
179
|
+
workspaceId: z
|
|
180
|
+
.string()
|
|
181
|
+
.uuid()
|
|
182
|
+
.describe('Workspace ID (get from user://me resource)'),
|
|
183
|
+
period: z
|
|
184
|
+
.enum(['today', 'this-week', 'this-month', 'all'])
|
|
185
|
+
.optional()
|
|
186
|
+
.describe('Time period for statistics (default: all)'),
|
|
187
|
+
},
|
|
188
|
+
}, async (args) => {
|
|
189
|
+
const { workspaceId, period = 'all' } = args;
|
|
190
|
+
// Validate workspaceId
|
|
191
|
+
if (!workspaceId || typeof workspaceId !== 'string') {
|
|
192
|
+
return {
|
|
193
|
+
content: [
|
|
194
|
+
{
|
|
195
|
+
type: 'text',
|
|
196
|
+
text: JSON.stringify({
|
|
197
|
+
error: 'Invalid workspace ID',
|
|
198
|
+
message: 'workspaceId is required and must be a UUID string',
|
|
199
|
+
hint: 'Use user://me resource to get valid workspace IDs',
|
|
200
|
+
}),
|
|
201
|
+
},
|
|
202
|
+
],
|
|
203
|
+
isError: true,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
try {
|
|
207
|
+
const queryParams = new URLSearchParams();
|
|
208
|
+
if (period) {
|
|
209
|
+
queryParams.append('period', period);
|
|
210
|
+
}
|
|
211
|
+
const url = `/mcp/workspaces/${workspaceId}/statistics?${queryParams.toString()}`;
|
|
212
|
+
const response = await apiClient.get(url);
|
|
213
|
+
if (!response.success || !response.data) {
|
|
214
|
+
return {
|
|
215
|
+
content: [
|
|
216
|
+
{
|
|
217
|
+
type: 'text',
|
|
218
|
+
text: JSON.stringify({
|
|
219
|
+
error: 'Failed to fetch workspace statistics',
|
|
220
|
+
message: response.message || 'API returned unsuccessful response',
|
|
221
|
+
workspaceId,
|
|
222
|
+
}),
|
|
223
|
+
},
|
|
224
|
+
],
|
|
225
|
+
isError: true,
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
const stats = response.data;
|
|
229
|
+
// Return structured JSON for LLM to format
|
|
230
|
+
return {
|
|
231
|
+
content: [
|
|
232
|
+
{
|
|
233
|
+
type: 'text',
|
|
234
|
+
text: JSON.stringify({
|
|
235
|
+
workspaceId: stats.workspaceId,
|
|
236
|
+
workspaceName: stats.workspaceName,
|
|
237
|
+
period: stats.period,
|
|
238
|
+
overview: stats.overview,
|
|
239
|
+
byStatus: stats.byStatus,
|
|
240
|
+
byPriority: stats.byPriority,
|
|
241
|
+
byNodeType: stats.byNodeType,
|
|
242
|
+
memberStats: stats.memberStats,
|
|
243
|
+
dueDates: stats.dueDates,
|
|
244
|
+
}, null, 2),
|
|
245
|
+
},
|
|
246
|
+
],
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
catch (error) {
|
|
250
|
+
// Handle 404 - workspace not found or no access
|
|
251
|
+
if (error.response?.status === 404) {
|
|
252
|
+
return {
|
|
253
|
+
content: [
|
|
254
|
+
{
|
|
255
|
+
type: 'text',
|
|
256
|
+
text: JSON.stringify({
|
|
257
|
+
error: 'Workspace not found',
|
|
258
|
+
message: `Workspace with ID ${workspaceId} does not exist or you don't have access to it`,
|
|
259
|
+
workspaceId,
|
|
260
|
+
hint: 'Use user://me resource to get valid workspace IDs',
|
|
261
|
+
}),
|
|
262
|
+
},
|
|
263
|
+
],
|
|
264
|
+
isError: true,
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
// Handle 403 - access denied
|
|
268
|
+
if (error.response?.status === 403) {
|
|
269
|
+
return {
|
|
270
|
+
content: [
|
|
271
|
+
{
|
|
272
|
+
type: 'text',
|
|
273
|
+
text: JSON.stringify({
|
|
274
|
+
error: 'Access denied',
|
|
275
|
+
message: `You don't have permission to view statistics for workspace ${workspaceId}`,
|
|
276
|
+
workspaceId,
|
|
277
|
+
}),
|
|
278
|
+
},
|
|
279
|
+
],
|
|
280
|
+
isError: true,
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
// General error
|
|
284
|
+
return {
|
|
285
|
+
content: [
|
|
286
|
+
{
|
|
287
|
+
type: 'text',
|
|
288
|
+
text: JSON.stringify({
|
|
289
|
+
error: 'Failed to fetch workspace statistics',
|
|
290
|
+
message: error.message,
|
|
291
|
+
workspaceId,
|
|
292
|
+
}),
|
|
293
|
+
},
|
|
294
|
+
],
|
|
295
|
+
isError: true,
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
});
|
|
299
|
+
}
|
|
300
|
+
//# sourceMappingURL=workspace-statistics-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-statistics-tool.js","sourceRoot":"","sources":["../../src/tools/workspace-statistics-tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-tree-tool.d.ts","sourceRoot":"","sources":["../../src/tools/workspace-tree-tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"workspace-tree-tool.d.ts","sourceRoot":"","sources":["../../src/tools/workspace-tree-tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAgCtD,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,QAmbhF"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
const WorkspaceTreeRequestSchema = z.object({
|
|
3
|
-
workspaceId: z.
|
|
3
|
+
workspaceId: z.string().uuid().describe('The workspace ID to fetch tree for'),
|
|
4
4
|
status: z.string().optional().describe('Filter by status (comma-separated). Options: backlog, not_started, in_progress, in_review, completed, cancelled'),
|
|
5
5
|
priority: z.string().optional().describe('Filter by priority (comma-separated). Options: low, medium, high, urgent, critical'),
|
|
6
6
|
nodeType: z.string().optional().describe('Filter by node type (comma-separated). Options: goal, project, subproject, task, subtask'),
|
|
@@ -15,7 +15,6 @@ const WorkspaceTreeRequestSchema = z.object({
|
|
|
15
15
|
tagIds: z.string().optional().describe('Filter by tag IDs (comma-separated, e.g., "13,29")'),
|
|
16
16
|
tagSlugs: z.string().optional().describe('Filter by tag slugs (comma-separated, e.g., "mcp-server,backend")'),
|
|
17
17
|
matchAllTags: z.boolean().optional().describe('If true, WorkNode must have ALL specified tags. If false (default), ANY tag matches'),
|
|
18
|
-
compact: z.boolean().optional().describe('Return compact format (minimal fields for token efficiency, reduces response size by ~80%, default: false)'),
|
|
19
18
|
createdAfter: z.string().optional().describe('Filter nodes created after this date (ISO 8601, e.g., "2025-01-01T00:00:00Z")'),
|
|
20
19
|
createdBefore: z.string().optional().describe('Filter nodes created before this date (ISO 8601)'),
|
|
21
20
|
updatedAfter: z.string().optional().describe('Filter nodes updated after this date (ISO 8601)'),
|
|
@@ -89,11 +88,10 @@ This tree structure matches exactly what users see in the BRXCE Electron app UI,
|
|
|
89
88
|
- Excludes archived and deleted items
|
|
90
89
|
- Use filters to customize what's included
|
|
91
90
|
|
|
92
|
-
**
|
|
93
|
-
-
|
|
94
|
-
-
|
|
95
|
-
- **
|
|
96
|
-
- Use compact mode when you only need basic hierarchy and don't need detailed metadata
|
|
91
|
+
**Response Format:**
|
|
92
|
+
- Returns essential fields: id, title, nodeType, status, priority, depth, nodePath, parentNodeId, hasChildren, childrenCount, descendantsCount, workspaceId, assignee, dueDate, tags
|
|
93
|
+
- **Tags**: Array of tag names (string[]) for token efficiency
|
|
94
|
+
- **Optimized for LLM token usage**
|
|
97
95
|
|
|
98
96
|
**Filters:**
|
|
99
97
|
All filters work the same as \`brxce_workspace_overview\`:
|
|
@@ -111,7 +109,6 @@ All filters work the same as \`brxce_workspace_overview\`:
|
|
|
111
109
|
- \`includeArchived\`: Include archived items
|
|
112
110
|
- \`includeDeleted\`: Include deleted items
|
|
113
111
|
- \`maxDepth\`: Limit tree depth (0 = roots only, 1 = roots + children, etc.)
|
|
114
|
-
- \`compact\`: Return compact format (minimal fields for token efficiency)
|
|
115
112
|
|
|
116
113
|
**Example - View Active Work Tree:**
|
|
117
114
|
\`\`\`json
|
|
@@ -202,7 +199,7 @@ Example conversion (Korea Time, UTC+9):
|
|
|
202
199
|
- Use \`brxce_worknode_subtree\` for subtree of a specific node
|
|
203
200
|
- Use **this tool** (workspace overview) for complete workspace hierarchy understanding`,
|
|
204
201
|
inputSchema: {
|
|
205
|
-
workspaceId: z.
|
|
202
|
+
workspaceId: z.string().uuid().describe('Workspace ID from user://me resource. REQUIRED: Must verify against resource before using.'),
|
|
206
203
|
status: z.string().optional().describe('Filter by status (comma-separated)'),
|
|
207
204
|
priority: z.string().optional().describe('Filter by priority (comma-separated)'),
|
|
208
205
|
nodeType: z.string().optional().describe('Filter by node type (comma-separated)'),
|
|
@@ -217,7 +214,6 @@ Example conversion (Korea Time, UTC+9):
|
|
|
217
214
|
tagIds: z.string().optional().describe('Filter by tag IDs (comma-separated, e.g., "13,29")'),
|
|
218
215
|
tagSlugs: z.string().optional().describe('Filter by tag slugs (comma-separated, e.g., "mcp-server,backend")'),
|
|
219
216
|
matchAllTags: z.boolean().optional().describe('If true, WorkNode must have ALL specified tags. If false (default), ANY tag matches'),
|
|
220
|
-
compact: z.boolean().optional().describe('Return compact format (minimal fields for token efficiency, ~80% size reduction, default: false)'),
|
|
221
217
|
createdAfter: z.string().optional().describe('Filter nodes created after this date (ISO 8601)'),
|
|
222
218
|
createdBefore: z.string().optional().describe('Filter nodes created before this date (ISO 8601)'),
|
|
223
219
|
updatedAfter: z.string().optional().describe('Filter nodes updated after this date (ISO 8601)'),
|
|
@@ -264,8 +260,6 @@ Example conversion (Korea Time, UTC+9):
|
|
|
264
260
|
queryParams.set('tagSlugs', request.tagSlugs);
|
|
265
261
|
if (request.matchAllTags !== undefined)
|
|
266
262
|
queryParams.set('matchAllTags', String(request.matchAllTags));
|
|
267
|
-
if (request.compact !== undefined)
|
|
268
|
-
queryParams.set('compact', String(request.compact));
|
|
269
263
|
if (request.createdAfter)
|
|
270
264
|
queryParams.set('createdAfter', request.createdAfter);
|
|
271
265
|
if (request.createdBefore)
|