botnote 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +277 -0
- package/dist/bin.d.ts +2 -0
- package/dist/bin.js +320 -0
- package/dist/bin.js.map +1 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +61 -0
- package/dist/cli.js.map +1 -0
- package/dist/db/client.d.ts +10 -0
- package/dist/db/client.js +16 -0
- package/dist/db/client.js.map +1 -0
- package/dist/db/migrate.d.ts +1 -0
- package/dist/db/migrate.js +57 -0
- package/dist/db/migrate.js.map +1 -0
- package/dist/db/migrations/0001_init.sql +89 -0
- package/dist/db/migrations/0002_tasks_due_at.sql +16 -0
- package/dist/db/migrations/0003_task_priority_and_sequence.sql +45 -0
- package/dist/db/migrations/0004_pinned.sql +8 -0
- package/dist/db/migrations/0005_nullable_title_and_parent.sql +5 -0
- package/dist/db/migrations/0006_project_color_icon.sql +3 -0
- package/dist/db/migrations/0007_tokens.sql +14 -0
- package/dist/db/migrations/0008_simplify_kinds_drop_actors.sql +21 -0
- package/dist/db/migrations/0009_sessions.sql +14 -0
- package/dist/db/migrations/0010_completed_at.sql +17 -0
- package/dist/db/migrations/0011_completed_at_backfill_fix.sql +14 -0
- package/dist/db/migrations/0012_completed_at_backfill_due.sql +16 -0
- package/dist/db/migrations/0013_due_at_noon_utc.sql +13 -0
- package/dist/db/schema.d.ts +811 -0
- package/dist/db/schema.js +112 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/mcp/http-client.d.ts +154 -0
- package/dist/mcp/http-client.js +113 -0
- package/dist/mcp/http-client.js.map +1 -0
- package/dist/mcp/server.d.ts +7 -0
- package/dist/mcp/server.js +492 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/rest/routes.d.ts +3 -0
- package/dist/rest/routes.js +320 -0
- package/dist/rest/routes.js.map +1 -0
- package/dist/rest/server.d.ts +12 -0
- package/dist/rest/server.js +282 -0
- package/dist/rest/server.js.map +1 -0
- package/dist/service/embedding.d.ts +25 -0
- package/dist/service/embedding.js +112 -0
- package/dist/service/embedding.js.map +1 -0
- package/dist/service/entities.d.ts +22 -0
- package/dist/service/entities.js +174 -0
- package/dist/service/entities.js.map +1 -0
- package/dist/service/index.d.ts +8 -0
- package/dist/service/index.js +8 -0
- package/dist/service/index.js.map +1 -0
- package/dist/service/opening_brief.d.ts +14 -0
- package/dist/service/opening_brief.js +104 -0
- package/dist/service/opening_brief.js.map +1 -0
- package/dist/service/projects.d.ts +8 -0
- package/dist/service/projects.js +36 -0
- package/dist/service/projects.js.map +1 -0
- package/dist/service/search.d.ts +15 -0
- package/dist/service/search.js +101 -0
- package/dist/service/search.js.map +1 -0
- package/dist/service/sessions.d.ts +25 -0
- package/dist/service/sessions.js +89 -0
- package/dist/service/sessions.js.map +1 -0
- package/dist/service/tasks.d.ts +23 -0
- package/dist/service/tasks.js +130 -0
- package/dist/service/tasks.js.map +1 -0
- package/dist/service/tokens.d.ts +18 -0
- package/dist/service/tokens.js +41 -0
- package/dist/service/tokens.js.map +1 -0
- package/dist/service/types.d.ts +294 -0
- package/dist/service/types.js +132 -0
- package/dist/service/types.js.map +1 -0
- package/dist/version.d.ts +1 -0
- package/dist/version.js +13 -0
- package/dist/version.js.map +1 -0
- package/package.json +73 -0
- package/web/dist/assets/index-Bddg7h_x.css +1 -0
- package/web/dist/assets/index-DYW6stVx.js +542 -0
- package/web/dist/favicon.svg +13 -0
- package/web/dist/index.html +17 -0
|
@@ -0,0 +1,492 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { VERSION } from "../version.js";
|
|
4
|
+
// Inline kind constants so the MCP package can be packaged without pulling
|
|
5
|
+
// drizzle / the db schema module at runtime.
|
|
6
|
+
const ENTITY_KINDS = ["task", "note"];
|
|
7
|
+
const ACTOR_KINDS = ["human", "agent", "system"];
|
|
8
|
+
const TASK_STATUSES = [
|
|
9
|
+
"open",
|
|
10
|
+
"in_progress",
|
|
11
|
+
"delayed",
|
|
12
|
+
"done",
|
|
13
|
+
"archived",
|
|
14
|
+
"rejected"
|
|
15
|
+
];
|
|
16
|
+
const PRIORITIES = ["urgent", "high", "medium", "low", "none"];
|
|
17
|
+
const EDGE_KINDS = ["blocks", "references", "parent_of"];
|
|
18
|
+
function displayTitle(e) {
|
|
19
|
+
if (e.title && e.title.trim())
|
|
20
|
+
return e.title;
|
|
21
|
+
const firstLine = e.body.split("\n").find((l) => l.trim())?.trim() ?? "";
|
|
22
|
+
if (firstLine)
|
|
23
|
+
return firstLine.length > 60 ? `${firstLine.slice(0, 60)}…` : firstLine;
|
|
24
|
+
return "(untitled)";
|
|
25
|
+
}
|
|
26
|
+
function summarizeEntity(e) {
|
|
27
|
+
const tagPart = e.tags.length ? ` [${e.tags.join(", ")}]` : "";
|
|
28
|
+
return `${e.kind}/${e.id.slice(0, 8)} · ${displayTitle(e)}${tagPart}`;
|
|
29
|
+
}
|
|
30
|
+
const ProjectKey = z
|
|
31
|
+
.string()
|
|
32
|
+
.min(1)
|
|
33
|
+
.max(20)
|
|
34
|
+
.regex(/^[A-Z][A-Z0-9_]*$/);
|
|
35
|
+
const HexColor = z.string().regex(/^#[0-9a-fA-F]{6}$/);
|
|
36
|
+
const IconName = z.string().min(1).max(40).regex(/^[a-z0-9_-]+$/);
|
|
37
|
+
export function buildMcpServer(ctx) {
|
|
38
|
+
const server = new McpServer({
|
|
39
|
+
name: "botnote",
|
|
40
|
+
version: ctx.version ?? VERSION
|
|
41
|
+
});
|
|
42
|
+
const c = ctx.client;
|
|
43
|
+
// ----- 1. opening_brief -----
|
|
44
|
+
server.registerTool("opening_brief", {
|
|
45
|
+
title: "Opening Brief",
|
|
46
|
+
description: "CALL THIS FIRST when starting work on a project. Fetch the agent context bundle: AGENTS.md + PINNED NOTES (full text, user-curated must-read context like deployment steps, important conventions) + open tasks + recent activity. Returns markdown.",
|
|
47
|
+
annotations: {
|
|
48
|
+
readOnlyHint: true,
|
|
49
|
+
destructiveHint: false,
|
|
50
|
+
idempotentHint: true,
|
|
51
|
+
openWorldHint: false
|
|
52
|
+
},
|
|
53
|
+
inputSchema: {
|
|
54
|
+
projectId: z
|
|
55
|
+
.string()
|
|
56
|
+
.uuid()
|
|
57
|
+
.optional()
|
|
58
|
+
.describe("Optional project UUID; omit for workspace-wide brief.")
|
|
59
|
+
}
|
|
60
|
+
}, async ({ projectId }) => {
|
|
61
|
+
const brief = await c.openingBrief({ projectId: projectId ?? null, recentLimit: 10 });
|
|
62
|
+
return { content: [{ type: "text", text: brief.markdown }] };
|
|
63
|
+
});
|
|
64
|
+
// ----- 2. search -----
|
|
65
|
+
server.registerTool("search", {
|
|
66
|
+
title: "Hybrid Search",
|
|
67
|
+
description: "Find tasks and notes by free-text query. Uses BM25 + vector cosine + time decay merged via RRF. Pass kind='note' or kind='task' to narrow; omit to search both.",
|
|
68
|
+
annotations: {
|
|
69
|
+
readOnlyHint: true,
|
|
70
|
+
destructiveHint: false,
|
|
71
|
+
idempotentHint: true,
|
|
72
|
+
openWorldHint: false
|
|
73
|
+
},
|
|
74
|
+
inputSchema: {
|
|
75
|
+
query: z.string().min(1),
|
|
76
|
+
projectId: z.string().uuid().optional(),
|
|
77
|
+
kind: z.enum(ENTITY_KINDS).optional(),
|
|
78
|
+
limit: z.number().int().min(1).max(50).default(10)
|
|
79
|
+
}
|
|
80
|
+
}, async ({ query, projectId, kind, limit }) => {
|
|
81
|
+
const { hits, embeddingUsed } = await c.search({
|
|
82
|
+
query,
|
|
83
|
+
projectId: projectId ?? null,
|
|
84
|
+
kind,
|
|
85
|
+
limit
|
|
86
|
+
});
|
|
87
|
+
const lines = hits.map((h) => `${h.score.toFixed(4)} ${summarizeEntity(h.entity)}\n ${h.entity.body.slice(0, 200).replace(/\n/g, " ")}`);
|
|
88
|
+
return {
|
|
89
|
+
content: [
|
|
90
|
+
{
|
|
91
|
+
type: "text",
|
|
92
|
+
text: hits.length
|
|
93
|
+
? `${hits.length} hit(s). embedding=${embeddingUsed ? "on" : "off"}\n\n${lines.join("\n\n")}`
|
|
94
|
+
: `no hits. embedding=${embeddingUsed ? "on" : "off"}`
|
|
95
|
+
}
|
|
96
|
+
]
|
|
97
|
+
};
|
|
98
|
+
});
|
|
99
|
+
// ----- 3. recent -----
|
|
100
|
+
server.registerTool("recent", {
|
|
101
|
+
title: "Recent Entities",
|
|
102
|
+
description: "List entities ordered by most recent. Filter by project, kinds, and since (ISO date).",
|
|
103
|
+
annotations: {
|
|
104
|
+
readOnlyHint: true,
|
|
105
|
+
destructiveHint: false,
|
|
106
|
+
idempotentHint: true,
|
|
107
|
+
openWorldHint: false
|
|
108
|
+
},
|
|
109
|
+
inputSchema: {
|
|
110
|
+
projectId: z.string().uuid().optional(),
|
|
111
|
+
since: z.string().datetime().optional(),
|
|
112
|
+
kinds: z.array(z.enum(ENTITY_KINDS)).optional(),
|
|
113
|
+
limit: z.number().int().min(1).max(50).default(20)
|
|
114
|
+
}
|
|
115
|
+
}, async ({ projectId, since, kinds, limit }) => {
|
|
116
|
+
const rows = await c.recent({
|
|
117
|
+
projectId: projectId ?? null,
|
|
118
|
+
since: since ?? null,
|
|
119
|
+
kinds,
|
|
120
|
+
limit
|
|
121
|
+
});
|
|
122
|
+
return {
|
|
123
|
+
content: [
|
|
124
|
+
{
|
|
125
|
+
type: "text",
|
|
126
|
+
text: rows.length
|
|
127
|
+
? rows
|
|
128
|
+
.map((r) => `${r.createdAt.slice(0, 16).replace("T", " ")} · ${summarizeEntity(r)}`)
|
|
129
|
+
.join("\n")
|
|
130
|
+
: "no recent entities"
|
|
131
|
+
}
|
|
132
|
+
]
|
|
133
|
+
};
|
|
134
|
+
});
|
|
135
|
+
// ----- 4. list_projects -----
|
|
136
|
+
server.registerTool("list_projects", {
|
|
137
|
+
title: "List Projects",
|
|
138
|
+
description: "List every project in the workspace with its key, name, color and icon. Call this FIRST before creating tasks/notes if you don't already know the target project's UUID. Use `OTHE` (Others) as the fallback bucket for one-off / 杂项 work that doesn't deserve its own project.",
|
|
139
|
+
annotations: {
|
|
140
|
+
readOnlyHint: true,
|
|
141
|
+
destructiveHint: false,
|
|
142
|
+
idempotentHint: true,
|
|
143
|
+
openWorldHint: false
|
|
144
|
+
},
|
|
145
|
+
inputSchema: {}
|
|
146
|
+
}, async () => {
|
|
147
|
+
const projects = await c.listProjects();
|
|
148
|
+
const lines = projects.map((p) => `${p.key.padEnd(10)} ${p.name} (id: ${p.id}, icon: ${p.icon}, color: ${p.color})`);
|
|
149
|
+
return {
|
|
150
|
+
content: [{ type: "text", text: projects.length ? lines.join("\n") : "no projects" }]
|
|
151
|
+
};
|
|
152
|
+
});
|
|
153
|
+
// ----- 5. get_project -----
|
|
154
|
+
server.registerTool("get_project", {
|
|
155
|
+
title: "Get Project",
|
|
156
|
+
description: "Fetch a single project, including its AGENTS.md. Accepts either the UUID or the human-readable key (e.g. 'BOT').",
|
|
157
|
+
annotations: {
|
|
158
|
+
readOnlyHint: true,
|
|
159
|
+
destructiveHint: false,
|
|
160
|
+
idempotentHint: true,
|
|
161
|
+
openWorldHint: false
|
|
162
|
+
},
|
|
163
|
+
inputSchema: {
|
|
164
|
+
projectId: z.string().uuid().optional(),
|
|
165
|
+
key: ProjectKey.optional()
|
|
166
|
+
}
|
|
167
|
+
}, async ({ projectId, key }) => {
|
|
168
|
+
if (!projectId && !key) {
|
|
169
|
+
return { isError: true, content: [{ type: "text", text: "pass projectId or key" }] };
|
|
170
|
+
}
|
|
171
|
+
try {
|
|
172
|
+
const p = projectId
|
|
173
|
+
? await c.getProject(projectId)
|
|
174
|
+
: await c.getProjectByKey(key);
|
|
175
|
+
return { content: [{ type: "text", text: JSON.stringify(p, null, 2) }] };
|
|
176
|
+
}
|
|
177
|
+
catch (err) {
|
|
178
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
179
|
+
return { isError: true, content: [{ type: "text", text: `project not found: ${msg}` }] };
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
// ----- 6. create_project -----
|
|
183
|
+
server.registerTool("create_project", {
|
|
184
|
+
title: "Create Project",
|
|
185
|
+
description: "Create a new project. Boss already has 13 projects (call `list_projects` first to verify the project doesn't exist or fit an existing bucket — typically `OTHE` is the right home for one-off / 杂项 work). Only create a new project when the work is large enough to deserve its own backlog.\n" +
|
|
186
|
+
"\n" +
|
|
187
|
+
"Conventions:\n" +
|
|
188
|
+
"- `key`: short uppercase (3-4 chars), e.g. 'BOT', 'NOED', 'OTHE'. Unique across the workspace.\n" +
|
|
189
|
+
"- `name`: human-readable.\n" +
|
|
190
|
+
"- `color`: hex like '#5e6ad2' (Linear blue) by default. Pick a color that contrasts with the existing palette.\n" +
|
|
191
|
+
"- `icon`: lowercase kebab name from lucide-react (e.g. 'rocket', 'brain', 'package', 'archive').\n" +
|
|
192
|
+
"- `agentsMd`: write project-level conventions agents should follow (test commands, deploy steps, important gotchas). Surfaced in opening_brief.",
|
|
193
|
+
annotations: {
|
|
194
|
+
readOnlyHint: false,
|
|
195
|
+
destructiveHint: false,
|
|
196
|
+
idempotentHint: false,
|
|
197
|
+
openWorldHint: false
|
|
198
|
+
},
|
|
199
|
+
inputSchema: {
|
|
200
|
+
key: ProjectKey,
|
|
201
|
+
name: z.string().min(1).max(200),
|
|
202
|
+
color: HexColor.default("#5e6ad2"),
|
|
203
|
+
icon: IconName.default("circle"),
|
|
204
|
+
agentsMd: z.string().default("")
|
|
205
|
+
}
|
|
206
|
+
}, async ({ key, name, color, icon, agentsMd }) => {
|
|
207
|
+
try {
|
|
208
|
+
const existing = await c.getProjectByKey(key);
|
|
209
|
+
return {
|
|
210
|
+
content: [{ type: "text", text: `project ${key} already exists: ${existing.id}` }]
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
catch {
|
|
214
|
+
// Not found → continue to create.
|
|
215
|
+
}
|
|
216
|
+
const p = await c.createProject({ key, name, color, icon, agentsMd });
|
|
217
|
+
return { content: [{ type: "text", text: `created project ${p.key} · ${p.name}\nid: ${p.id}` }] };
|
|
218
|
+
});
|
|
219
|
+
// ----- 7. update_project -----
|
|
220
|
+
server.registerTool("update_project", {
|
|
221
|
+
title: "Update Project",
|
|
222
|
+
description: "Update a project's name, color, icon, or AGENTS.md. Pass only the fields you want to change.",
|
|
223
|
+
annotations: {
|
|
224
|
+
readOnlyHint: false,
|
|
225
|
+
destructiveHint: true,
|
|
226
|
+
idempotentHint: true,
|
|
227
|
+
openWorldHint: false
|
|
228
|
+
},
|
|
229
|
+
inputSchema: {
|
|
230
|
+
projectId: z.string().uuid(),
|
|
231
|
+
name: z.string().min(1).max(200).optional(),
|
|
232
|
+
color: HexColor.optional(),
|
|
233
|
+
icon: IconName.optional(),
|
|
234
|
+
agentsMd: z.string().optional()
|
|
235
|
+
}
|
|
236
|
+
}, async ({ projectId, ...fields }) => {
|
|
237
|
+
const defined = Object.fromEntries(Object.entries(fields).filter(([, v]) => v !== undefined));
|
|
238
|
+
const p = await c.updateProject(projectId, defined);
|
|
239
|
+
return { content: [{ type: "text", text: `updated project ${p.key} · ${p.name}` }] };
|
|
240
|
+
});
|
|
241
|
+
// ----- 8. get_entity -----
|
|
242
|
+
server.registerTool("get_entity", {
|
|
243
|
+
title: "Get Entity",
|
|
244
|
+
description: "Fetch a single task or note by its UUID.",
|
|
245
|
+
annotations: {
|
|
246
|
+
readOnlyHint: true,
|
|
247
|
+
destructiveHint: false,
|
|
248
|
+
idempotentHint: true,
|
|
249
|
+
openWorldHint: false
|
|
250
|
+
},
|
|
251
|
+
inputSchema: { id: z.string().uuid() }
|
|
252
|
+
}, async ({ id }) => {
|
|
253
|
+
try {
|
|
254
|
+
const entity = await c.getEntity(id);
|
|
255
|
+
return { content: [{ type: "text", text: JSON.stringify(entity, null, 2) }] };
|
|
256
|
+
}
|
|
257
|
+
catch {
|
|
258
|
+
return { isError: true, content: [{ type: "text", text: `entity ${id} not found` }] };
|
|
259
|
+
}
|
|
260
|
+
});
|
|
261
|
+
// ----- 9. get_entity_by_key -----
|
|
262
|
+
server.registerTool("get_entity_by_key", {
|
|
263
|
+
title: "Get Entity by Identifier",
|
|
264
|
+
description: "Fetch a task or note by its human-readable identifier (e.g. BOT-12). Pass the project key and sequence number separately.",
|
|
265
|
+
annotations: {
|
|
266
|
+
readOnlyHint: true,
|
|
267
|
+
destructiveHint: false,
|
|
268
|
+
idempotentHint: true,
|
|
269
|
+
openWorldHint: false
|
|
270
|
+
},
|
|
271
|
+
inputSchema: {
|
|
272
|
+
projectKey: ProjectKey,
|
|
273
|
+
sequenceId: z.number().int().positive()
|
|
274
|
+
}
|
|
275
|
+
}, async ({ projectKey, sequenceId }) => {
|
|
276
|
+
try {
|
|
277
|
+
const entity = await c.getEntityByKey(projectKey, sequenceId);
|
|
278
|
+
return { content: [{ type: "text", text: JSON.stringify(entity, null, 2) }] };
|
|
279
|
+
}
|
|
280
|
+
catch {
|
|
281
|
+
return {
|
|
282
|
+
isError: true,
|
|
283
|
+
content: [{ type: "text", text: `entity ${projectKey}-${sequenceId} not found` }]
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
});
|
|
287
|
+
// ----- 10. create_task -----
|
|
288
|
+
server.registerTool("create_task", {
|
|
289
|
+
title: "Create Task",
|
|
290
|
+
description: "Create a task — a structured work item with status, optional due date, priority, and tags. Use this for anything with a state machine (open/in_progress/done). For free-form notes call `remember`.\n" +
|
|
291
|
+
"\n" +
|
|
292
|
+
"Conventions (follow strictly):\n" +
|
|
293
|
+
"- `projectId`: required. Call `list_projects` first if you don't already know the project's UUID. If user-supplied context doesn't pin a project, ask before creating.\n" +
|
|
294
|
+
"- `title`: an executable verb phrase, NOT a vague topic ('Fix CRED-12 null-pointer' ✓, 'Process CRED stuff' ✗). Max ~100 chars.\n" +
|
|
295
|
+
"- `priority`: infer from urgency cues — ASAP/紧急/blocker → urgent; this week / 本周 → high; soon / 近期 → medium; backlog / 待办 → low; otherwise → none.\n" +
|
|
296
|
+
"- `status`: defaults to 'open'. Use 'in_progress' only if work has actually started in this turn.\n" +
|
|
297
|
+
"- `dueAt`: include when the user mentions a date (今天/明天/周五前/by Friday). ISO datetime, UTC.\n" +
|
|
298
|
+
"- `tags`: 2-4 short lowercase kebab-case tokens. Re-use existing tags when possible — search first if unsure.\n" +
|
|
299
|
+
"- `parentId`: include when this task is a follow-up under another task or note.",
|
|
300
|
+
annotations: {
|
|
301
|
+
readOnlyHint: false,
|
|
302
|
+
destructiveHint: false,
|
|
303
|
+
idempotentHint: true,
|
|
304
|
+
openWorldHint: false
|
|
305
|
+
},
|
|
306
|
+
inputSchema: {
|
|
307
|
+
projectId: z.string().uuid().optional(),
|
|
308
|
+
title: z.string().min(1).max(500),
|
|
309
|
+
body: z.string().default(""),
|
|
310
|
+
tags: z.array(z.string()).default([]),
|
|
311
|
+
status: z.enum(TASK_STATUSES).default("open"),
|
|
312
|
+
parentId: z.string().uuid().optional().describe("Link this task under another entity."),
|
|
313
|
+
actorKind: z.enum(ACTOR_KINDS).default("agent"),
|
|
314
|
+
dueAt: z.string().datetime().optional().describe("ISO datetime."),
|
|
315
|
+
priority: z.enum(PRIORITIES).default("none"),
|
|
316
|
+
idempotencyKey: z.string().min(1).max(200).optional()
|
|
317
|
+
}
|
|
318
|
+
}, async (input) => {
|
|
319
|
+
const entity = await c.createTask({
|
|
320
|
+
projectId: input.projectId ?? null,
|
|
321
|
+
title: input.title,
|
|
322
|
+
body: input.body,
|
|
323
|
+
tags: input.tags,
|
|
324
|
+
status: input.status,
|
|
325
|
+
parentId: input.parentId ?? null,
|
|
326
|
+
actorKind: input.actorKind,
|
|
327
|
+
dueAt: input.dueAt ?? null,
|
|
328
|
+
priority: input.priority,
|
|
329
|
+
idempotencyKey: input.idempotencyKey
|
|
330
|
+
});
|
|
331
|
+
return { content: [{ type: "text", text: `created task ${summarizeEntity(entity)}\nid: ${entity.id}` }] };
|
|
332
|
+
});
|
|
333
|
+
// ----- 11. remember (= create_note) -----
|
|
334
|
+
server.registerTool("remember", {
|
|
335
|
+
title: "Remember (Create Note)",
|
|
336
|
+
description: "Capture a free-form note. Title is optional (body's first line acts as label). Notes are botnote's memory layer — Boss's instinct is 'multi-记多用', so err on the side of remembering rather than forgetting.\n" +
|
|
337
|
+
"\n" +
|
|
338
|
+
"Conventions:\n" +
|
|
339
|
+
"- `body`: the substance. Multi-line + markdown OK. Include the WHY, not just the WHAT.\n" +
|
|
340
|
+
"- `title`: skip if the first body line is descriptive. Provide when the body is long-form.\n" +
|
|
341
|
+
"- `tags`: 2-4 short lowercase kebab-case tokens inferred from content. Re-use existing tags — recall similar memories first if unsure of vocabulary.\n" +
|
|
342
|
+
"- `projectId`: pick the most specific project. If unclear, omit (workspace-scope is fine; better than wrong-project).\n" +
|
|
343
|
+
"- `parentId`: pass a task's UUID when the note is a follow-up on a specific task — this surfaces the note when the task is opened.\n" +
|
|
344
|
+
"- `pinned=true`: ONLY for must-read context (deployment steps, hidden gotchas, AGENTS-style conventions). Pinned notes appear in every future opening_brief — abuse them and the brief becomes noise.",
|
|
345
|
+
annotations: {
|
|
346
|
+
readOnlyHint: false,
|
|
347
|
+
destructiveHint: false,
|
|
348
|
+
idempotentHint: true,
|
|
349
|
+
openWorldHint: false
|
|
350
|
+
},
|
|
351
|
+
inputSchema: {
|
|
352
|
+
projectId: z.string().uuid().optional(),
|
|
353
|
+
title: z.string().max(500).optional().describe("Optional; first body line is used as fallback."),
|
|
354
|
+
body: z.string().default(""),
|
|
355
|
+
tags: z.array(z.string()).default([]),
|
|
356
|
+
parentId: z.string().uuid().optional().describe("Link this note under a task or other entity."),
|
|
357
|
+
actorKind: z.enum(ACTOR_KINDS).default("agent"),
|
|
358
|
+
pinned: z.boolean().default(false).describe("Pin to project opening brief (must-read context)."),
|
|
359
|
+
idempotencyKey: z.string().min(1).max(200).optional()
|
|
360
|
+
}
|
|
361
|
+
}, async (input) => {
|
|
362
|
+
const entity = await c.remember({
|
|
363
|
+
projectId: input.projectId ?? null,
|
|
364
|
+
title: input.title ?? null,
|
|
365
|
+
body: input.body,
|
|
366
|
+
tags: input.tags,
|
|
367
|
+
parentId: input.parentId ?? null,
|
|
368
|
+
actorKind: input.actorKind,
|
|
369
|
+
pinned: input.pinned,
|
|
370
|
+
idempotencyKey: input.idempotencyKey
|
|
371
|
+
});
|
|
372
|
+
return { content: [{ type: "text", text: `remembered ${summarizeEntity(entity)}\nid: ${entity.id}` }] };
|
|
373
|
+
});
|
|
374
|
+
// ----- 12. update_entity -----
|
|
375
|
+
server.registerTool("update_entity", {
|
|
376
|
+
title: "Update Entity",
|
|
377
|
+
description: "Update fields on an existing task or note. Pass ONLY the fields you want to change — omitted fields are left untouched.\n" +
|
|
378
|
+
"\n" +
|
|
379
|
+
"Common transitions:\n" +
|
|
380
|
+
"- task completion: `status='done'` (when user signals '搞定/done/完成了'). Optionally `remember` a closing note with `parentId` set to this task.\n" +
|
|
381
|
+
"- task soft-delete / give up: `status='archived'`. `status='rejected'` if the work was declined / 不做了.\n" +
|
|
382
|
+
"- start work: `status='in_progress'` ONLY when work actually begins in this turn (not just on every mention).\n" +
|
|
383
|
+
"- re-parent: pass `parentId` (or `null` to detach).\n" +
|
|
384
|
+
"- pin/unpin: `pinned: true/false`. Pinned notes drive opening_brief — use sparingly.\n" +
|
|
385
|
+
"- title=null clears the title (notes only).",
|
|
386
|
+
annotations: {
|
|
387
|
+
readOnlyHint: false,
|
|
388
|
+
destructiveHint: true,
|
|
389
|
+
idempotentHint: false,
|
|
390
|
+
openWorldHint: false
|
|
391
|
+
},
|
|
392
|
+
inputSchema: {
|
|
393
|
+
id: z.string().uuid(),
|
|
394
|
+
title: z
|
|
395
|
+
.string()
|
|
396
|
+
.max(500)
|
|
397
|
+
.nullable()
|
|
398
|
+
.optional()
|
|
399
|
+
.describe("Pass null to clear the title (notes only)."),
|
|
400
|
+
body: z.string().optional(),
|
|
401
|
+
tags: z.array(z.string()).optional(),
|
|
402
|
+
status: z.string().optional(),
|
|
403
|
+
parentId: z.string().uuid().nullable().optional().describe("Re-link or unlink (null) parent."),
|
|
404
|
+
dueAt: z.string().datetime().nullable().optional().describe("ISO datetime or null to clear."),
|
|
405
|
+
priority: z.enum(PRIORITIES).optional(),
|
|
406
|
+
pinned: z.boolean().optional().describe("Pin or unpin from project opening brief.")
|
|
407
|
+
}
|
|
408
|
+
}, async ({ id, ...fields }) => {
|
|
409
|
+
const defined = Object.fromEntries(Object.entries(fields).filter(([, v]) => v !== undefined));
|
|
410
|
+
const updated = await c.updateEntity(id, defined);
|
|
411
|
+
return { content: [{ type: "text", text: `updated ${summarizeEntity(updated)}` }] };
|
|
412
|
+
});
|
|
413
|
+
// ----- 13. related -----
|
|
414
|
+
server.registerTool("related", {
|
|
415
|
+
title: "Related Entities",
|
|
416
|
+
description: "List entities whose parent_id is the given id — typically notes linked under a task. Use this after opening a task to surface the relevant notes/context.",
|
|
417
|
+
annotations: {
|
|
418
|
+
readOnlyHint: true,
|
|
419
|
+
destructiveHint: false,
|
|
420
|
+
idempotentHint: true,
|
|
421
|
+
openWorldHint: false
|
|
422
|
+
},
|
|
423
|
+
inputSchema: { id: z.string().uuid() }
|
|
424
|
+
}, async ({ id }) => {
|
|
425
|
+
const rows = await c.listRelated(id);
|
|
426
|
+
return {
|
|
427
|
+
content: [
|
|
428
|
+
{
|
|
429
|
+
type: "text",
|
|
430
|
+
text: rows.length
|
|
431
|
+
? rows.map((r) => `- ${summarizeEntity(r)}`).join("\n")
|
|
432
|
+
: "no related entities"
|
|
433
|
+
}
|
|
434
|
+
]
|
|
435
|
+
};
|
|
436
|
+
});
|
|
437
|
+
// ----- 14. link -----
|
|
438
|
+
server.registerTool("link", {
|
|
439
|
+
title: "Link Entities",
|
|
440
|
+
description: "Create a typed edge between two entities. `blocks` = source blocks target, `references` = source references target (citation/see-also), `parent_of` = source is the parent (e.g. task is parent of a sub-note).",
|
|
441
|
+
annotations: {
|
|
442
|
+
readOnlyHint: false,
|
|
443
|
+
destructiveHint: false,
|
|
444
|
+
idempotentHint: true,
|
|
445
|
+
openWorldHint: false
|
|
446
|
+
},
|
|
447
|
+
inputSchema: {
|
|
448
|
+
fromId: z.string().uuid(),
|
|
449
|
+
toId: z.string().uuid(),
|
|
450
|
+
kind: z.enum(EDGE_KINDS)
|
|
451
|
+
}
|
|
452
|
+
}, async ({ fromId, toId, kind }) => {
|
|
453
|
+
const result = await c.link(fromId, { toId, kind: kind });
|
|
454
|
+
return {
|
|
455
|
+
content: [
|
|
456
|
+
{
|
|
457
|
+
type: "text",
|
|
458
|
+
text: result.created
|
|
459
|
+
? `linked ${fromId.slice(0, 8)} -[${kind}]-> ${toId.slice(0, 8)}`
|
|
460
|
+
: `link already exists`
|
|
461
|
+
}
|
|
462
|
+
]
|
|
463
|
+
};
|
|
464
|
+
});
|
|
465
|
+
// ----- bonus resource: workspace overview -----
|
|
466
|
+
server.registerResource("workspace_overview", "botnote://workspace", {
|
|
467
|
+
title: "Workspace Overview",
|
|
468
|
+
description: "List of all projects + most recent activity across the workspace.",
|
|
469
|
+
mimeType: "text/markdown"
|
|
470
|
+
}, async (uri) => {
|
|
471
|
+
const projects = await c.listProjects();
|
|
472
|
+
const recentRows = await c.recent({
|
|
473
|
+
projectId: null,
|
|
474
|
+
since: null,
|
|
475
|
+
kinds: undefined,
|
|
476
|
+
limit: 20
|
|
477
|
+
});
|
|
478
|
+
const lines = ["# botnote workspace", ""];
|
|
479
|
+
lines.push("## Projects");
|
|
480
|
+
for (const p of projects) {
|
|
481
|
+
lines.push(`- ${p.key} — ${p.name} (id: ${p.id})`);
|
|
482
|
+
}
|
|
483
|
+
lines.push("");
|
|
484
|
+
lines.push("## Recent (workspace-wide)");
|
|
485
|
+
for (const r of recentRows) {
|
|
486
|
+
lines.push(`- ${r.createdAt.slice(0, 16).replace("T", " ")} · ${r.kind} · ${displayTitle(r)}`);
|
|
487
|
+
}
|
|
488
|
+
return { contents: [{ uri: uri.href, mimeType: "text/markdown", text: lines.join("\n") }] };
|
|
489
|
+
});
|
|
490
|
+
return server;
|
|
491
|
+
}
|
|
492
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
|