@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
package/dist/tools/reminders.js
CHANGED
|
@@ -2,33 +2,32 @@
|
|
|
2
2
|
* Reminder Tools — list_reminders, create_reminder, update_reminder, cancel_reminder, complete_reminder
|
|
3
3
|
*/
|
|
4
4
|
import { z } from "zod";
|
|
5
|
-
import {
|
|
5
|
+
import { BackendError } from "../backend.js";
|
|
6
6
|
import { formatReminder } from "../utils/formatting.js";
|
|
7
|
-
export function registerReminderTools(server) {
|
|
7
|
+
export function registerReminderTools(server, backend) {
|
|
8
8
|
server.tool("list_reminders", "List reminders with filtering by target user, status, or linked entity.", {
|
|
9
9
|
targetUserId: z.string().optional().describe("Filter by reminder target user ID"),
|
|
10
10
|
status: z.string().optional().describe("Filter by status: 'scheduled', 'fired', 'cancelled', 'completed'"),
|
|
11
11
|
entityType: z.string().optional().describe("Filter by entity type"),
|
|
12
12
|
entityId: z.string().optional().describe("Filter by entity ID"),
|
|
13
13
|
}, async ({ targetUserId, status, entityType, entityId }) => {
|
|
14
|
-
|
|
15
|
-
targetUserId,
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
14
|
+
try {
|
|
15
|
+
const result = await backend.listReminders({ targetUserId, status, entityType, entityId });
|
|
16
|
+
const reminders = result.data ?? [];
|
|
17
|
+
if (reminders.length === 0) {
|
|
18
|
+
return { content: [{ type: "text", text: "No reminders found." }] };
|
|
19
|
+
}
|
|
20
|
+
return {
|
|
21
|
+
content: [
|
|
22
|
+
{ type: "text", text: `# Reminders (${reminders.length})\n\n${reminders.map(formatReminder).join("\n")}` },
|
|
23
|
+
],
|
|
24
|
+
};
|
|
22
25
|
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
+
catch (err) {
|
|
27
|
+
return {
|
|
28
|
+
content: [{ type: "text", text: err instanceof BackendError ? err.message : "Unexpected error" }],
|
|
29
|
+
};
|
|
26
30
|
}
|
|
27
|
-
return {
|
|
28
|
-
content: [
|
|
29
|
-
{ type: "text", text: `# Reminders (${reminders.length})\n\n${reminders.map(formatReminder).join("\n")}` },
|
|
30
|
-
],
|
|
31
|
-
};
|
|
32
31
|
});
|
|
33
32
|
server.tool("create_reminder", "Create a reminder linked to an entity. The reminder fires at the specified time and creates a notification.", {
|
|
34
33
|
entityType: z.string().describe("Entity type: 'task', 'action_item', 'resource', or 'project'"),
|
|
@@ -38,14 +37,17 @@ export function registerReminderTools(server) {
|
|
|
38
37
|
remindAt: z.number().describe("When to fire (Unix timestamp in milliseconds)"),
|
|
39
38
|
targetUserId: z.string().optional().describe("Who to remind (defaults to current user)"),
|
|
40
39
|
}, async (params) => {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
return {
|
|
40
|
+
try {
|
|
41
|
+
const data = await backend.createReminder(params);
|
|
42
|
+
return {
|
|
43
|
+
content: [{ type: "text", text: `Reminder created (id: ${data.id}). Fires at ${new Date(params.remindAt).toISOString()}.` }],
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
return {
|
|
48
|
+
content: [{ type: "text", text: err instanceof BackendError ? err.message : "Unexpected error" }],
|
|
49
|
+
};
|
|
44
50
|
}
|
|
45
|
-
const data = res.data;
|
|
46
|
-
return {
|
|
47
|
-
content: [{ type: "text", text: `Reminder created (id: ${data.id}). Fires at ${new Date(params.remindAt).toISOString()}.` }],
|
|
48
|
-
};
|
|
49
51
|
});
|
|
50
52
|
server.tool("update_reminder", "Update a scheduled reminder's title, message, or time. If the time changes, a new reminder is created.", {
|
|
51
53
|
reminderId: z.string().describe("The reminder ID"),
|
|
@@ -53,35 +55,47 @@ export function registerReminderTools(server) {
|
|
|
53
55
|
message: z.string().optional().describe("New message"),
|
|
54
56
|
remindAt: z.number().optional().describe("New fire time (Unix ms)"),
|
|
55
57
|
}, async ({ reminderId, ...updates }) => {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
return {
|
|
58
|
+
try {
|
|
59
|
+
const data = await backend.updateReminder(reminderId, updates);
|
|
60
|
+
return {
|
|
61
|
+
content: [{ type: "text", text: `Reminder updated (id: ${data.id}).` }],
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
return {
|
|
66
|
+
content: [{ type: "text", text: err instanceof BackendError ? err.message : "Unexpected error" }],
|
|
67
|
+
};
|
|
59
68
|
}
|
|
60
|
-
return {
|
|
61
|
-
content: [{ type: "text", text: `Reminder updated (id: ${res.data.id}).` }],
|
|
62
|
-
};
|
|
63
69
|
});
|
|
64
70
|
server.tool("cancel_reminder", "Cancel a scheduled reminder so it won't fire.", {
|
|
65
71
|
reminderId: z.string().describe("The reminder ID to cancel"),
|
|
66
72
|
}, async ({ reminderId }) => {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
return {
|
|
73
|
+
try {
|
|
74
|
+
await backend.cancelReminder(reminderId);
|
|
75
|
+
return {
|
|
76
|
+
content: [{ type: "text", text: `Reminder cancelled (id: ${reminderId}).` }],
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
return {
|
|
81
|
+
content: [{ type: "text", text: err instanceof BackendError ? err.message : "Unexpected error" }],
|
|
82
|
+
};
|
|
70
83
|
}
|
|
71
|
-
return {
|
|
72
|
-
content: [{ type: "text", text: `Reminder cancelled (id: ${reminderId}).` }],
|
|
73
|
-
};
|
|
74
84
|
});
|
|
75
85
|
server.tool("complete_reminder", "Mark a reminder as completed.", {
|
|
76
86
|
reminderId: z.string().describe("The reminder ID to complete"),
|
|
77
87
|
}, async ({ reminderId }) => {
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
return {
|
|
88
|
+
try {
|
|
89
|
+
await backend.completeReminder(reminderId);
|
|
90
|
+
return {
|
|
91
|
+
content: [{ type: "text", text: `Reminder completed (id: ${reminderId}).` }],
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
return {
|
|
96
|
+
content: [{ type: "text", text: err instanceof BackendError ? err.message : "Unexpected error" }],
|
|
97
|
+
};
|
|
81
98
|
}
|
|
82
|
-
return {
|
|
83
|
-
content: [{ type: "text", text: `Reminder completed (id: ${reminderId}).` }],
|
|
84
|
-
};
|
|
85
99
|
});
|
|
86
100
|
}
|
|
87
101
|
//# sourceMappingURL=reminders.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reminders.js","sourceRoot":"","sources":["../../src/tools/reminders.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"reminders.js","sourceRoot":"","sources":["../../src/tools/reminders.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,MAAM,UAAU,qBAAqB,CAAC,MAAiB,EAAE,OAAuB;IAC9E,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,yEAAyE,EACzE;QACE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;QACjF,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kEAAkE,CAAC;QAC1G,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QACnE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;KAChE,EACD,KAAK,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,EAAE;QACvD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC3F,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACpC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC,EAAE,CAAC;YAC/E,CAAC;YAED,OAAO;gBACL,OAAO,EAAE;oBACP,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,gBAAgB,SAAS,CAAC,MAAM,QAAQ,SAAS,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE;iBACpH;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;IAEF,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,6GAA6G,EAC7G;QACE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8DAA8D,CAAC;QAC/F,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;QAC9C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QAC5C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;QACvE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+CAA+C,CAAC;QAC9E,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC;KACzF,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,MAAiC,CAAC,CAAC;YAC7E,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,yBAAyB,IAAI,CAAC,EAAE,eAAe,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC;aACtI,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;IAEF,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,wGAAwG,EACxG;QACE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QAClD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;QAClD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;QACtD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;KACpE,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,GAAG,OAAO,EAAE,EAAE,EAAE;QACnC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAC/D,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,yBAAyB,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC;aACjF,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;IAEF,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,+CAA+C,EAC/C;QACE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;KAC7D,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE;QACvB,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;YACzC,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,2BAA2B,UAAU,IAAI,EAAE,CAAC;aACtF,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;IAEF,MAAM,CAAC,IAAI,CACT,mBAAmB,EACnB,+BAA+B,EAC/B;QACE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;KAC/D,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE;QACvB,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;YAC3C,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,2BAA2B,UAAU,IAAI,EAAE,CAAC;aACtF,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"}
|
|
@@ -4,4 +4,5 @@
|
|
|
4
4
|
* complete_upload, update_resource_content
|
|
5
5
|
*/
|
|
6
6
|
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
7
|
-
|
|
7
|
+
import type { BackendAdapter } from "../backend.js";
|
|
8
|
+
export declare function registerResourceTools(server: McpServer, backend: BackendAdapter): void;
|
package/dist/tools/resources.js
CHANGED
|
@@ -4,47 +4,53 @@
|
|
|
4
4
|
* complete_upload, update_resource_content
|
|
5
5
|
*/
|
|
6
6
|
import { z } from "zod";
|
|
7
|
-
import {
|
|
7
|
+
import { BackendError } from "../backend.js";
|
|
8
8
|
import { formatResource, formatResourceDetail, formatConfirmation } from "../utils/formatting.js";
|
|
9
|
-
export function registerResourceTools(server) {
|
|
9
|
+
export function registerResourceTools(server, backend) {
|
|
10
10
|
server.tool("list_resources", "List resources (documents, links, files) with filtering. Filter by project, task, or type. Resources include links, collaborative documents, files, and more.", {
|
|
11
11
|
projectId: z.string().optional().describe("Filter by project ID"),
|
|
12
12
|
taskId: z.string().optional().describe("Filter by task ID"),
|
|
13
13
|
type: z.string().optional().describe("Filter by type (link, collab_document, file, image, video)"),
|
|
14
14
|
limit: z.number().optional().describe("Max results (default 50, max 100)"),
|
|
15
15
|
}, async (params) => {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
return {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
16
|
+
try {
|
|
17
|
+
const result = await backend.listResources({
|
|
18
|
+
projectId: params.projectId,
|
|
19
|
+
taskId: params.taskId,
|
|
20
|
+
type: params.type,
|
|
21
|
+
limit: params.limit,
|
|
22
|
+
});
|
|
23
|
+
const resources = result.data ?? [];
|
|
24
|
+
if (resources.length === 0) {
|
|
25
|
+
return { content: [{ type: "text", text: "No resources found matching your filters." }] };
|
|
26
|
+
}
|
|
27
|
+
return {
|
|
28
|
+
content: [
|
|
29
|
+
{ type: "text", text: `# Resources (${resources.length})\n\n${resources.map(formatResource).join("\n")}` },
|
|
30
|
+
],
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
return {
|
|
35
|
+
content: [{ type: "text", text: err instanceof BackendError ? err.message : "Unexpected error" }],
|
|
36
|
+
};
|
|
37
|
+
}
|
|
34
38
|
});
|
|
35
39
|
server.tool("get_resource", "Get full detail on a single resource including metadata and comments. Use this after finding a resource via list_resources or get_task with includeResources.", {
|
|
36
40
|
resourceId: z.string().describe("The resource ID"),
|
|
37
41
|
includeComments: z.boolean().optional().describe("Include comments on this resource"),
|
|
38
42
|
}, async ({ resourceId, includeComments }) => {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
43
|
+
try {
|
|
44
|
+
const data = await backend.getResource(resourceId, { includeComments });
|
|
45
|
+
return {
|
|
46
|
+
content: [{ type: "text", text: formatResourceDetail(data) }],
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
return {
|
|
51
|
+
content: [{ type: "text", text: err instanceof BackendError ? err.message : "Unexpected error" }],
|
|
52
|
+
};
|
|
53
|
+
}
|
|
48
54
|
});
|
|
49
55
|
server.tool("create_resource", "Create a new resource (link or document). For links, provide a URL. For collaborative documents, a new document will be created automatically.", {
|
|
50
56
|
name: z.string().describe("Resource name"),
|
|
@@ -56,23 +62,27 @@ export function registerResourceTools(server) {
|
|
|
56
62
|
description: z.string().optional().describe("Resource description"),
|
|
57
63
|
tags: z.array(z.string()).optional().describe("Tags for categorization"),
|
|
58
64
|
}, async (params) => {
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
return {
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
65
|
+
try {
|
|
66
|
+
const format = params.type === "collab_document" ? (params.format || "markdown") : params.format;
|
|
67
|
+
const data = await backend.createResource({
|
|
68
|
+
name: params.name,
|
|
69
|
+
type: params.type,
|
|
70
|
+
url: params.url,
|
|
71
|
+
projectId: params.projectId,
|
|
72
|
+
taskId: params.taskId,
|
|
73
|
+
format,
|
|
74
|
+
description: params.description,
|
|
75
|
+
tags: params.tags,
|
|
76
|
+
});
|
|
77
|
+
return {
|
|
78
|
+
content: [{ type: "text", text: formatConfirmation("Resource created", data) }],
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
return {
|
|
83
|
+
content: [{ type: "text", text: err instanceof BackendError ? err.message : "Unexpected error" }],
|
|
84
|
+
};
|
|
85
|
+
}
|
|
76
86
|
});
|
|
77
87
|
server.tool("update_resource", "Update a resource's name, URL, description, or tags. Use get_resource first to confirm the current state.", {
|
|
78
88
|
resourceId: z.string().describe("The resource ID to update"),
|
|
@@ -81,43 +91,54 @@ export function registerResourceTools(server) {
|
|
|
81
91
|
description: z.string().optional().describe("New description"),
|
|
82
92
|
tags: z.array(z.string()).optional().describe("New tags (replaces existing)"),
|
|
83
93
|
}, async ({ resourceId, ...updates }) => {
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
return {
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
94
|
+
try {
|
|
95
|
+
const body = {};
|
|
96
|
+
for (const [key, value] of Object.entries(updates)) {
|
|
97
|
+
if (value !== undefined)
|
|
98
|
+
body[key] = value;
|
|
99
|
+
}
|
|
100
|
+
const data = await backend.updateResource(resourceId, body);
|
|
101
|
+
return {
|
|
102
|
+
content: [{ type: "text", text: formatConfirmation("Resource updated", data) }],
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
catch (err) {
|
|
106
|
+
return {
|
|
107
|
+
content: [{ type: "text", text: err instanceof BackendError ? err.message : "Unexpected error" }],
|
|
108
|
+
};
|
|
109
|
+
}
|
|
96
110
|
});
|
|
97
111
|
server.tool("delete_resource", "Archive a resource. Use get_resource first to confirm you have the right resource.", {
|
|
98
112
|
resourceId: z.string().describe("The resource ID to archive"),
|
|
99
113
|
}, async ({ resourceId }) => {
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
return {
|
|
114
|
+
try {
|
|
115
|
+
await backend.deleteResource(resourceId);
|
|
116
|
+
return {
|
|
117
|
+
content: [{ type: "text", text: `Resource archived (id: ${resourceId}).` }],
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
catch (err) {
|
|
121
|
+
return {
|
|
122
|
+
content: [{ type: "text", text: err instanceof BackendError ? err.message : "Unexpected error" }],
|
|
123
|
+
};
|
|
103
124
|
}
|
|
104
|
-
return {
|
|
105
|
-
content: [{ type: "text", text: `Resource archived (id: ${resourceId}).` }],
|
|
106
|
-
};
|
|
107
125
|
});
|
|
108
126
|
server.tool("get_resource_content", "Read the text content of a collaborative document. Only works for collab_document type resources. Returns the document's plain text content (truncated to ~10,000 characters).", {
|
|
109
127
|
resourceId: z.string().describe("The resource ID of a collab_document"),
|
|
110
128
|
}, async ({ resourceId }) => {
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
129
|
+
try {
|
|
130
|
+
const data = await backend.getResourceContent(resourceId);
|
|
131
|
+
const header = `# Document: ${data.documentName}\n- **Format:** ${data.format}\n- **Content Length:** ${data.contentLength} characters\n\n`;
|
|
132
|
+
const content = data.content || "(empty document)";
|
|
133
|
+
return {
|
|
134
|
+
content: [{ type: "text", text: header + content }],
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
catch (err) {
|
|
138
|
+
return {
|
|
139
|
+
content: [{ type: "text", text: err instanceof BackendError ? err.message : "Unexpected error" }],
|
|
140
|
+
};
|
|
141
|
+
}
|
|
121
142
|
});
|
|
122
143
|
server.tool("get_upload_url", "Get a presigned URL for uploading a file. The URL expires in 1 hour. Max file size: 100MB. After uploading the file to the URL, call complete_upload to register it.", {
|
|
123
144
|
filename: z.string().describe("The filename (e.g. 'report.pdf')"),
|
|
@@ -126,17 +147,20 @@ export function registerResourceTools(server) {
|
|
|
126
147
|
projectId: z.string().optional().describe("Project ID to associate with"),
|
|
127
148
|
taskId: z.string().optional().describe("Task ID to associate with"),
|
|
128
149
|
}, async (params) => {
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
return {
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
150
|
+
try {
|
|
151
|
+
const data = await backend.getUploadUrl(params);
|
|
152
|
+
return {
|
|
153
|
+
content: [{
|
|
154
|
+
type: "text",
|
|
155
|
+
text: `Upload URL generated.\n- **Upload URL:** ${data.uploadUrl}\n- **R2 Key:** ${data.key}\n- **Public URL:** ${data.publicUrl}\n- **Content Type:** ${data.contentType}\n- **Resource Type:** ${data.resourceType}\n\nPUT the file to the upload URL, then call complete_upload with the key and public URL.`,
|
|
156
|
+
}],
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
catch (err) {
|
|
160
|
+
return {
|
|
161
|
+
content: [{ type: "text", text: err instanceof BackendError ? err.message : "Unexpected error" }],
|
|
162
|
+
};
|
|
163
|
+
}
|
|
140
164
|
});
|
|
141
165
|
server.tool("complete_upload", "Register a file that was uploaded via get_upload_url. Creates a resource record for the file.", {
|
|
142
166
|
name: z.string().describe("Display name for the resource"),
|
|
@@ -151,26 +175,34 @@ export function registerResourceTools(server) {
|
|
|
151
175
|
width: z.number().optional().describe("Image/video width in pixels"),
|
|
152
176
|
height: z.number().optional().describe("Image/video height in pixels"),
|
|
153
177
|
}, async (params) => {
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
return {
|
|
178
|
+
try {
|
|
179
|
+
const data = await backend.completeUpload(params);
|
|
180
|
+
return {
|
|
181
|
+
content: [{ type: "text", text: formatConfirmation("File resource created", data) }],
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
catch (err) {
|
|
185
|
+
return {
|
|
186
|
+
content: [{ type: "text", text: err instanceof BackendError ? err.message : "Unexpected error" }],
|
|
187
|
+
};
|
|
157
188
|
}
|
|
158
|
-
return {
|
|
159
|
-
content: [{ type: "text", text: formatConfirmation("File resource created", res.data) }],
|
|
160
|
-
};
|
|
161
189
|
});
|
|
162
190
|
server.tool("update_resource_content", "Write or replace the text content of a collaborative document. Only works for plaintext or markdown format documents, not richtext.", {
|
|
163
191
|
resourceId: z.string().describe("The resource ID of a collab_document"),
|
|
164
192
|
content: z.string().describe("The new document content"),
|
|
165
193
|
format: z.string().optional().describe("Content format: 'plaintext' or 'markdown' (default 'plaintext')"),
|
|
166
194
|
}, async ({ resourceId, content, format }) => {
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
return {
|
|
195
|
+
try {
|
|
196
|
+
await backend.updateResourceContent(resourceId, { content, format });
|
|
197
|
+
return {
|
|
198
|
+
content: [{ type: "text", text: `Document content updated (resource: ${resourceId}).` }],
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
catch (err) {
|
|
202
|
+
return {
|
|
203
|
+
content: [{ type: "text", text: err instanceof BackendError ? err.message : "Unexpected error" }],
|
|
204
|
+
};
|
|
170
205
|
}
|
|
171
|
-
return {
|
|
172
|
-
content: [{ type: "text", text: `Document content updated (resource: ${resourceId}).` }],
|
|
173
|
-
};
|
|
174
206
|
});
|
|
175
207
|
}
|
|
176
208
|
//# sourceMappingURL=resources.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resources.js","sourceRoot":"","sources":["../../src/tools/resources.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"resources.js","sourceRoot":"","sources":["../../src/tools/resources.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/search.d.ts
CHANGED
|
@@ -2,4 +2,5 @@
|
|
|
2
2
|
* Search Tool — search
|
|
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 registerSearchTools(server: McpServer, backend: BackendAdapter): void;
|
package/dist/tools/search.js
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* Search Tool — search
|
|
3
3
|
*/
|
|
4
4
|
import { z } from "zod";
|
|
5
|
-
import {
|
|
6
|
-
export function registerSearchTools(server) {
|
|
5
|
+
import { BackendError } from "../backend.js";
|
|
6
|
+
export function registerSearchTools(server, backend) {
|
|
7
7
|
server.tool("search", "Full-text search across tasks, projects, and comments. Use this when you know part of a name or keyword but not the ID. Returns matching entities with their types and IDs. For browsing by filters, use list_tasks or list_projects instead.", {
|
|
8
8
|
query: z.string().describe("Search query text"),
|
|
9
9
|
entityTypes: z
|
|
@@ -12,37 +12,41 @@ export function registerSearchTools(server) {
|
|
|
12
12
|
.describe("Comma-separated entity types to search (e.g. 'task,project'). Defaults to all."),
|
|
13
13
|
limit: z.number().optional().describe("Max results to return"),
|
|
14
14
|
}, async (params) => {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
15
|
+
try {
|
|
16
|
+
const result = await backend.search({
|
|
17
|
+
q: params.query,
|
|
18
|
+
entityTypes: params.entityTypes,
|
|
19
|
+
limit: params.limit,
|
|
20
|
+
});
|
|
21
|
+
const results = result.data ?? [];
|
|
22
|
+
if (results.length === 0) {
|
|
23
|
+
return {
|
|
24
|
+
content: [{ type: "text", text: `No results found for "${params.query}".` }],
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
const formatted = results
|
|
28
|
+
.map((r) => {
|
|
29
|
+
const parts = [`- [${r.type}] **${r.name}**`];
|
|
30
|
+
if (r.projectName)
|
|
31
|
+
parts.push(`in "${r.projectName}"`);
|
|
32
|
+
parts.push(`(id: ${r.id})`);
|
|
33
|
+
return parts.join(" ");
|
|
34
|
+
})
|
|
35
|
+
.join("\n");
|
|
36
|
+
return {
|
|
37
|
+
content: [
|
|
38
|
+
{
|
|
39
|
+
type: "text",
|
|
40
|
+
text: `# Search Results for "${params.query}" (${results.length})\n\n${formatted}`,
|
|
41
|
+
},
|
|
42
|
+
],
|
|
43
|
+
};
|
|
22
44
|
}
|
|
23
|
-
|
|
24
|
-
if (results.length === 0) {
|
|
45
|
+
catch (err) {
|
|
25
46
|
return {
|
|
26
|
-
content: [{ type: "text", text:
|
|
47
|
+
content: [{ type: "text", text: err instanceof BackendError ? err.message : "Unexpected error" }],
|
|
27
48
|
};
|
|
28
49
|
}
|
|
29
|
-
const formatted = results
|
|
30
|
-
.map((r) => {
|
|
31
|
-
const parts = [`- [${r.type}] **${r.name}**`];
|
|
32
|
-
if (r.projectName)
|
|
33
|
-
parts.push(`in "${r.projectName}"`);
|
|
34
|
-
parts.push(`(id: ${r.id})`);
|
|
35
|
-
return parts.join(" ");
|
|
36
|
-
})
|
|
37
|
-
.join("\n");
|
|
38
|
-
return {
|
|
39
|
-
content: [
|
|
40
|
-
{
|
|
41
|
-
type: "text",
|
|
42
|
-
text: `# Search Results for "${params.query}" (${results.length})\n\n${formatted}`,
|
|
43
|
-
},
|
|
44
|
-
],
|
|
45
|
-
};
|
|
46
50
|
});
|
|
47
51
|
}
|
|
48
52
|
//# sourceMappingURL=search.js.map
|
package/dist/tools/search.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,UAAU,mBAAmB,CAAC,MAAiB,EAAE,OAAuB;IAC5E,MAAM,CAAC,IAAI,CACT,QAAQ,EACR,+OAA+O,EAC/O;QACE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QAC/C,WAAW,EAAE,CAAC;aACX,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,gFAAgF,CAAC;QAC7F,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;KAC/D,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC;gBAClC,CAAC,EAAE,MAAM,CAAC,KAAK;gBACf,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,KAAK,EAAE,MAAM,CAAC,KAAK;aACpB,CAAC,CAAC;YAEH,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YAClC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzB,OAAO;oBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,yBAAyB,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;iBACtF,CAAC;YACJ,CAAC;YAED,MAAM,SAAS,GAAG,OAAO;iBACtB,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE;gBACd,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;gBAC9C,IAAI,CAAC,CAAC,WAAW;oBAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC;gBACvD,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;gBAC5B,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACzB,CAAC,CAAC;iBACD,IAAI,CAAC,IAAI,CAAC,CAAC;YAEd,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,yBAAyB,MAAM,CAAC,KAAK,MAAM,OAAO,CAAC,MAAM,QAAQ,SAAS,EAAE;qBACnF;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"}
|