@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
|
@@ -1,37 +1,43 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Action Item Tools — list_action_items, create_action_item, update_action_item
|
|
2
|
+
* Action Item Tools — list_action_items, create_action_item, update_action_item, link_action_item, unlink_action_item
|
|
3
3
|
*/
|
|
4
4
|
import { z } from "zod";
|
|
5
|
-
import {
|
|
5
|
+
import { BackendError } from "../backend.js";
|
|
6
6
|
import { formatActionItem, formatConfirmation } from "../utils/formatting.js";
|
|
7
|
-
export function registerActionItemTools(server) {
|
|
8
|
-
server.tool("list_action_items", "List action items (discrete to-dos assigned to people). Use this for follow-ups and commitments — these are separate from tasks. Filter by assignee, status, or
|
|
7
|
+
export function registerActionItemTools(server, backend) {
|
|
8
|
+
server.tool("list_action_items", "List action items (discrete to-dos assigned to people). Use this for follow-ups and commitments — these are separate from tasks. Filter by assignee, status, overdue, or linked task.", {
|
|
9
9
|
assigneeId: z.string().optional().describe("Filter by assignee user ID"),
|
|
10
10
|
status: z.string().optional().describe("Filter by status (pending, completed, cancelled)"),
|
|
11
11
|
overdue: z.boolean().optional().describe("Only return overdue action items"),
|
|
12
|
+
taskId: z.string().optional().describe("Filter by linked task ID — returns only action items linked to this task"),
|
|
12
13
|
limit: z.number().optional().describe("Max results (default 50)"),
|
|
13
14
|
}, async (params) => {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
15
|
+
try {
|
|
16
|
+
const result = await backend.listActionItems({
|
|
17
|
+
assigneeId: params.assigneeId,
|
|
18
|
+
status: params.status,
|
|
19
|
+
overdue: params.overdue,
|
|
20
|
+
taskId: params.taskId,
|
|
21
|
+
limit: params.limit,
|
|
22
|
+
});
|
|
23
|
+
const items = result.data ?? [];
|
|
24
|
+
if (items.length === 0) {
|
|
25
|
+
return { content: [{ type: "text", text: "No action items found." }] };
|
|
26
|
+
}
|
|
27
|
+
return {
|
|
28
|
+
content: [
|
|
29
|
+
{
|
|
30
|
+
type: "text",
|
|
31
|
+
text: `# Action Items (${items.length})\n\n${items.map(formatActionItem).join("\n")}`,
|
|
32
|
+
},
|
|
33
|
+
],
|
|
34
|
+
};
|
|
22
35
|
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
36
|
+
catch (err) {
|
|
37
|
+
return {
|
|
38
|
+
content: [{ type: "text", text: err instanceof BackendError ? err.message : "Unexpected error" }],
|
|
39
|
+
};
|
|
26
40
|
}
|
|
27
|
-
return {
|
|
28
|
-
content: [
|
|
29
|
-
{
|
|
30
|
-
type: "text",
|
|
31
|
-
text: `# Action Items (${items.length})\n\n${items.map(formatActionItem).join("\n")}`,
|
|
32
|
-
},
|
|
33
|
-
],
|
|
34
|
-
};
|
|
35
41
|
});
|
|
36
42
|
server.tool("create_action_item", "Create a new action item assigned to a user. Action items are discrete follow-ups or commitments — use tasks for larger pieces of work.", {
|
|
37
43
|
title: z.string().describe("Action item title"),
|
|
@@ -39,40 +45,129 @@ export function registerActionItemTools(server) {
|
|
|
39
45
|
priority: z.string().optional().describe("Priority level"),
|
|
40
46
|
dueDate: z.number().optional().describe("Due date as Unix timestamp in milliseconds"),
|
|
41
47
|
projectId: z.string().optional().describe("Associated project ID"),
|
|
48
|
+
taskId: z.string().optional().describe("Task ID to link this action item to"),
|
|
42
49
|
}, async (params) => {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
50
|
+
try {
|
|
51
|
+
const data = await backend.createActionItem({
|
|
52
|
+
title: params.title,
|
|
53
|
+
targetUserId: params.targetUserId,
|
|
54
|
+
priority: params.priority,
|
|
55
|
+
dueDate: params.dueDate,
|
|
56
|
+
projectId: params.projectId,
|
|
57
|
+
taskId: params.taskId,
|
|
58
|
+
});
|
|
59
|
+
return {
|
|
60
|
+
content: [{ type: "text", text: formatConfirmation("Action item created", data) }],
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
return {
|
|
65
|
+
content: [{ type: "text", text: err instanceof BackendError ? err.message : "Unexpected error" }],
|
|
66
|
+
};
|
|
52
67
|
}
|
|
53
|
-
return {
|
|
54
|
-
content: [{ type: "text", text: formatConfirmation("Action item created", res.data) }],
|
|
55
|
-
};
|
|
56
68
|
});
|
|
57
|
-
server.tool("update_action_item", "Update an existing action item's fields.
|
|
69
|
+
server.tool("update_action_item", "Update an existing action item's fields. You can also move it to a different task by passing taskId — this automatically removes the old task link and creates a new one.", {
|
|
58
70
|
actionItemId: z.string().describe("The action item ID to update"),
|
|
59
71
|
title: z.string().optional().describe("New title"),
|
|
60
72
|
status: z.string().optional().describe("New status (pending, completed, cancelled)"),
|
|
61
73
|
priority: z.string().optional().describe("New priority"),
|
|
62
74
|
dueDate: z.number().optional().describe("New due date as Unix timestamp in milliseconds"),
|
|
63
|
-
|
|
75
|
+
targetUserId: z.string().optional().describe("Reassign to a different user by their user ID"),
|
|
76
|
+
taskId: z.string().optional().describe("Move this action item to a different task (removes old task link, creates new one)"),
|
|
77
|
+
}, async ({ actionItemId, taskId, ...updates }) => {
|
|
78
|
+
const messages = [];
|
|
64
79
|
const body = {};
|
|
65
80
|
for (const [key, value] of Object.entries(updates)) {
|
|
66
81
|
if (value !== undefined)
|
|
67
82
|
body[key] = value;
|
|
68
83
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
84
|
+
if (Object.keys(body).length > 0) {
|
|
85
|
+
try {
|
|
86
|
+
const data = await backend.updateActionItem(actionItemId, body);
|
|
87
|
+
messages.push(formatConfirmation("Action item updated", data));
|
|
88
|
+
}
|
|
89
|
+
catch (err) {
|
|
90
|
+
return {
|
|
91
|
+
content: [{ type: "text", text: err instanceof BackendError ? err.message : "Unexpected error" }],
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
if (taskId) {
|
|
96
|
+
// Find existing task links
|
|
97
|
+
try {
|
|
98
|
+
const linksResult = await backend.getActionItemLinks(actionItemId);
|
|
99
|
+
if (linksResult.data) {
|
|
100
|
+
for (const link of linksResult.data) {
|
|
101
|
+
if (link.entityType === "task") {
|
|
102
|
+
try {
|
|
103
|
+
await backend.deleteActionItemLink(actionItemId, link.linkId);
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
// Best effort — continue
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
// Best effort — continue to link
|
|
114
|
+
}
|
|
115
|
+
try {
|
|
116
|
+
await backend.linkActionItem(actionItemId, {
|
|
117
|
+
entityType: "task",
|
|
118
|
+
entityId: taskId,
|
|
119
|
+
linkType: "related",
|
|
120
|
+
});
|
|
121
|
+
messages.push(`Moved to task ${taskId}.`);
|
|
122
|
+
}
|
|
123
|
+
catch (err) {
|
|
124
|
+
messages.push(`Failed to link to task ${taskId}: ${err instanceof BackendError ? err.message : "Unexpected error"}`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
if (messages.length === 0) {
|
|
128
|
+
messages.push("No changes specified.");
|
|
72
129
|
}
|
|
73
130
|
return {
|
|
74
|
-
content: [{ type: "text", text:
|
|
131
|
+
content: [{ type: "text", text: messages.join("\n") }],
|
|
75
132
|
};
|
|
76
133
|
});
|
|
134
|
+
server.tool("link_action_item", "Create a link between an action item and another entity (task, project, resource, or idea). Use this to associate an existing action item with related entities after creation.", {
|
|
135
|
+
actionItemId: z.string().describe("The action item ID to link from"),
|
|
136
|
+
entityType: z.string().describe("Target entity type: 'task', 'project', 'resource', or 'idea'"),
|
|
137
|
+
entityId: z.string().describe("Target entity ID"),
|
|
138
|
+
linkType: z.string().optional().describe("Link type (defaults to 'related')"),
|
|
139
|
+
}, async ({ actionItemId, entityType, entityId, linkType }) => {
|
|
140
|
+
try {
|
|
141
|
+
const body = { entityType, entityId };
|
|
142
|
+
if (linkType)
|
|
143
|
+
body.linkType = linkType;
|
|
144
|
+
const data = await backend.linkActionItem(actionItemId, body);
|
|
145
|
+
const text = data.alreadyExists
|
|
146
|
+
? `Link already exists (id: ${data.id}).`
|
|
147
|
+
: `Action item link created: ${actionItemId} → ${entityType}:${entityId} (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
|
+
};
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
server.tool("unlink_action_item", "Remove a link from an action item. Use list_action_items or the action item's links to find the link ID first.", {
|
|
157
|
+
actionItemId: z.string().describe("The action item ID that owns the link"),
|
|
158
|
+
linkId: z.string().describe("The link ID to remove"),
|
|
159
|
+
}, async ({ actionItemId, linkId }) => {
|
|
160
|
+
try {
|
|
161
|
+
await backend.deleteActionItemLink(actionItemId, linkId);
|
|
162
|
+
return {
|
|
163
|
+
content: [{ type: "text", text: `Action item link removed (id: ${linkId}).` }],
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
catch (err) {
|
|
167
|
+
return {
|
|
168
|
+
content: [{ type: "text", text: err instanceof BackendError ? err.message : "Unexpected error" }],
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
});
|
|
77
172
|
}
|
|
78
173
|
//# sourceMappingURL=action-items.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action-items.js","sourceRoot":"","sources":["../../src/tools/action-items.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"action-items.js","sourceRoot":"","sources":["../../src/tools/action-items.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/areas.d.ts
CHANGED
|
@@ -2,4 +2,5 @@
|
|
|
2
2
|
* Area Tools — list_areas, create_area, update_area, archive_area
|
|
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 registerAreaTools(server: McpServer, backend: BackendAdapter): void;
|
package/dist/tools/areas.js
CHANGED
|
@@ -2,25 +2,29 @@
|
|
|
2
2
|
* Area Tools — list_areas, create_area, update_area, archive_area
|
|
3
3
|
*/
|
|
4
4
|
import { z } from "zod";
|
|
5
|
-
import {
|
|
5
|
+
import { BackendError } from "../backend.js";
|
|
6
6
|
import { formatArea, formatConfirmation } from "../utils/formatting.js";
|
|
7
|
-
export function registerAreaTools(server) {
|
|
7
|
+
export function registerAreaTools(server, backend) {
|
|
8
8
|
server.tool("list_areas", "List project areas for the organization. Areas group related projects together.", {
|
|
9
9
|
includeInactive: z.boolean().optional().describe("Include archived/inactive areas"),
|
|
10
10
|
}, async ({ includeInactive }) => {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
try {
|
|
12
|
+
const result = await backend.listAreas({ includeInactive });
|
|
13
|
+
const areas = result.data ?? [];
|
|
14
|
+
if (areas.length === 0) {
|
|
15
|
+
return { content: [{ type: "text", text: "No areas found." }] };
|
|
16
|
+
}
|
|
17
|
+
return {
|
|
18
|
+
content: [
|
|
19
|
+
{ type: "text", text: `# Areas (${areas.length})\n\n${areas.map(formatArea).join("\n")}` },
|
|
20
|
+
],
|
|
21
|
+
};
|
|
14
22
|
}
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
23
|
+
catch (err) {
|
|
24
|
+
return {
|
|
25
|
+
content: [{ type: "text", text: err instanceof BackendError ? err.message : "Unexpected error" }],
|
|
26
|
+
};
|
|
18
27
|
}
|
|
19
|
-
return {
|
|
20
|
-
content: [
|
|
21
|
-
{ type: "text", text: `# Areas (${areas.length})\n\n${areas.map(formatArea).join("\n")}` },
|
|
22
|
-
],
|
|
23
|
-
};
|
|
24
28
|
});
|
|
25
29
|
server.tool("create_area", "Create a new project area. Admin only. Areas are used to group related projects.", {
|
|
26
30
|
name: z.string().describe("Area name"),
|
|
@@ -30,13 +34,17 @@ export function registerAreaTools(server) {
|
|
|
30
34
|
parentAreaId: z.string().optional().describe("Parent area ID for hierarchy"),
|
|
31
35
|
isDefault: z.boolean().optional().describe("Set as default area for new projects"),
|
|
32
36
|
}, async (params) => {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
return {
|
|
37
|
+
try {
|
|
38
|
+
const data = await backend.createArea(params);
|
|
39
|
+
return {
|
|
40
|
+
content: [{ type: "text", text: formatConfirmation("Area created", data) }],
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
return {
|
|
45
|
+
content: [{ type: "text", text: err instanceof BackendError ? err.message : "Unexpected error" }],
|
|
46
|
+
};
|
|
36
47
|
}
|
|
37
|
-
return {
|
|
38
|
-
content: [{ type: "text", text: formatConfirmation("Area created", res.data) }],
|
|
39
|
-
};
|
|
40
48
|
});
|
|
41
49
|
server.tool("update_area", "Update an area's properties. Admin only.", {
|
|
42
50
|
areaId: z.string().describe("The area ID to update"),
|
|
@@ -46,29 +54,37 @@ export function registerAreaTools(server) {
|
|
|
46
54
|
ownerId: z.string().optional().describe("New owner user ID"),
|
|
47
55
|
isDefault: z.boolean().optional().describe("Set as default area"),
|
|
48
56
|
}, async ({ areaId, ...updates }) => {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
57
|
+
try {
|
|
58
|
+
const body = {};
|
|
59
|
+
for (const [key, value] of Object.entries(updates)) {
|
|
60
|
+
if (value !== undefined)
|
|
61
|
+
body[key] = value;
|
|
62
|
+
}
|
|
63
|
+
await backend.updateArea(areaId, body);
|
|
64
|
+
return {
|
|
65
|
+
content: [{ type: "text", text: `Area updated (id: ${areaId}).` }],
|
|
66
|
+
};
|
|
53
67
|
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
68
|
+
catch (err) {
|
|
69
|
+
return {
|
|
70
|
+
content: [{ type: "text", text: err instanceof BackendError ? err.message : "Unexpected error" }],
|
|
71
|
+
};
|
|
57
72
|
}
|
|
58
|
-
return {
|
|
59
|
-
content: [{ type: "text", text: `Area updated (id: ${areaId}).` }],
|
|
60
|
-
};
|
|
61
73
|
});
|
|
62
74
|
server.tool("archive_area", "Archive an area. Admin only. Cannot archive areas with active projects.", {
|
|
63
75
|
areaId: z.string().describe("The area ID to archive"),
|
|
64
76
|
}, async ({ areaId }) => {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
return {
|
|
77
|
+
try {
|
|
78
|
+
await backend.archiveArea(areaId);
|
|
79
|
+
return {
|
|
80
|
+
content: [{ type: "text", text: `Area archived (id: ${areaId}).` }],
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
catch (err) {
|
|
84
|
+
return {
|
|
85
|
+
content: [{ type: "text", text: err instanceof BackendError ? err.message : "Unexpected error" }],
|
|
86
|
+
};
|
|
68
87
|
}
|
|
69
|
-
return {
|
|
70
|
-
content: [{ type: "text", text: `Area archived (id: ${areaId}).` }],
|
|
71
|
-
};
|
|
72
88
|
});
|
|
73
89
|
}
|
|
74
90
|
//# sourceMappingURL=areas.js.map
|
package/dist/tools/areas.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"areas.js","sourceRoot":"","sources":["../../src/tools/areas.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"areas.js","sourceRoot":"","sources":["../../src/tools/areas.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/briefing.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Briefing Tool — get_my_briefing
|
|
3
3
|
*
|
|
4
|
-
* The key composite tool. Calls multiple
|
|
4
|
+
* The key composite tool. Calls multiple backend methods in parallel and
|
|
5
5
|
* assembles a complete context dump in one tool call.
|
|
6
6
|
*/
|
|
7
7
|
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
8
|
-
|
|
8
|
+
import type { BackendAdapter } from "../backend.js";
|
|
9
|
+
export declare function registerBriefingTools(server: McpServer, backend: BackendAdapter): void;
|
package/dist/tools/briefing.js
CHANGED
|
@@ -1,75 +1,55 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Briefing Tool — get_my_briefing
|
|
3
3
|
*
|
|
4
|
-
* The key composite tool. Calls multiple
|
|
4
|
+
* The key composite tool. Calls multiple backend methods in parallel and
|
|
5
5
|
* assembles a complete context dump in one tool call.
|
|
6
6
|
*/
|
|
7
|
-
import {
|
|
7
|
+
import { BackendError } from "../backend.js";
|
|
8
8
|
import { formatTask, formatActionItem, formatNotification, formatUser, formatRelativeDate, } from "../utils/formatting.js";
|
|
9
|
-
|
|
9
|
+
/** Safely call a backend method, returning null on failure. */
|
|
10
|
+
async function safe(fn) {
|
|
11
|
+
try {
|
|
12
|
+
return await fn();
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export function registerBriefingTools(server, backend) {
|
|
10
19
|
server.tool("get_my_briefing", "Get a complete briefing of your current work in Blay. Returns your identity, urgent/overdue items, in-progress tasks (with stale flags), backlog, recently completed work, blocked items, pending action items, unread notifications, and team summary. This is the best tool to start with when you need context about the user's work.", {}, async () => {
|
|
11
|
-
// First get user identity
|
|
12
|
-
|
|
13
|
-
|
|
20
|
+
// First get user identity — hard dependency
|
|
21
|
+
let me;
|
|
22
|
+
try {
|
|
23
|
+
me = await backend.getMe();
|
|
24
|
+
}
|
|
25
|
+
catch (err) {
|
|
14
26
|
return {
|
|
15
27
|
content: [
|
|
16
28
|
{
|
|
17
29
|
type: "text",
|
|
18
|
-
text: `Error fetching user identity: ${
|
|
30
|
+
text: `Error fetching user identity: ${err instanceof BackendError ? err.message : "Unexpected error"}`,
|
|
19
31
|
},
|
|
20
32
|
],
|
|
21
33
|
};
|
|
22
34
|
}
|
|
23
|
-
const me = meRes.data;
|
|
24
35
|
const userId = me.userId;
|
|
25
|
-
// Fetch all data in parallel
|
|
26
|
-
const [
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
}),
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
limit: "20",
|
|
37
|
-
}),
|
|
38
|
-
apiGet("/api/v1/tasks", {
|
|
39
|
-
assigneeId: userId,
|
|
40
|
-
overdue: "true",
|
|
41
|
-
limit: "20",
|
|
42
|
-
}),
|
|
43
|
-
apiGet("/api/v1/tasks", {
|
|
44
|
-
assigneeId: userId,
|
|
45
|
-
blocked: "true",
|
|
46
|
-
limit: "20",
|
|
47
|
-
}),
|
|
48
|
-
apiGet("/api/v1/tasks", {
|
|
49
|
-
assigneeId: userId,
|
|
50
|
-
stale: "true",
|
|
51
|
-
limit: "20",
|
|
52
|
-
}),
|
|
53
|
-
apiGet("/api/v1/tasks", {
|
|
54
|
-
assigneeId: userId,
|
|
55
|
-
status: "completed",
|
|
56
|
-
limit: "5",
|
|
57
|
-
}),
|
|
58
|
-
apiGet("/api/v1/action-items", {
|
|
59
|
-
assigneeId: userId,
|
|
60
|
-
status: "pending",
|
|
61
|
-
limit: "20",
|
|
62
|
-
}),
|
|
63
|
-
apiGet("/api/v1/notifications", {
|
|
64
|
-
unreadOnly: "true",
|
|
65
|
-
limit: "20",
|
|
66
|
-
}),
|
|
36
|
+
// Fetch all data in parallel — each can fail independently
|
|
37
|
+
const [orgResult, inProgressResult, backlogResult, overdueResult, blockedResult, staleResult, completedResult, actionItemsResult, notificationsResult] = await Promise.all([
|
|
38
|
+
safe(() => backend.getOrg()),
|
|
39
|
+
safe(() => backend.listTasks({ assigneeId: userId, status: "in_progress", limit: 20 })),
|
|
40
|
+
safe(() => backend.listTasks({ assigneeId: userId, status: "not_started", limit: 20 })),
|
|
41
|
+
safe(() => backend.listTasks({ assigneeId: userId, overdue: true, limit: 20 })),
|
|
42
|
+
safe(() => backend.listTasks({ assigneeId: userId, blocked: true, limit: 20 })),
|
|
43
|
+
safe(() => backend.listTasks({ assigneeId: userId, stale: true, limit: 20 })),
|
|
44
|
+
safe(() => backend.listTasks({ assigneeId: userId, status: "completed", limit: 5 })),
|
|
45
|
+
safe(() => backend.listActionItems({ assigneeId: userId, status: "pending", limit: 20 })),
|
|
46
|
+
safe(() => backend.listNotifications({ unreadOnly: true, limit: 20 })),
|
|
67
47
|
]);
|
|
68
48
|
const sections = [];
|
|
69
49
|
// Identity
|
|
70
50
|
sections.push(`## You\n**${me.name}** (${me.email}) — ${me.role ?? "member"} at **${me.orgName ?? "your org"}**\nYour user ID: ${me.userId}`);
|
|
71
51
|
// Overdue / Urgent
|
|
72
|
-
const overdue =
|
|
52
|
+
const overdue = overdueResult?.data ?? [];
|
|
73
53
|
if (overdue.length > 0) {
|
|
74
54
|
sections.push(`## Overdue Tasks (${overdue.length})\n${overdue.map(formatTask).join("\n")}`);
|
|
75
55
|
}
|
|
@@ -77,13 +57,13 @@ export function registerBriefingTools(server) {
|
|
|
77
57
|
sections.push("## Overdue Tasks\nNone — you're all caught up!");
|
|
78
58
|
}
|
|
79
59
|
// Blocked
|
|
80
|
-
const blocked =
|
|
60
|
+
const blocked = blockedResult?.data ?? [];
|
|
81
61
|
if (blocked.length > 0) {
|
|
82
62
|
sections.push(`## Blocked Tasks (${blocked.length})\n${blocked.map(formatTask).join("\n")}`);
|
|
83
63
|
}
|
|
84
64
|
// In Progress — flag stale items inline
|
|
85
|
-
const inProgress =
|
|
86
|
-
const staleIds = new Set((
|
|
65
|
+
const inProgress = inProgressResult?.data ?? [];
|
|
66
|
+
const staleIds = new Set((staleResult?.data ?? []).map((t) => t.id));
|
|
87
67
|
if (inProgress.length > 0) {
|
|
88
68
|
const formatted = inProgress.map((t) => {
|
|
89
69
|
const line = formatTask(t);
|
|
@@ -105,12 +85,12 @@ export function registerBriefingTools(server) {
|
|
|
105
85
|
sections.push("## In Progress\nNo tasks currently in progress.");
|
|
106
86
|
}
|
|
107
87
|
// Backlog
|
|
108
|
-
const backlog =
|
|
88
|
+
const backlog = backlogResult?.data ?? [];
|
|
109
89
|
if (backlog.length > 0) {
|
|
110
90
|
sections.push(`## Backlog (${backlog.length})\n${backlog.map(formatTask).join("\n")}`);
|
|
111
91
|
}
|
|
112
92
|
// Recently Completed
|
|
113
|
-
const completed =
|
|
93
|
+
const completed = completedResult?.data ?? [];
|
|
114
94
|
if (completed.length > 0) {
|
|
115
95
|
const formatted = completed.map((t) => {
|
|
116
96
|
const line = formatTask(t);
|
|
@@ -120,18 +100,18 @@ export function registerBriefingTools(server) {
|
|
|
120
100
|
sections.push(`## Recently Completed (${completed.length})\n${formatted.join("\n")}`);
|
|
121
101
|
}
|
|
122
102
|
// Action Items
|
|
123
|
-
const actionItems =
|
|
103
|
+
const actionItems = actionItemsResult?.data ?? [];
|
|
124
104
|
if (actionItems.length > 0) {
|
|
125
105
|
sections.push(`## Pending Action Items (${actionItems.length})\n${actionItems.map(formatActionItem).join("\n")}`);
|
|
126
106
|
}
|
|
127
107
|
// Notifications
|
|
128
|
-
const notifications =
|
|
108
|
+
const notifications = notificationsResult?.data ?? [];
|
|
129
109
|
if (notifications.length > 0) {
|
|
130
110
|
sections.push(`## Unread Notifications (${notifications.length})\n${notifications.map(formatNotification).join("\n")}`);
|
|
131
111
|
}
|
|
132
112
|
// Team summary
|
|
133
|
-
if (
|
|
134
|
-
const org =
|
|
113
|
+
if (orgResult) {
|
|
114
|
+
const org = orgResult;
|
|
135
115
|
const members = org.members ?? [];
|
|
136
116
|
if (members.length > 0) {
|
|
137
117
|
sections.push(`## Team (${members.length} members)\n${members.map(formatUser).join("\n")}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"briefing.js","sourceRoot":"","sources":["../../src/tools/briefing.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"briefing.js","sourceRoot":"","sources":["../../src/tools/briefing.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,4 +2,5 @@
|
|
|
2
2
|
* Collaborator Tools — list_collaborators, add_collaborator, update_collaborator_role
|
|
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 registerCollaboratorTools(server: McpServer, backend: BackendAdapter): void;
|