@feeble/blay-mcp-server 0.1.0 → 0.2.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/dist/backend.d.ts +78 -0
- package/dist/backend.js +19 -0
- package/dist/backend.js.map +1 -0
- package/dist/http-backend.d.ts +11 -0
- package/dist/http-backend.js +235 -0
- package/dist/http-backend.js.map +1 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.js +22 -20
- package/dist/index.js.map +1 -1
- package/dist/register-tools.d.ts +7 -0
- package/dist/register-tools.js +41 -0
- package/dist/register-tools.js.map +1 -0
- package/dist/tools/action-items.d.ts +3 -2
- package/dist/tools/action-items.js +136 -41
- package/dist/tools/action-items.js.map +1 -1
- package/dist/tools/areas.d.ts +2 -1
- package/dist/tools/areas.js +51 -35
- package/dist/tools/areas.js.map +1 -1
- package/dist/tools/briefing.d.ts +3 -2
- package/dist/tools/briefing.js +40 -60
- package/dist/tools/briefing.js.map +1 -1
- package/dist/tools/collaborators.d.ts +2 -1
- package/dist/tools/collaborators.js +44 -32
- package/dist/tools/collaborators.js.map +1 -1
- package/dist/tools/comments.d.ts +2 -1
- package/dist/tools/comments.js +63 -50
- package/dist/tools/comments.js.map +1 -1
- package/dist/tools/context.d.ts +2 -1
- package/dist/tools/context.js +14 -10
- package/dist/tools/context.js.map +1 -1
- package/dist/tools/notifications.d.ts +2 -1
- package/dist/tools/notifications.js +33 -25
- package/dist/tools/notifications.js.map +1 -1
- package/dist/tools/org.d.ts +2 -1
- package/dist/tools/org.js +17 -14
- package/dist/tools/org.js.map +1 -1
- package/dist/tools/portal.d.ts +2 -1
- package/dist/tools/portal.js +70 -49
- package/dist/tools/portal.js.map +1 -1
- package/dist/tools/projects.d.ts +2 -1
- package/dist/tools/projects.js +61 -48
- package/dist/tools/projects.js.map +1 -1
- package/dist/tools/recurrence.d.ts +2 -1
- package/dist/tools/recurrence.js +42 -28
- package/dist/tools/recurrence.js.map +1 -1
- package/dist/tools/reminders.d.ts +2 -1
- package/dist/tools/reminders.js +57 -43
- package/dist/tools/reminders.js.map +1 -1
- package/dist/tools/resources.d.ts +2 -1
- package/dist/tools/resources.js +129 -97
- package/dist/tools/resources.js.map +1 -1
- package/dist/tools/search.d.ts +2 -1
- package/dist/tools/search.js +33 -29
- package/dist/tools/search.js.map +1 -1
- package/dist/tools/subscriptions.d.ts +2 -1
- package/dist/tools/subscriptions.js +42 -39
- package/dist/tools/subscriptions.js.map +1 -1
- package/dist/tools/tasks.d.ts +2 -1
- package/dist/tools/tasks.js +108 -90
- package/dist/tools/tasks.js.map +1 -1
- package/dist/tools/users.d.ts +2 -1
- package/dist/tools/users.js +20 -16
- package/dist/tools/users.js.map +1 -1
- package/dist/utils/formatting.js +1 -11
- package/dist/utils/formatting.js.map +1 -1
- package/package.json +23 -1
|
@@ -2,4 +2,5 @@
|
|
|
2
2
|
* Subscription Tools — subscribe, unsubscribe, mute_entity, unmute_entity
|
|
3
3
|
*/
|
|
4
4
|
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
5
|
-
|
|
5
|
+
import type { BackendAdapter } from "../backend.js";
|
|
6
|
+
export declare function registerSubscriptionTools(server: McpServer, backend: BackendAdapter): void;
|
|
@@ -2,69 +2,72 @@
|
|
|
2
2
|
* Subscription Tools — subscribe, unsubscribe, mute_entity, unmute_entity
|
|
3
3
|
*/
|
|
4
4
|
import { z } from "zod";
|
|
5
|
-
import {
|
|
6
|
-
export function registerSubscriptionTools(server) {
|
|
5
|
+
import { BackendError } from "../backend.js";
|
|
6
|
+
export function registerSubscriptionTools(server, backend) {
|
|
7
7
|
server.tool("subscribe", "Subscribe to an entity's comment feed to receive notifications. Supports tasks, projects, resources, and action items.", {
|
|
8
8
|
entityType: z.string().describe("Entity type: 'task', 'project', 'resource', or 'actionItem'"),
|
|
9
9
|
entityId: z.string().describe("The entity ID"),
|
|
10
10
|
notificationPreference: z.string().optional().describe("'all', 'mentions_only', or 'none'"),
|
|
11
11
|
}, async ({ entityType, entityId, notificationPreference }) => {
|
|
12
|
-
|
|
13
|
-
entityType,
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
12
|
+
try {
|
|
13
|
+
await backend.subscribe({ entityType, entityId, notificationPreference });
|
|
14
|
+
return {
|
|
15
|
+
content: [{ type: "text", text: `Subscribed to ${entityType} ${entityId}.` }],
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
catch (err) {
|
|
19
|
+
return {
|
|
20
|
+
content: [{ type: "text", text: err instanceof BackendError ? err.message : "Unexpected error" }],
|
|
21
|
+
};
|
|
19
22
|
}
|
|
20
|
-
return {
|
|
21
|
-
content: [{ type: "text", text: `Subscribed to ${entityType} ${entityId}.` }],
|
|
22
|
-
};
|
|
23
23
|
});
|
|
24
24
|
server.tool("unsubscribe", "Unsubscribe from an entity's comment feed to stop receiving notifications.", {
|
|
25
25
|
entityType: z.string().describe("Entity type: 'task', 'project', 'resource', or 'actionItem'"),
|
|
26
26
|
entityId: z.string().describe("The entity ID"),
|
|
27
27
|
}, async ({ entityType, entityId }) => {
|
|
28
|
-
|
|
29
|
-
entityType,
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
28
|
+
try {
|
|
29
|
+
await backend.unsubscribe({ entityType, entityId });
|
|
30
|
+
return {
|
|
31
|
+
content: [{ type: "text", text: `Unsubscribed from ${entityType} ${entityId}.` }],
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
return {
|
|
36
|
+
content: [{ type: "text", text: err instanceof BackendError ? err.message : "Unexpected error" }],
|
|
37
|
+
};
|
|
34
38
|
}
|
|
35
|
-
return {
|
|
36
|
-
content: [{ type: "text", text: `Unsubscribed from ${entityType} ${entityId}.` }],
|
|
37
|
-
};
|
|
38
39
|
});
|
|
39
40
|
server.tool("mute_entity", "Mute notifications for an entity. You stay subscribed but won't receive notifications until unmuted.", {
|
|
40
41
|
entityType: z.string().describe("Entity type: 'task', 'project', 'resource', or 'actionItem'"),
|
|
41
42
|
entityId: z.string().describe("The entity ID"),
|
|
42
43
|
}, async ({ entityType, entityId }) => {
|
|
43
|
-
|
|
44
|
-
entityType,
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
44
|
+
try {
|
|
45
|
+
await backend.muteEntity({ entityType, entityId });
|
|
46
|
+
return {
|
|
47
|
+
content: [{ type: "text", text: `Muted ${entityType} ${entityId}.` }],
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
return {
|
|
52
|
+
content: [{ type: "text", text: err instanceof BackendError ? err.message : "Unexpected error" }],
|
|
53
|
+
};
|
|
49
54
|
}
|
|
50
|
-
return {
|
|
51
|
-
content: [{ type: "text", text: `Muted ${entityType} ${entityId}.` }],
|
|
52
|
-
};
|
|
53
55
|
});
|
|
54
56
|
server.tool("unmute_entity", "Unmute notifications for an entity, restoring your previous notification preference.", {
|
|
55
57
|
entityType: z.string().describe("Entity type: 'task', 'project', 'resource', or 'actionItem'"),
|
|
56
58
|
entityId: z.string().describe("The entity ID"),
|
|
57
59
|
}, async ({ entityType, entityId }) => {
|
|
58
|
-
|
|
59
|
-
entityType,
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
60
|
+
try {
|
|
61
|
+
await backend.unmuteEntity({ entityType, entityId });
|
|
62
|
+
return {
|
|
63
|
+
content: [{ type: "text", text: `Unmuted ${entityType} ${entityId}.` }],
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
return {
|
|
68
|
+
content: [{ type: "text", text: err instanceof BackendError ? err.message : "Unexpected error" }],
|
|
69
|
+
};
|
|
64
70
|
}
|
|
65
|
-
return {
|
|
66
|
-
content: [{ type: "text", text: `Unmuted ${entityType} ${entityId}.` }],
|
|
67
|
-
};
|
|
68
71
|
});
|
|
69
72
|
}
|
|
70
73
|
//# sourceMappingURL=subscriptions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subscriptions.js","sourceRoot":"","sources":["../../src/tools/subscriptions.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"subscriptions.js","sourceRoot":"","sources":["../../src/tools/subscriptions.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/tasks.d.ts
CHANGED
|
@@ -2,4 +2,5 @@
|
|
|
2
2
|
* Task Tools — list_tasks, get_task, create_task, update_task, link_tasks, unlink_tasks
|
|
3
3
|
*/
|
|
4
4
|
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
5
|
-
|
|
5
|
+
import type { BackendAdapter } from "../backend.js";
|
|
6
|
+
export declare function registerTaskTools(server: McpServer, backend: BackendAdapter): void;
|
package/dist/tools/tasks.js
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
* Task Tools — list_tasks, get_task, create_task, update_task, link_tasks, unlink_tasks
|
|
3
3
|
*/
|
|
4
4
|
import { z } from "zod";
|
|
5
|
-
import {
|
|
5
|
+
import { BackendError } from "../backend.js";
|
|
6
6
|
import { formatTask, formatTaskDetail, formatConfirmation } from "../utils/formatting.js";
|
|
7
|
-
export function registerTaskTools(server) {
|
|
7
|
+
export function registerTaskTools(server, backend) {
|
|
8
8
|
server.tool("list_tasks", "List tasks with filtering. Use this to explore tasks across projects or for a specific person. For a quick overview of your own work, use get_my_briefing instead. Supports filtering by project, assignee, status, priority, overdue, blocked, stale, and date ranges.", {
|
|
9
9
|
projectId: z.string().optional().describe("Filter by project ID"),
|
|
10
10
|
assigneeId: z.string().optional().describe("Filter by assignee user ID"),
|
|
@@ -16,53 +16,58 @@ export function registerTaskTools(server) {
|
|
|
16
16
|
staleDays: z.number().optional().describe("Days without update to consider stale (default 7)"),
|
|
17
17
|
limit: z.number().optional().describe("Max results (default 50, max 100)"),
|
|
18
18
|
}, async (params) => {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
19
|
+
try {
|
|
20
|
+
const result = await backend.listTasks({
|
|
21
|
+
projectId: params.projectId,
|
|
22
|
+
assigneeId: params.assigneeId,
|
|
23
|
+
status: params.status,
|
|
24
|
+
priority: params.priority,
|
|
25
|
+
overdue: params.overdue,
|
|
26
|
+
blocked: params.blocked,
|
|
27
|
+
stale: params.stale,
|
|
28
|
+
staleDays: params.staleDays,
|
|
29
|
+
limit: params.limit,
|
|
30
|
+
});
|
|
31
|
+
const tasks = result.data ?? [];
|
|
32
|
+
if (tasks.length === 0) {
|
|
33
|
+
return { content: [{ type: "text", text: "No tasks found matching your filters." }] };
|
|
34
|
+
}
|
|
35
|
+
return {
|
|
36
|
+
content: [
|
|
37
|
+
{
|
|
38
|
+
type: "text",
|
|
39
|
+
text: `# Tasks (${tasks.length})\n\n${tasks.map(formatTask).join("\n")}`,
|
|
40
|
+
},
|
|
41
|
+
],
|
|
42
|
+
};
|
|
33
43
|
}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
44
|
+
catch (err) {
|
|
45
|
+
return {
|
|
46
|
+
content: [{ type: "text", text: err instanceof BackendError ? err.message : "Unexpected error" }],
|
|
47
|
+
};
|
|
37
48
|
}
|
|
38
|
-
return {
|
|
39
|
-
content: [
|
|
40
|
-
{
|
|
41
|
-
type: "text",
|
|
42
|
-
text: `# Tasks (${tasks.length})\n\n${tasks.map(formatTask).join("\n")}`,
|
|
43
|
-
},
|
|
44
|
-
],
|
|
45
|
-
};
|
|
46
49
|
});
|
|
47
|
-
server.tool("get_task", "Get full detail on a single task including description,
|
|
50
|
+
server.tool("get_task", "Get full detail on a single task including description, comments, and resources. Use this after finding a task via list_tasks, search, or get_my_briefing. For comprehensive context including project info in one call, prefer get_entity_context.", {
|
|
48
51
|
taskId: z.string().describe("The task ID"),
|
|
49
|
-
includeSubtasks: z.boolean().optional().describe("Include subtasks"),
|
|
50
52
|
includeComments: z.boolean().optional().describe("Include comments"),
|
|
51
53
|
includeResources: z.boolean().optional().describe("Include attached resources"),
|
|
52
54
|
includeLinks: z.boolean().optional().describe("Include task links"),
|
|
53
|
-
}, async ({ taskId,
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
55
|
+
}, async ({ taskId, includeComments, includeResources, includeLinks }) => {
|
|
56
|
+
try {
|
|
57
|
+
const data = await backend.getTask(taskId, {
|
|
58
|
+
includeComments,
|
|
59
|
+
includeResources,
|
|
60
|
+
includeLinks,
|
|
61
|
+
});
|
|
62
|
+
return {
|
|
63
|
+
content: [{ type: "text", text: formatTaskDetail(data) }],
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
return {
|
|
68
|
+
content: [{ type: "text", text: err instanceof BackendError ? err.message : "Unexpected error" }],
|
|
69
|
+
};
|
|
62
70
|
}
|
|
63
|
-
return {
|
|
64
|
-
content: [{ type: "text", text: formatTaskDetail(res.data) }],
|
|
65
|
-
};
|
|
66
71
|
});
|
|
67
72
|
server.tool("create_task", "Create a new task in a project. You need a project ID — use list_projects to find one if the user hasn't specified it.", {
|
|
68
73
|
name: z.string().describe("Task name"),
|
|
@@ -71,23 +76,25 @@ export function registerTaskTools(server) {
|
|
|
71
76
|
priority: z.string().optional().describe("Priority (low, medium, high, urgent)"),
|
|
72
77
|
ownerId: z.string().optional().describe("Assignee user ID"),
|
|
73
78
|
dueDate: z.number().optional().describe("Due date as Unix timestamp in milliseconds"),
|
|
74
|
-
parentTaskId: z.string().optional().describe("Parent task ID (creates a subtask)"),
|
|
75
79
|
}, async (params) => {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
80
|
+
try {
|
|
81
|
+
const data = await backend.createTask({
|
|
82
|
+
name: params.name,
|
|
83
|
+
projectId: params.projectId,
|
|
84
|
+
status: params.status,
|
|
85
|
+
priority: params.priority,
|
|
86
|
+
ownerId: params.ownerId,
|
|
87
|
+
dueDate: params.dueDate,
|
|
88
|
+
});
|
|
89
|
+
return {
|
|
90
|
+
content: [{ type: "text", text: formatConfirmation("Task created", data) }],
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
return {
|
|
95
|
+
content: [{ type: "text", text: err instanceof BackendError ? err.message : "Unexpected error" }],
|
|
96
|
+
};
|
|
87
97
|
}
|
|
88
|
-
return {
|
|
89
|
-
content: [{ type: "text", text: formatConfirmation("Task created", res.data) }],
|
|
90
|
-
};
|
|
91
98
|
});
|
|
92
99
|
server.tool("update_task", "Update an existing task's fields. Use get_task or list_tasks first to confirm the current state before making changes.", {
|
|
93
100
|
taskId: z.string().describe("The task ID to update"),
|
|
@@ -99,18 +106,22 @@ export function registerTaskTools(server) {
|
|
|
99
106
|
isBlocked: z.boolean().optional().describe("Whether the task is blocked"),
|
|
100
107
|
blockedReason: z.string().optional().describe("Reason the task is blocked"),
|
|
101
108
|
}, async ({ taskId, ...updates }) => {
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
109
|
+
try {
|
|
110
|
+
const body = {};
|
|
111
|
+
for (const [key, value] of Object.entries(updates)) {
|
|
112
|
+
if (value !== undefined)
|
|
113
|
+
body[key] = value;
|
|
114
|
+
}
|
|
115
|
+
const data = await backend.updateTask(taskId, body);
|
|
116
|
+
return {
|
|
117
|
+
content: [{ type: "text", text: formatConfirmation("Task updated", data) }],
|
|
118
|
+
};
|
|
106
119
|
}
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
120
|
+
catch (err) {
|
|
121
|
+
return {
|
|
122
|
+
content: [{ type: "text", text: err instanceof BackendError ? err.message : "Unexpected error" }],
|
|
123
|
+
};
|
|
110
124
|
}
|
|
111
|
-
return {
|
|
112
|
-
content: [{ type: "text", text: formatConfirmation("Task updated", res.data) }],
|
|
113
|
-
};
|
|
114
125
|
});
|
|
115
126
|
server.tool("link_tasks", "Create a dependency or relationship between a task and another entity. Can link task-to-task (with reciprocal links) or task-to-resource/project/action_item. For task targets, use targetTaskId. For other entities, use entityType+entityId.", {
|
|
116
127
|
taskId: z.string().describe("The source task ID"),
|
|
@@ -119,37 +130,44 @@ export function registerTaskTools(server) {
|
|
|
119
130
|
entityType: z.string().optional().describe("Target entity type: 'task', 'resource', 'project', or 'action_item'"),
|
|
120
131
|
entityId: z.string().optional().describe("Target entity ID (use with entityType for non-task links)"),
|
|
121
132
|
}, async ({ taskId, targetTaskId, linkType, entityType, entityId }) => {
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
133
|
+
try {
|
|
134
|
+
const body = { linkType };
|
|
135
|
+
if (targetTaskId)
|
|
136
|
+
body.targetTaskId = targetTaskId;
|
|
137
|
+
if (entityType)
|
|
138
|
+
body.entityType = entityType;
|
|
139
|
+
if (entityId)
|
|
140
|
+
body.entityId = entityId;
|
|
141
|
+
const data = await backend.linkTask(taskId, body);
|
|
142
|
+
const targetDesc = entityType && entityId
|
|
143
|
+
? `${entityType}:${entityId}`
|
|
144
|
+
: targetTaskId ?? "unknown";
|
|
145
|
+
const text = data.alreadyExists
|
|
146
|
+
? `Link already exists (id: ${data.id}).`
|
|
147
|
+
: `Task link created: ${taskId} ${linkType} ${targetDesc} (id: ${data.id}).`;
|
|
148
|
+
return { content: [{ type: "text", text }] };
|
|
149
|
+
}
|
|
150
|
+
catch (err) {
|
|
151
|
+
return {
|
|
152
|
+
content: [{ type: "text", text: err instanceof BackendError ? err.message : "Unexpected error" }],
|
|
153
|
+
};
|
|
132
154
|
}
|
|
133
|
-
const data = res.data;
|
|
134
|
-
const targetDesc = entityType && entityId
|
|
135
|
-
? `${entityType}:${entityId}`
|
|
136
|
-
: targetTaskId ?? "unknown";
|
|
137
|
-
const text = data.alreadyExists
|
|
138
|
-
? `Link already exists (id: ${data.id}).`
|
|
139
|
-
: `Task link created: ${taskId} ${linkType} ${targetDesc} (id: ${data.id}).`;
|
|
140
|
-
return { content: [{ type: "text", text }] };
|
|
141
155
|
});
|
|
142
156
|
server.tool("unlink_tasks", "Remove a task link. Use get_task with includeLinks=true to find the link ID first. The reciprocal link on the target task is also removed.", {
|
|
143
157
|
taskId: z.string().describe("The task ID that owns the link"),
|
|
144
158
|
linkId: z.string().describe("The link ID to remove"),
|
|
145
159
|
}, async ({ taskId, linkId }) => {
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
return {
|
|
160
|
+
try {
|
|
161
|
+
await backend.unlinkTask(taskId, linkId);
|
|
162
|
+
return {
|
|
163
|
+
content: [{ type: "text", text: `Task link removed (id: ${linkId}).` }],
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
catch (err) {
|
|
167
|
+
return {
|
|
168
|
+
content: [{ type: "text", text: err instanceof BackendError ? err.message : "Unexpected error" }],
|
|
169
|
+
};
|
|
149
170
|
}
|
|
150
|
-
return {
|
|
151
|
-
content: [{ type: "text", text: `Task link removed (id: ${linkId}).` }],
|
|
152
|
-
};
|
|
153
171
|
});
|
|
154
172
|
}
|
|
155
173
|
//# sourceMappingURL=tasks.js.map
|
package/dist/tools/tasks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/tools/tasks.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/tools/tasks.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/users.d.ts
CHANGED
|
@@ -2,4 +2,5 @@
|
|
|
2
2
|
* User Tools — list_users
|
|
3
3
|
*/
|
|
4
4
|
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
5
|
-
|
|
5
|
+
import type { BackendAdapter } from "../backend.js";
|
|
6
|
+
export declare function registerUserTools(server: McpServer, backend: BackendAdapter): void;
|
package/dist/tools/users.js
CHANGED
|
@@ -1,26 +1,30 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* User Tools — list_users
|
|
3
3
|
*/
|
|
4
|
-
import {
|
|
4
|
+
import { BackendError } from "../backend.js";
|
|
5
5
|
import { formatUser } from "../utils/formatting.js";
|
|
6
|
-
export function registerUserTools(server) {
|
|
6
|
+
export function registerUserTools(server, backend) {
|
|
7
7
|
server.tool("list_users", "List all members of the organization. Use this to find user IDs for assigning tasks or action items, or to see who's on the team.", {}, async () => {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
try {
|
|
9
|
+
const result = await backend.listUsers();
|
|
10
|
+
const users = result.data ?? [];
|
|
11
|
+
if (users.length === 0) {
|
|
12
|
+
return { content: [{ type: "text", text: "No users found." }] };
|
|
13
|
+
}
|
|
14
|
+
return {
|
|
15
|
+
content: [
|
|
16
|
+
{
|
|
17
|
+
type: "text",
|
|
18
|
+
text: `# Organization Members (${users.length})\n\n${users.map(formatUser).join("\n")}`,
|
|
19
|
+
},
|
|
20
|
+
],
|
|
21
|
+
};
|
|
11
22
|
}
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
23
|
+
catch (err) {
|
|
24
|
+
return {
|
|
25
|
+
content: [{ type: "text", text: err instanceof BackendError ? err.message : "Unexpected error" }],
|
|
26
|
+
};
|
|
15
27
|
}
|
|
16
|
-
return {
|
|
17
|
-
content: [
|
|
18
|
-
{
|
|
19
|
-
type: "text",
|
|
20
|
-
text: `# Organization Members (${users.length})\n\n${users.map(formatUser).join("\n")}`,
|
|
21
|
-
},
|
|
22
|
-
],
|
|
23
|
-
};
|
|
24
28
|
});
|
|
25
29
|
}
|
|
26
30
|
//# sourceMappingURL=users.js.map
|
package/dist/tools/users.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"users.js","sourceRoot":"","sources":["../../src/tools/users.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"users.js","sourceRoot":"","sources":["../../src/tools/users.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,MAAM,UAAU,iBAAiB,CAAC,MAAiB,EAAE,OAAuB;IAC1E,MAAM,CAAC,IAAI,CACT,YAAY,EACZ,mIAAmI,EACnI,EAAE,EACF,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC;YACzC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YAChC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;YAC3E,CAAC;YAED,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,2BAA2B,KAAK,CAAC,MAAM,QAAQ,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;qBACxF;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,GAAG,YAAY,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,EAAE,CAAC;aAC3G,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
package/dist/utils/formatting.js
CHANGED
|
@@ -108,16 +108,11 @@ export function formatTaskDetail(task) {
|
|
|
108
108
|
if (task.description) {
|
|
109
109
|
sections.push(`## Description\n${task.description}`);
|
|
110
110
|
}
|
|
111
|
-
// Subtasks
|
|
112
|
-
const subtasks = task.subtasks;
|
|
113
|
-
if (subtasks && subtasks.length > 0) {
|
|
114
|
-
sections.push(`## Subtasks (${subtasks.length})\n${subtasks.map(formatTask).join("\n")}`);
|
|
115
|
-
}
|
|
116
111
|
// Comments
|
|
117
112
|
const comments = task.comments;
|
|
118
113
|
if (comments && comments.length > 0) {
|
|
119
114
|
const formatted = comments
|
|
120
|
-
.map((c) => `**${c.authorName ?? "Unknown"}** (${formatRelativeDate(c.createdAt)}):\n${c.content}`)
|
|
115
|
+
.map((c) => `**${c.authorName ?? "Unknown"}** (${formatRelativeDate(c.createdAt)}) (id: ${c._id ?? c.id}):\n${c.content}`)
|
|
121
116
|
.join("\n\n---\n\n");
|
|
122
117
|
sections.push(`## Comments (${comments.length})\n${formatted}`);
|
|
123
118
|
}
|
|
@@ -197,11 +192,6 @@ export function formatContextEntity(ctx) {
|
|
|
197
192
|
.join("\n\n---\n\n");
|
|
198
193
|
sections.push(`## Recent Comments (${comments.length})\n${formatted}`);
|
|
199
194
|
}
|
|
200
|
-
// Subtasks from context
|
|
201
|
-
const subtasks = ctx.subtasks;
|
|
202
|
-
if (subtasks && subtasks.length > 0 && !entity.subtasks) {
|
|
203
|
-
sections.push(`## Subtasks (${subtasks.length})\n${subtasks.map(formatTask).join("\n")}`);
|
|
204
|
-
}
|
|
205
195
|
// Collaborators from context (for projects)
|
|
206
196
|
const collaborators = ctx.collaborators;
|
|
207
197
|
if (collaborators && collaborators.length > 0 && !entity.collaborators) {
|