@brxce/mcp-server 1.1.4 β 1.1.6
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/dist/config/bot-tool-scope.d.ts +15 -0
- package/dist/config/bot-tool-scope.d.ts.map +1 -0
- package/dist/config/bot-tool-scope.js +74 -0
- package/dist/config/bot-tool-scope.js.map +1 -0
- package/dist/config/environment.d.ts +2 -0
- package/dist/config/environment.d.ts.map +1 -1
- package/dist/config/environment.js +3 -1
- package/dist/config/environment.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +88 -63
- package/dist/index.js.map +1 -1
- package/dist/tools/bot-tool.d.ts +8 -0
- package/dist/tools/bot-tool.d.ts.map +1 -0
- package/dist/tools/bot-tool.js +191 -0
- package/dist/tools/bot-tool.js.map +1 -0
- package/dist/tools/worknode-detail-tool.d.ts +8 -0
- package/dist/tools/worknode-detail-tool.d.ts.map +1 -0
- package/dist/tools/worknode-detail-tool.js +227 -0
- package/dist/tools/worknode-detail-tool.js.map +1 -0
- package/dist/tools/worknode-subtree-tool.d.ts.map +1 -1
- package/dist/tools/worknode-subtree-tool.js +34 -12
- package/dist/tools/worknode-subtree-tool.js.map +1 -1
- package/dist/utils/bot-scoped-server.d.ts +13 -0
- package/dist/utils/bot-scoped-server.d.ts.map +1 -0
- package/dist/utils/bot-scoped-server.js +30 -0
- package/dist/utils/bot-scoped-server.js.map +1 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/param-parser.d.ts +47 -0
- package/dist/utils/param-parser.d.ts.map +1 -0
- package/dist/utils/param-parser.js +124 -0
- package/dist/utils/param-parser.js.map +1 -0
- package/package.json +12 -11
- package/dist/prompts/worknode-prompts.d.ts +0 -7
- package/dist/prompts/worknode-prompts.d.ts.map +0 -1
- package/dist/prompts/worknode-prompts.js +0 -398
- package/dist/prompts/worknode-prompts.js.map +0 -1
- package/dist/prompts/workspace-context-prompt.d.ts +0 -4
- package/dist/prompts/workspace-context-prompt.d.ts.map +0 -1
- package/dist/prompts/workspace-context-prompt.js +0 -102
- package/dist/prompts/workspace-context-prompt.js.map +0 -1
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { getErrorMessage, isNotFoundError } from '../utils/error-utils.js';
|
|
3
|
+
import { workspaceContext } from '../services/workspace-context.js';
|
|
4
|
+
// Emoji mappings
|
|
5
|
+
const NODE_TYPE_EMOJI = {
|
|
6
|
+
goal: 'π―',
|
|
7
|
+
project: 'π',
|
|
8
|
+
subproject: 'π',
|
|
9
|
+
task: 'β
',
|
|
10
|
+
subtask: 'βοΈ',
|
|
11
|
+
note: 'π',
|
|
12
|
+
};
|
|
13
|
+
const STATUS_EMOJI = {
|
|
14
|
+
backlog: 'π₯',
|
|
15
|
+
not_started: 'β',
|
|
16
|
+
in_progress: 'π',
|
|
17
|
+
completed: 'β
',
|
|
18
|
+
pause: 'βΈοΈ',
|
|
19
|
+
archived: 'π¦',
|
|
20
|
+
};
|
|
21
|
+
const PRIORITY_EMOJI = {
|
|
22
|
+
critical: 'π₯',
|
|
23
|
+
urgent: 'β‘',
|
|
24
|
+
high: 'π΄',
|
|
25
|
+
medium: 'π‘',
|
|
26
|
+
low: 'π’',
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Register WorkNode Detail tool
|
|
30
|
+
* Provides detailed view of a worknode including description and direct children summary
|
|
31
|
+
*/
|
|
32
|
+
export function registerWorknodeDetailTool(server, apiClient) {
|
|
33
|
+
server.registerTool('brxce_worknode_detail', {
|
|
34
|
+
description: `Get detailed WorkNode information including description and direct children summary.
|
|
35
|
+
|
|
36
|
+
Use this when you need:
|
|
37
|
+
- Full description/context of a worknode
|
|
38
|
+
- Summary of immediate child tasks
|
|
39
|
+
- Quick overview before starting work
|
|
40
|
+
|
|
41
|
+
Returns: Full node details + children summary + status breakdown. For full subtree, use brxce_worknode_subtree.`,
|
|
42
|
+
inputSchema: {
|
|
43
|
+
nodeId: z.string().describe('The WorkNode ID (UUID or displayId like #123 or 123)'),
|
|
44
|
+
workspaceId: z.string().uuid().optional().describe('Workspace ID (required when using displayId format)'),
|
|
45
|
+
},
|
|
46
|
+
}, async (args) => {
|
|
47
|
+
const { nodeId, workspaceId: providedWorkspaceId } = args;
|
|
48
|
+
if (!nodeId) {
|
|
49
|
+
throw new Error('nodeId is required');
|
|
50
|
+
}
|
|
51
|
+
// Auto-resolve workspaceId from context if using displayId
|
|
52
|
+
const resolvedWorkspaceId = workspaceContext.resolveWorkspaceId(providedWorkspaceId, nodeId);
|
|
53
|
+
try {
|
|
54
|
+
// 1. Fetch single node with full description via read API
|
|
55
|
+
const readResponse = await apiClient.post('/mcp/worknodes/read', {
|
|
56
|
+
query: nodeId,
|
|
57
|
+
workspaceId: resolvedWorkspaceId,
|
|
58
|
+
limit: 1,
|
|
59
|
+
});
|
|
60
|
+
if (!readResponse.success || !readResponse.data?.nodes?.length) {
|
|
61
|
+
return {
|
|
62
|
+
content: [
|
|
63
|
+
{
|
|
64
|
+
type: 'text',
|
|
65
|
+
text: `Failed to fetch worknode: ${readResponse.message || 'Node not found'}`,
|
|
66
|
+
},
|
|
67
|
+
],
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
const node = readResponse.data.nodes[0];
|
|
71
|
+
// 2. Fetch children via subtree API
|
|
72
|
+
const queryParams = new URLSearchParams();
|
|
73
|
+
if (resolvedWorkspaceId) {
|
|
74
|
+
queryParams.append('workspaceId', resolvedWorkspaceId);
|
|
75
|
+
}
|
|
76
|
+
queryParams.append('maxDepth', '1');
|
|
77
|
+
queryParams.append('compact', 'true');
|
|
78
|
+
queryParams.append('limit', '100');
|
|
79
|
+
const queryString = queryParams.toString();
|
|
80
|
+
const encodedNodeId = encodeURIComponent(node.id); // Use resolved UUID
|
|
81
|
+
const subtreeUrl = `/mcp/worknodes/${encodedNodeId}/subtree${queryString ? `?${queryString}` : ''}`;
|
|
82
|
+
const subtreeResponse = await apiClient.get(subtreeUrl);
|
|
83
|
+
let children = [];
|
|
84
|
+
let stats = { byStatus: {}, byPriority: {} };
|
|
85
|
+
if (subtreeResponse.success && subtreeResponse.data) {
|
|
86
|
+
children = subtreeResponse.data.children || [];
|
|
87
|
+
stats = subtreeResponse.data.stats || { byStatus: {}, byPriority: {} };
|
|
88
|
+
}
|
|
89
|
+
// Build detailed Markdown response
|
|
90
|
+
const nodeDisplayId = node.displayId ?? node.id;
|
|
91
|
+
const typeEmoji = NODE_TYPE_EMOJI[node.nodeType] || 'π';
|
|
92
|
+
const statusEmoji = STATUS_EMOJI[node.status] || 'β';
|
|
93
|
+
const priorityEmoji = PRIORITY_EMOJI[node.priority] || '';
|
|
94
|
+
let resultText = `## ${typeEmoji} ${node.title} (#${nodeDisplayId})\n\n`;
|
|
95
|
+
// Status & Priority
|
|
96
|
+
resultText += `**Status:** ${statusEmoji} ${node.status}`;
|
|
97
|
+
if (priorityEmoji)
|
|
98
|
+
resultText += ` | **Priority:** ${priorityEmoji} ${node.priority}`;
|
|
99
|
+
if (node.progress > 0)
|
|
100
|
+
resultText += ` | **Progress:** ${node.progress}%`;
|
|
101
|
+
resultText += '\n\n';
|
|
102
|
+
// Dates
|
|
103
|
+
const dates = [];
|
|
104
|
+
if (node.dueDate) {
|
|
105
|
+
dates.push(`π
Due: ${new Date(node.dueDate).toLocaleDateString()}`);
|
|
106
|
+
}
|
|
107
|
+
if (node.startDate) {
|
|
108
|
+
dates.push(`ποΈ Start: ${new Date(node.startDate).toLocaleDateString()}`);
|
|
109
|
+
}
|
|
110
|
+
if (dates.length > 0) {
|
|
111
|
+
resultText += dates.join(' | ') + '\n\n';
|
|
112
|
+
}
|
|
113
|
+
// Assignees
|
|
114
|
+
if (node.assignee && node.assignee.length > 0) {
|
|
115
|
+
const assigneeNames = node.assignee.map((a) => typeof a === 'string' ? a : (a.name || a.id));
|
|
116
|
+
resultText += `**Assignees:** π€ ${assigneeNames.join(', ')}\n\n`;
|
|
117
|
+
}
|
|
118
|
+
// Tags
|
|
119
|
+
if (node.tags && node.tags.length > 0) {
|
|
120
|
+
const tagNames = node.tags.map((t) => typeof t === 'string' ? t : t.name);
|
|
121
|
+
resultText += `**Tags:** π·οΈ ${tagNames.join(', ')}\n\n`;
|
|
122
|
+
}
|
|
123
|
+
// Description
|
|
124
|
+
resultText += `### π Description\n\n`;
|
|
125
|
+
if (node.description && node.description.trim()) {
|
|
126
|
+
resultText += node.description + '\n\n';
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
resultText += '_No description_\n\n';
|
|
130
|
+
}
|
|
131
|
+
// Children Summary
|
|
132
|
+
resultText += `### π νμ μ
무 μμ½\n\n`;
|
|
133
|
+
if (children.length === 0) {
|
|
134
|
+
resultText += '_νμ μ
무 μμ_\n\n';
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
// Status breakdown
|
|
138
|
+
const statusBreakdown = stats?.byStatus || {};
|
|
139
|
+
const inProgress = statusBreakdown['in_progress'] || 0;
|
|
140
|
+
const notStarted = statusBreakdown['not_started'] || 0;
|
|
141
|
+
const backlog = statusBreakdown['backlog'] || 0;
|
|
142
|
+
const completed = statusBreakdown['completed'] || 0;
|
|
143
|
+
const total = children.length;
|
|
144
|
+
resultText += `| μν | κ°μ |\n`;
|
|
145
|
+
resultText += `|------|------|\n`;
|
|
146
|
+
if (inProgress > 0)
|
|
147
|
+
resultText += `| π μ§νμ€ | ${inProgress} |\n`;
|
|
148
|
+
if (notStarted > 0)
|
|
149
|
+
resultText += `| β λκΈ° | ${notStarted} |\n`;
|
|
150
|
+
if (backlog > 0)
|
|
151
|
+
resultText += `| π₯ λ°±λ‘κ·Έ | ${backlog} |\n`;
|
|
152
|
+
if (completed > 0)
|
|
153
|
+
resultText += `| β
μλ£ | ${completed} |\n`;
|
|
154
|
+
resultText += `| **ν©κ³** | **${total}** |\n\n`;
|
|
155
|
+
// Progress bar
|
|
156
|
+
if (total > 0) {
|
|
157
|
+
const completedRatio = completed / total;
|
|
158
|
+
const progressBar = 'β'.repeat(Math.floor(completedRatio * 10)) +
|
|
159
|
+
'β'.repeat(10 - Math.floor(completedRatio * 10));
|
|
160
|
+
resultText += `**μ§νλ₯ :** ${progressBar} ${Math.round(completedRatio * 100)}% (${completed}/${total})\n\n`;
|
|
161
|
+
}
|
|
162
|
+
// Direct children list (non-completed only)
|
|
163
|
+
const activeChildren = children.filter((c) => c.status !== 'completed' && c.status !== 'archived');
|
|
164
|
+
if (activeChildren.length > 0) {
|
|
165
|
+
resultText += `### π νμ± νμ μ
무 (${activeChildren.length}κ°)\n\n`;
|
|
166
|
+
activeChildren.slice(0, 10).forEach((child) => {
|
|
167
|
+
const childDisplayId = child.displayId ?? child.id;
|
|
168
|
+
const childTypeEmoji = NODE_TYPE_EMOJI[child.nodeType] || 'π';
|
|
169
|
+
const childStatusEmoji = STATUS_EMOJI[child.status] || '';
|
|
170
|
+
const childPriorityEmoji = PRIORITY_EMOJI[child.priority] || '';
|
|
171
|
+
resultText += `- ${childTypeEmoji} **${child.title}** (#${childDisplayId}) ${childStatusEmoji} ${childPriorityEmoji}`;
|
|
172
|
+
if (child.dueDate) {
|
|
173
|
+
resultText += ` π
${new Date(child.dueDate).toLocaleDateString()}`;
|
|
174
|
+
}
|
|
175
|
+
resultText += '\n';
|
|
176
|
+
});
|
|
177
|
+
if (activeChildren.length > 10) {
|
|
178
|
+
resultText += `\n_... and ${activeChildren.length - 10} more_\n`;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
resultText += `\n---\n`;
|
|
183
|
+
if (resolvedWorkspaceId) {
|
|
184
|
+
resultText += `**Workspace ID:** \`${resolvedWorkspaceId}\`\n`;
|
|
185
|
+
}
|
|
186
|
+
return {
|
|
187
|
+
content: [
|
|
188
|
+
{
|
|
189
|
+
type: 'text',
|
|
190
|
+
text: resultText,
|
|
191
|
+
},
|
|
192
|
+
],
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
catch (error) {
|
|
196
|
+
if (isNotFoundError(error)) {
|
|
197
|
+
return {
|
|
198
|
+
content: [
|
|
199
|
+
{
|
|
200
|
+
type: 'text',
|
|
201
|
+
text: JSON.stringify({
|
|
202
|
+
error: 'WorkNode not found',
|
|
203
|
+
message: `WorkNode with ID ${nodeId} does not exist or you don't have access to it.`,
|
|
204
|
+
nodeId,
|
|
205
|
+
}),
|
|
206
|
+
},
|
|
207
|
+
],
|
|
208
|
+
isError: true,
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
return {
|
|
212
|
+
content: [
|
|
213
|
+
{
|
|
214
|
+
type: 'text',
|
|
215
|
+
text: JSON.stringify({
|
|
216
|
+
error: 'Failed to fetch worknode detail',
|
|
217
|
+
message: getErrorMessage(error),
|
|
218
|
+
nodeId,
|
|
219
|
+
}),
|
|
220
|
+
},
|
|
221
|
+
],
|
|
222
|
+
isError: true,
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
//# sourceMappingURL=worknode-detail-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worknode-detail-tool.js","sourceRoot":"","sources":["../../src/tools/worknode-detail-tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worknode-subtree-tool.d.ts","sourceRoot":"","sources":["../../src/tools/worknode-subtree-tool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"worknode-subtree-tool.d.ts","sourceRoot":"","sources":["../../src/tools/worknode-subtree-tool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AA+H3D,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,QAyLlF"}
|
|
@@ -46,7 +46,7 @@ function formatNodeLine(node, depth) {
|
|
|
46
46
|
}
|
|
47
47
|
if (node.dueDate) {
|
|
48
48
|
const dueDate = new Date(node.dueDate);
|
|
49
|
-
metadata.push(
|
|
49
|
+
metadata.push(`π
${dueDate.toISOString().split('T')[0]}`);
|
|
50
50
|
}
|
|
51
51
|
if (metadata.length > 0) {
|
|
52
52
|
line += ` (${metadata.join(', ')})`;
|
|
@@ -54,15 +54,37 @@ function formatNodeLine(node, depth) {
|
|
|
54
54
|
return line;
|
|
55
55
|
}
|
|
56
56
|
/**
|
|
57
|
-
* Build tree structure from flat children array
|
|
57
|
+
* Build tree structure from flat children array using depth-based approach
|
|
58
58
|
*/
|
|
59
|
-
function
|
|
59
|
+
function buildTreeByDepth(children, rootId) {
|
|
60
|
+
if (children.length === 0)
|
|
61
|
+
return '';
|
|
60
62
|
let result = '';
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
63
|
+
// Sort children by depth first, then by their order
|
|
64
|
+
const sortedChildren = [...children].sort((a, b) => {
|
|
65
|
+
const depthDiff = (a.depth ?? 0) - (b.depth ?? 0);
|
|
66
|
+
if (depthDiff !== 0)
|
|
67
|
+
return depthDiff;
|
|
68
|
+
return 0;
|
|
69
|
+
});
|
|
70
|
+
// Build tree recursively using parentNodeId
|
|
71
|
+
function buildSubtree(parentId, depth) {
|
|
72
|
+
let subtree = '';
|
|
73
|
+
const directChildren = sortedChildren.filter(c => c.parentNodeId === parentId);
|
|
74
|
+
for (const child of directChildren) {
|
|
75
|
+
subtree += formatNodeLine(child, depth) + '\n';
|
|
76
|
+
// Recursively add grandchildren
|
|
77
|
+
subtree += buildSubtree(child.id, depth + 1);
|
|
78
|
+
}
|
|
79
|
+
return subtree;
|
|
80
|
+
}
|
|
81
|
+
result = buildSubtree(rootId, 1);
|
|
82
|
+
// If no children found via parentNodeId, fallback to depth-based display
|
|
83
|
+
if (result === '' && sortedChildren.length > 0) {
|
|
84
|
+
for (const child of sortedChildren) {
|
|
85
|
+
const nodeDepth = child.depth ?? 1;
|
|
86
|
+
result += formatNodeLine(child, nodeDepth) + '\n';
|
|
87
|
+
}
|
|
66
88
|
}
|
|
67
89
|
return result;
|
|
68
90
|
}
|
|
@@ -163,12 +185,12 @@ Returns: Markdown formatted tree with statistics. Dates in UTC.`,
|
|
|
163
185
|
resultText += `\\n`;
|
|
164
186
|
}
|
|
165
187
|
// Tree structure
|
|
166
|
-
resultText += `**Subtree Structure
|
|
188
|
+
resultText += `**Subtree Structure:**\n\n`;
|
|
167
189
|
// Root node (depth 0)
|
|
168
|
-
resultText += formatNodeLine(node, 0) + '
|
|
169
|
-
// Children (recursively)
|
|
190
|
+
resultText += formatNodeLine(node, 0) + '\n';
|
|
191
|
+
// Children (recursively using depth-based tree building)
|
|
170
192
|
if (children.length > 0) {
|
|
171
|
-
resultText +=
|
|
193
|
+
resultText += buildTreeByDepth(children, node.id);
|
|
172
194
|
}
|
|
173
195
|
resultText += `\\n---\\n`;
|
|
174
196
|
resultText += `**Note:** This subtree shows the node and all its descendants.\\n`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worknode-subtree-tool.js","sourceRoot":"","sources":["../../src/tools/worknode-subtree-tool.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAwBpE,2CAA2C;AAC3C,MAAM,eAAe,GAA2B;IAC9C,IAAI,EAAE,IAAI;IACV,OAAO,EAAE,IAAI;IACb,UAAU,EAAE,IAAI;IAChB,IAAI,EAAE,GAAG;IACT,OAAO,EAAE,IAAI;CACd,CAAC;AAEF,MAAM,YAAY,GAA2B;IAC3C,OAAO,EAAE,IAAI;IACb,WAAW,EAAE,GAAG;IAChB,WAAW,EAAE,IAAI;IACjB,SAAS,EAAE,GAAG;IACd,KAAK,EAAE,IAAI;IACX,QAAQ,EAAE,IAAI;CACf,CAAC;AAEF,MAAM,cAAc,GAA2B;IAC7C,QAAQ,EAAE,IAAI;IACd,MAAM,EAAE,GAAG;IACX,IAAI,EAAE,IAAI;IACV,MAAM,EAAE,IAAI;IACZ,GAAG,EAAE,IAAI;CACV,CAAC;AAEF;;GAEG;AACH,SAAS,cAAc,CAAC,IAAS,EAAE,KAAa;IAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAClC,MAAM,SAAS,GAAG,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC;IACzD,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC;IACrD,MAAM,aAAa,GAAG,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;IAE1D,yEAAyE;IACzE,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,EAAE,CAAC;IAChD,IAAI,IAAI,GAAG,GAAG,MAAM,GAAG,SAAS,MAAM,IAAI,CAAC,KAAK,QAAQ,aAAa,KAAK,WAAW,EAAE,CAAC;IACxF,IAAI,aAAa;QAAE,IAAI,IAAI,IAAI,aAAa,EAAE,CAAC;IAE/C,eAAe;IACf,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,IAAI,CAAC,QAAQ,GAAG,CAAC;QAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;IAC1D,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9C,QAAQ,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjD,CAAC;IACD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvC,QAAQ,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"worknode-subtree-tool.js","sourceRoot":"","sources":["../../src/tools/worknode-subtree-tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bot-scoped MCP Server wrapper.
|
|
3
|
+
*
|
|
4
|
+
* Creates a proxy around McpServer that filters out tools
|
|
5
|
+
* not allowed for bot sessions during registration.
|
|
6
|
+
*/
|
|
7
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
8
|
+
/**
|
|
9
|
+
* Wrap an McpServer to filter tool registrations for bot sessions.
|
|
10
|
+
* Non-allowed tools are silently skipped during registration.
|
|
11
|
+
*/
|
|
12
|
+
export declare function createBotScopedServer(server: McpServer): McpServer;
|
|
13
|
+
//# sourceMappingURL=bot-scoped-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bot-scoped-server.d.ts","sourceRoot":"","sources":["../../src/utils/bot-scoped-server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,CAiBlE"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bot-scoped MCP Server wrapper.
|
|
3
|
+
*
|
|
4
|
+
* Creates a proxy around McpServer that filters out tools
|
|
5
|
+
* not allowed for bot sessions during registration.
|
|
6
|
+
*/
|
|
7
|
+
import { isBotAllowedTool } from '../config/bot-tool-scope.js';
|
|
8
|
+
/**
|
|
9
|
+
* Wrap an McpServer to filter tool registrations for bot sessions.
|
|
10
|
+
* Non-allowed tools are silently skipped during registration.
|
|
11
|
+
*/
|
|
12
|
+
export function createBotScopedServer(server) {
|
|
13
|
+
return new Proxy(server, {
|
|
14
|
+
get(target, prop, receiver) {
|
|
15
|
+
if (prop === 'tool' || prop === 'registerTool') {
|
|
16
|
+
const originalMethod = Reflect.get(target, prop, receiver);
|
|
17
|
+
return function (nameOrConfig, ...args) {
|
|
18
|
+
const toolName = typeof nameOrConfig === 'string' ? nameOrConfig : nameOrConfig?.name;
|
|
19
|
+
if (toolName && !isBotAllowedTool(toolName)) {
|
|
20
|
+
// Skip registration for disallowed tools
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
return originalMethod.call(target, nameOrConfig, ...args);
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
return Reflect.get(target, prop, receiver);
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=bot-scoped-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bot-scoped-server.js","sourceRoot":"","sources":["../../src/utils/bot-scoped-server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAE/D;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAiB;IACrD,OAAO,IAAI,KAAK,CAAC,MAAM,EAAE;QACvB,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ;YACxB,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,cAAc,EAAE,CAAC;gBAC/C,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAa,CAAC;gBACvE,OAAO,UAAyB,YAAuC,EAAE,GAAG,IAAe;oBACzF,MAAM,QAAQ,GAAG,OAAO,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,EAAE,IAAI,CAAC;oBACtF,IAAI,QAAQ,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;wBAC5C,yCAAyC;wBACzC,OAAO;oBACT,CAAC;oBACD,OAAO,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC,CAAC;gBAC5D,CAAC,CAAC;YACJ,CAAC;YACD,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC7C,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
|
package/dist/utils/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC"}
|
package/dist/utils/index.js
CHANGED
package/dist/utils/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP νλΌλ―Έν° μ μ²λ¦¬ μ νΈλ¦¬ν°
|
|
3
|
+
* Claude Codeκ° λ³΅μ‘ν νμ
μ λ¬Έμμ΄λ‘ μ μ‘νλ κ²½μ° μ²λ¦¬
|
|
4
|
+
*/
|
|
5
|
+
export type ParamType = 'array' | 'boolean' | 'object' | 'string' | 'number';
|
|
6
|
+
export type ParamSchema<T extends Record<string, unknown>> = {
|
|
7
|
+
[K in keyof T]?: ParamType;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* MCP νλΌλ―Έν°λ₯Ό μ κ·νν©λλ€.
|
|
11
|
+
* Claude Codeκ° array, boolean, object λ±μ λ¬Έμμ΄λ‘ μ§λ ¬ννμ¬ μ μ‘νλ κ²½μ°,
|
|
12
|
+
* μ΄λ₯Ό μλ νμ
μΌλ‘ νμ±ν©λλ€.
|
|
13
|
+
*
|
|
14
|
+
* @param args - MCP λꡬμμ λ°μ μλ³Έ νλΌλ―Έν°
|
|
15
|
+
* @param schema - κ° νλΌλ―Έν°μ μμ νμ
μ μ μν μ€ν€λ§
|
|
16
|
+
* @returns μ κ·νλ νλΌλ―Έν° κ°μ²΄
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* const args = {
|
|
20
|
+
* updates: '[{"nodeId": "123", "changes": {"status": "completed"}}]',
|
|
21
|
+
* preview: 'true',
|
|
22
|
+
* title: 'My Title'
|
|
23
|
+
* };
|
|
24
|
+
*
|
|
25
|
+
* const normalized = normalizeParams(args, {
|
|
26
|
+
* updates: 'array',
|
|
27
|
+
* preview: 'boolean',
|
|
28
|
+
* title: 'string'
|
|
29
|
+
* });
|
|
30
|
+
*
|
|
31
|
+
* // Result:
|
|
32
|
+
* // {
|
|
33
|
+
* // updates: [{ nodeId: '123', changes: { status: 'completed' } }],
|
|
34
|
+
* // preview: true,
|
|
35
|
+
* // title: 'My Title'
|
|
36
|
+
* // }
|
|
37
|
+
*/
|
|
38
|
+
export declare function normalizeParams<T extends Record<string, unknown>>(args: Record<string, unknown>, schema: ParamSchema<T>): T;
|
|
39
|
+
/**
|
|
40
|
+
* λ¨μΌ κ°μ νΉμ νμ
μΌλ‘ λ³νν©λλ€.
|
|
41
|
+
*
|
|
42
|
+
* @param value - λ³νν κ°
|
|
43
|
+
* @param expectedType - μμ νμ
|
|
44
|
+
* @returns λ³νλ κ°
|
|
45
|
+
*/
|
|
46
|
+
export declare function normalizeValue<T>(value: unknown, expectedType: ParamType): T;
|
|
47
|
+
//# sourceMappingURL=param-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"param-parser.d.ts","sourceRoot":"","sources":["../../src/utils/param-parser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE7E,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI;KAC1D,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS;CAC3B,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/D,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,GACrB,CAAC,CAgDH;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,GAAG,CAAC,CA0B5E"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP νλΌλ―Έν° μ μ²λ¦¬ μ νΈλ¦¬ν°
|
|
3
|
+
* Claude Codeκ° λ³΅μ‘ν νμ
μ λ¬Έμμ΄λ‘ μ μ‘νλ κ²½μ° μ²λ¦¬
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* MCP νλΌλ―Έν°λ₯Ό μ κ·νν©λλ€.
|
|
7
|
+
* Claude Codeκ° array, boolean, object λ±μ λ¬Έμμ΄λ‘ μ§λ ¬ννμ¬ μ μ‘νλ κ²½μ°,
|
|
8
|
+
* μ΄λ₯Ό μλ νμ
μΌλ‘ νμ±ν©λλ€.
|
|
9
|
+
*
|
|
10
|
+
* @param args - MCP λꡬμμ λ°μ μλ³Έ νλΌλ―Έν°
|
|
11
|
+
* @param schema - κ° νλΌλ―Έν°μ μμ νμ
μ μ μν μ€ν€λ§
|
|
12
|
+
* @returns μ κ·νλ νλΌλ―Έν° κ°μ²΄
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* const args = {
|
|
16
|
+
* updates: '[{"nodeId": "123", "changes": {"status": "completed"}}]',
|
|
17
|
+
* preview: 'true',
|
|
18
|
+
* title: 'My Title'
|
|
19
|
+
* };
|
|
20
|
+
*
|
|
21
|
+
* const normalized = normalizeParams(args, {
|
|
22
|
+
* updates: 'array',
|
|
23
|
+
* preview: 'boolean',
|
|
24
|
+
* title: 'string'
|
|
25
|
+
* });
|
|
26
|
+
*
|
|
27
|
+
* // Result:
|
|
28
|
+
* // {
|
|
29
|
+
* // updates: [{ nodeId: '123', changes: { status: 'completed' } }],
|
|
30
|
+
* // preview: true,
|
|
31
|
+
* // title: 'My Title'
|
|
32
|
+
* // }
|
|
33
|
+
*/
|
|
34
|
+
export function normalizeParams(args, schema) {
|
|
35
|
+
const result = {};
|
|
36
|
+
for (const [key, expectedType] of Object.entries(schema)) {
|
|
37
|
+
const value = args[key];
|
|
38
|
+
if (value === undefined)
|
|
39
|
+
continue;
|
|
40
|
+
if (typeof value === 'string' && expectedType !== 'string') {
|
|
41
|
+
try {
|
|
42
|
+
const parsed = JSON.parse(value);
|
|
43
|
+
if (expectedType === 'boolean') {
|
|
44
|
+
result[key] = typeof parsed === 'boolean' ? parsed : Boolean(parsed);
|
|
45
|
+
}
|
|
46
|
+
else if (expectedType === 'number') {
|
|
47
|
+
result[key] = typeof parsed === 'number' ? parsed : Number(parsed);
|
|
48
|
+
}
|
|
49
|
+
else if (expectedType === 'array') {
|
|
50
|
+
result[key] = Array.isArray(parsed) ? parsed : [parsed];
|
|
51
|
+
}
|
|
52
|
+
else if (expectedType === 'object') {
|
|
53
|
+
result[key] = typeof parsed === 'object' && parsed !== null ? parsed : value;
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
result[key] = parsed;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
// JSON νμ± μ€ν¨ μ booleanκ³Ό numberλ λ¬Έμμ΄μμ μ§μ λ³ν μλ
|
|
61
|
+
if (expectedType === 'boolean') {
|
|
62
|
+
result[key] = value === 'true';
|
|
63
|
+
}
|
|
64
|
+
else if (expectedType === 'number') {
|
|
65
|
+
const num = Number(value);
|
|
66
|
+
result[key] = isNaN(num) ? value : num;
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
// arrayλ object νμ
μΈλ° νμ± μ€ν¨νλ©΄ μλ³Έ μ μ§
|
|
70
|
+
result[key] = value;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
result[key] = value;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// μ€ν€λ§μ μ μλμ§ μμ νλλ 볡μ¬
|
|
79
|
+
for (const [key, value] of Object.entries(args)) {
|
|
80
|
+
if (!(key in result)) {
|
|
81
|
+
result[key] = value;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return result;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* λ¨μΌ κ°μ νΉμ νμ
μΌλ‘ λ³νν©λλ€.
|
|
88
|
+
*
|
|
89
|
+
* @param value - λ³νν κ°
|
|
90
|
+
* @param expectedType - μμ νμ
|
|
91
|
+
* @returns λ³νλ κ°
|
|
92
|
+
*/
|
|
93
|
+
export function normalizeValue(value, expectedType) {
|
|
94
|
+
if (typeof value === 'string' && expectedType !== 'string') {
|
|
95
|
+
try {
|
|
96
|
+
const parsed = JSON.parse(value);
|
|
97
|
+
if (expectedType === 'boolean') {
|
|
98
|
+
return (typeof parsed === 'boolean' ? parsed : Boolean(parsed));
|
|
99
|
+
}
|
|
100
|
+
else if (expectedType === 'number') {
|
|
101
|
+
return (typeof parsed === 'number' ? parsed : Number(parsed));
|
|
102
|
+
}
|
|
103
|
+
else if (expectedType === 'array') {
|
|
104
|
+
return (Array.isArray(parsed) ? parsed : [parsed]);
|
|
105
|
+
}
|
|
106
|
+
else if (expectedType === 'object') {
|
|
107
|
+
return (typeof parsed === 'object' && parsed !== null ? parsed : value);
|
|
108
|
+
}
|
|
109
|
+
return parsed;
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
if (expectedType === 'boolean') {
|
|
113
|
+
return (value === 'true');
|
|
114
|
+
}
|
|
115
|
+
else if (expectedType === 'number') {
|
|
116
|
+
const num = Number(value);
|
|
117
|
+
return (isNaN(num) ? value : num);
|
|
118
|
+
}
|
|
119
|
+
return value;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return value;
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=param-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"param-parser.js","sourceRoot":"","sources":["../../src/utils/param-parser.ts"],"names":[],"mappings":"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"}
|