@naumu/mcp 0.3.1 → 0.4.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 +7 -0
- package/dist/client.d.ts +4 -0
- package/dist/client.js +25 -5
- package/dist/client.js.map +1 -1
- package/dist/errors.d.ts +32 -1
- package/dist/errors.js +44 -1
- package/dist/errors.js.map +1 -1
- package/dist/index.js +23 -3
- package/dist/index.js.map +1 -1
- package/dist/tools/add-attribute.d.ts +3 -0
- package/dist/tools/add-attribute.js +43 -0
- package/dist/tools/add-attribute.js.map +1 -0
- package/dist/tools/add-connection.d.ts +3 -0
- package/dist/tools/add-connection.js +46 -0
- package/dist/tools/add-connection.js.map +1 -0
- package/dist/tools/add-edge.js +21 -13
- package/dist/tools/add-edge.js.map +1 -1
- package/dist/tools/add-node-type.d.ts +3 -0
- package/dist/tools/add-node-type.js +54 -0
- package/dist/tools/add-node-type.js.map +1 -0
- package/dist/tools/add-node.js +24 -13
- package/dist/tools/add-node.js.map +1 -1
- package/dist/tools/add-reaction.d.ts +3 -0
- package/dist/tools/add-reaction.js +34 -0
- package/dist/tools/add-reaction.js.map +1 -0
- package/dist/tools/ask-naumu.d.ts +3 -0
- package/dist/tools/ask-naumu.js +44 -0
- package/dist/tools/ask-naumu.js.map +1 -0
- package/dist/tools/canvas-add-element.d.ts +3 -0
- package/dist/tools/canvas-add-element.js +46 -0
- package/dist/tools/canvas-add-element.js.map +1 -0
- package/dist/tools/canvas-remove-element.d.ts +3 -0
- package/dist/tools/canvas-remove-element.js +17 -0
- package/dist/tools/canvas-remove-element.js.map +1 -0
- package/dist/tools/canvas-update-element.d.ts +3 -0
- package/dist/tools/canvas-update-element.js +20 -0
- package/dist/tools/canvas-update-element.js.map +1 -0
- package/dist/tools/create-canvas.d.ts +3 -0
- package/dist/tools/create-canvas.js +17 -0
- package/dist/tools/create-canvas.js.map +1 -0
- package/dist/tools/create-note.d.ts +3 -0
- package/dist/tools/create-note.js +17 -0
- package/dist/tools/create-note.js.map +1 -0
- package/dist/tools/create-thread.d.ts +3 -0
- package/dist/tools/create-thread.js +63 -0
- package/dist/tools/create-thread.js.map +1 -0
- package/dist/tools/get-canvas-elements.d.ts +3 -0
- package/dist/tools/get-canvas-elements.js +16 -0
- package/dist/tools/get-canvas-elements.js.map +1 -0
- package/dist/tools/get-canvas-image.d.ts +3 -0
- package/dist/tools/get-canvas-image.js +77 -0
- package/dist/tools/get-canvas-image.js.map +1 -0
- package/dist/tools/get-thread.d.ts +3 -0
- package/dist/tools/get-thread.js +25 -0
- package/dist/tools/get-thread.js.map +1 -0
- package/dist/tools/index.d.ts +10 -0
- package/dist/tools/index.js +118 -16
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/list-canvases.d.ts +3 -0
- package/dist/tools/list-canvases.js +16 -0
- package/dist/tools/list-canvases.js.map +1 -0
- package/dist/tools/list-schema-violations.d.ts +3 -0
- package/dist/tools/list-schema-violations.js +16 -0
- package/dist/tools/list-schema-violations.js.map +1 -0
- package/dist/tools/list-threads.d.ts +3 -0
- package/dist/tools/list-threads.js +43 -0
- package/dist/tools/list-threads.js.map +1 -0
- package/dist/tools/naumu-typing.d.ts +3 -0
- package/dist/tools/naumu-typing.js +30 -0
- package/dist/tools/naumu-typing.js.map +1 -0
- package/dist/tools/note-append.d.ts +3 -0
- package/dist/tools/note-append.js +17 -0
- package/dist/tools/note-append.js.map +1 -0
- package/dist/tools/note-delete-section.d.ts +3 -0
- package/dist/tools/note-delete-section.js +22 -0
- package/dist/tools/note-delete-section.js.map +1 -0
- package/dist/tools/note-find-replace.d.ts +3 -0
- package/dist/tools/note-find-replace.js +26 -0
- package/dist/tools/note-find-replace.js.map +1 -0
- package/dist/tools/note-insert.d.ts +3 -0
- package/dist/tools/note-insert.js +24 -0
- package/dist/tools/note-insert.js.map +1 -0
- package/dist/tools/note-read.d.ts +3 -0
- package/dist/tools/note-read.js +16 -0
- package/dist/tools/note-read.js.map +1 -0
- package/dist/tools/note-replace-section.d.ts +3 -0
- package/dist/tools/note-replace-section.js +26 -0
- package/dist/tools/note-replace-section.js.map +1 -0
- package/dist/tools/note-replace.d.ts +3 -0
- package/dist/tools/note-replace.js +17 -0
- package/dist/tools/note-replace.js.map +1 -0
- package/dist/tools/post-message.d.ts +3 -0
- package/dist/tools/post-message.js +45 -0
- package/dist/tools/post-message.js.map +1 -0
- package/dist/tools/react-to-message.d.ts +3 -0
- package/dist/tools/react-to-message.js +34 -0
- package/dist/tools/react-to-message.js.map +1 -0
- package/dist/tools/read-thread.d.ts +3 -0
- package/dist/tools/read-thread.js +43 -0
- package/dist/tools/read-thread.js.map +1 -0
- package/dist/tools/remove-edge.js +14 -11
- package/dist/tools/remove-edge.js.map +1 -1
- package/dist/tools/remove-reaction.d.ts +3 -0
- package/dist/tools/remove-reaction.js +34 -0
- package/dist/tools/remove-reaction.js.map +1 -0
- package/dist/tools/request-attachment-upload.d.ts +3 -0
- package/dist/tools/request-attachment-upload.js +59 -0
- package/dist/tools/request-attachment-upload.js.map +1 -0
- package/dist/tools/update-schema.d.ts +3 -0
- package/dist/tools/update-schema.js +48 -0
- package/dist/tools/update-schema.js.map +1 -0
- package/dist/tools/whoami.d.ts +3 -0
- package/dist/tools/whoami.js +23 -0
- package/dist/tools/whoami.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export function registerAskNaumu(server, client) {
|
|
3
|
+
server.registerTool('naumu_ask_naumu', {
|
|
4
|
+
title: 'Ask Naumu',
|
|
5
|
+
description: 'Ask the system @Naumu Identity (the canonical graph-writer/curator) a question about your graph. Use for questions where direct graph reads would be inefficient — Naumu has full read access and synthesizes answers. Limited to 5 calls per hour per Identity. Returns { answer, sources, confidence, durationMs }.',
|
|
6
|
+
inputSchema: z.object({
|
|
7
|
+
graphId: z.string().describe('The graph ID to ask about.'),
|
|
8
|
+
question: z
|
|
9
|
+
.string()
|
|
10
|
+
.max(4000)
|
|
11
|
+
.describe('The question to ask Naumu. Max 4000 characters.'),
|
|
12
|
+
}),
|
|
13
|
+
}, async ({ graphId, question }) => {
|
|
14
|
+
try {
|
|
15
|
+
const identityId = process.env.NAUMU_IDENTITY_ID;
|
|
16
|
+
if (!identityId) {
|
|
17
|
+
return {
|
|
18
|
+
content: [
|
|
19
|
+
{
|
|
20
|
+
type: 'text',
|
|
21
|
+
text: 'Error: NAUMU_IDENTITY_ID env var is required for ask_naumu — re-run the pairing setup.',
|
|
22
|
+
},
|
|
23
|
+
],
|
|
24
|
+
isError: true,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
const data = await client.post(`/api/identities/${identityId}/ask`, {
|
|
28
|
+
graphId,
|
|
29
|
+
question,
|
|
30
|
+
});
|
|
31
|
+
return {
|
|
32
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
37
|
+
return {
|
|
38
|
+
content: [{ type: 'text', text: `Error: ${message}` }],
|
|
39
|
+
isError: true,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=ask-naumu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ask-naumu.js","sourceRoot":"","sources":["../../src/tools/ask-naumu.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,UAAU,gBAAgB,CAAC,MAAiB,EAAE,MAAmB;IACtE,MAAM,CAAC,YAAY,CAClB,iBAAiB,EACjB;QACC,KAAK,EAAE,WAAW;QAClB,WAAW,EACV,uTAAuT;QACxT,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACrB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;YAC1D,QAAQ,EAAE,CAAC;iBACT,MAAM,EAAE;iBACR,GAAG,CAAC,IAAI,CAAC;iBACT,QAAQ,CAAC,iDAAiD,CAAC;SAC7D,CAAC;KACF,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC/B,IAAI,CAAC;YACJ,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;YACjD,IAAI,CAAC,UAAU,EAAE,CAAC;gBACjB,OAAO;oBACN,OAAO,EAAE;wBACR;4BACC,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,wFAAwF;yBAC9F;qBACD;oBACD,OAAO,EAAE,IAAI;iBACb,CAAC;YACH,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,mBAAmB,UAAU,MAAM,EAAE;gBACnE,OAAO;gBACP,QAAQ;aACR,CAAC,CAAC;YAEH,OAAO;gBACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;aACzE,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO;gBACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,OAAO,EAAE,EAAE,CAAC;gBAC/D,OAAO,EAAE,IAAI;aACb,CAAC;QACH,CAAC;IACF,CAAC,CACD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
const ELEMENT_TYPES = [
|
|
3
|
+
'rectangle',
|
|
4
|
+
'ellipse',
|
|
5
|
+
'diamond',
|
|
6
|
+
'text',
|
|
7
|
+
'line',
|
|
8
|
+
'arrow',
|
|
9
|
+
'freehand',
|
|
10
|
+
'image',
|
|
11
|
+
'bookmark-card',
|
|
12
|
+
'entity-embed',
|
|
13
|
+
];
|
|
14
|
+
export function registerCanvasAddElement(server, client) {
|
|
15
|
+
server.registerTool('naumu_canvas_add_element', {
|
|
16
|
+
title: 'Add Canvas Element',
|
|
17
|
+
description: 'Add a new element to a canvas. Other participants see your colored cursor at the element\'s center while it lands. The server fills in `id`, `version`, `fractionalIndex`, and `seed` automatically — pass only `type`, position (`x`, `y`), and size (`width`, `height`); other fields are optional and have sensible defaults (stroke #1e1e1e, no fill, opacity 1, etc.). For text elements, set `label` and `fontSize`. Coordinates are canvas-space (the same units the live editor uses).',
|
|
18
|
+
inputSchema: z.object({
|
|
19
|
+
canvasId: z.string().describe('The canvas ID'),
|
|
20
|
+
element: z
|
|
21
|
+
.object({
|
|
22
|
+
type: z.enum(ELEMENT_TYPES).describe('Element shape'),
|
|
23
|
+
x: z.number().describe('Top-left x coordinate in canvas space'),
|
|
24
|
+
y: z.number().describe('Top-left y coordinate in canvas space'),
|
|
25
|
+
width: z.number().describe('Width in canvas units'),
|
|
26
|
+
height: z.number().describe('Height in canvas units'),
|
|
27
|
+
strokeColor: z.string().optional().describe('Stroke color (hex). Default #1e1e1e.'),
|
|
28
|
+
fillColor: z.string().optional().describe('Fill color (hex) or "transparent". Default transparent.'),
|
|
29
|
+
strokeWidth: z.number().optional().describe('Stroke width. Default 2.'),
|
|
30
|
+
opacity: z.number().min(0).max(1).optional().describe('0..1, default 1'),
|
|
31
|
+
roughness: z.number().min(0).max(2).optional().describe('Hand-drawn roughness 0..2. Default 1.'),
|
|
32
|
+
label: z.string().optional().describe('Optional label/text content'),
|
|
33
|
+
labelFontSize: z.number().optional().describe('Label font size'),
|
|
34
|
+
angle: z.number().optional().describe('Rotation in radians. Default 0.'),
|
|
35
|
+
})
|
|
36
|
+
.passthrough()
|
|
37
|
+
.describe('Element fields. Pass only what you set — defaults fill the rest.'),
|
|
38
|
+
}),
|
|
39
|
+
}, async ({ canvasId, element }) => {
|
|
40
|
+
const data = await client.post(`/api/canvases/${canvasId}/elements`, { element });
|
|
41
|
+
return {
|
|
42
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
43
|
+
};
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=canvas-add-element.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvas-add-element.js","sourceRoot":"","sources":["../../src/tools/canvas-add-element.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,aAAa,GAAG;IACrB,WAAW;IACX,SAAS;IACT,SAAS;IACT,MAAM;IACN,MAAM;IACN,OAAO;IACP,UAAU;IACV,OAAO;IACP,eAAe;IACf,cAAc;CACL,CAAC;AAEX,MAAM,UAAU,wBAAwB,CAAC,MAAiB,EAAE,MAAmB;IAC9E,MAAM,CAAC,YAAY,CAClB,0BAA0B,EAC1B;QACC,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EACV,geAAge;QACje,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACrB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;YAC9C,OAAO,EAAE,CAAC;iBACR,MAAM,CAAC;gBACP,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC;gBACrD,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;gBAC/D,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;gBAC/D,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;gBACnD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;gBACrD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;gBACnF,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yDAAyD,CAAC;gBACpG,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;gBACvE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;gBACxE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;gBAChG,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;gBACpE,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;gBAChE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;aACxE,CAAC;iBACD,WAAW,EAAE;iBACb,QAAQ,CAAC,kEAAkE,CAAC;SAC9E,CAAC;KACF,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE;QAC/B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,iBAAiB,QAAQ,WAAW,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAClF,OAAO;YACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SACzE,CAAC;IACH,CAAC,CACD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export function registerCanvasRemoveElement(server, client) {
|
|
3
|
+
server.registerTool('naumu_canvas_remove_element', {
|
|
4
|
+
title: 'Remove Canvas Element',
|
|
5
|
+
description: 'Soft-delete a canvas element. The element is tombstoned (isDeleted=true) so concurrent edits don\'t resurrect it. 404 if the element id is not present on this canvas.',
|
|
6
|
+
inputSchema: z.object({
|
|
7
|
+
canvasId: z.string().describe('The canvas ID'),
|
|
8
|
+
elementId: z.string().describe('The element ID to delete'),
|
|
9
|
+
}),
|
|
10
|
+
}, async ({ canvasId, elementId }) => {
|
|
11
|
+
const data = await client.del(`/api/canvases/${canvasId}/elements/${elementId}`);
|
|
12
|
+
return {
|
|
13
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
14
|
+
};
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=canvas-remove-element.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvas-remove-element.js","sourceRoot":"","sources":["../../src/tools/canvas-remove-element.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,UAAU,2BAA2B,CAAC,MAAiB,EAAE,MAAmB;IACjF,MAAM,CAAC,YAAY,CAClB,6BAA6B,EAC7B;QACC,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EACV,wKAAwK;QACzK,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACrB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;YAC9C,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;SAC1D,CAAC;KACF,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE;QACjC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,iBAAiB,QAAQ,aAAa,SAAS,EAAE,CAAC,CAAC;QACjF,OAAO;YACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SACzE,CAAC;IACH,CAAC,CACD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export function registerCanvasUpdateElement(server, client) {
|
|
3
|
+
server.registerTool('naumu_canvas_update_element', {
|
|
4
|
+
title: 'Update Canvas Element',
|
|
5
|
+
description: 'Patch an existing canvas element. Only the fields you pass in `changes` are updated — `id`, `version`, `createdBy`, and `isDeleted` are server-managed and ignored if present. Useful for moving (`x`, `y`), resizing (`width`, `height`), recoloring (`strokeColor`, `fillColor`), or relabeling (`label`).',
|
|
6
|
+
inputSchema: z.object({
|
|
7
|
+
canvasId: z.string().describe('The canvas ID'),
|
|
8
|
+
elementId: z.string().describe('The element ID returned by `naumu_canvas_add_element` or `naumu_get_canvas_elements`'),
|
|
9
|
+
changes: z
|
|
10
|
+
.record(z.string(), z.unknown())
|
|
11
|
+
.describe('Partial element fields to merge in. Server bumps `version` automatically.'),
|
|
12
|
+
}),
|
|
13
|
+
}, async ({ canvasId, elementId, changes }) => {
|
|
14
|
+
const data = await client.patch(`/api/canvases/${canvasId}/elements/${elementId}`, { changes });
|
|
15
|
+
return {
|
|
16
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
17
|
+
};
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=canvas-update-element.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvas-update-element.js","sourceRoot":"","sources":["../../src/tools/canvas-update-element.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,UAAU,2BAA2B,CAAC,MAAiB,EAAE,MAAmB;IACjF,MAAM,CAAC,YAAY,CAClB,6BAA6B,EAC7B;QACC,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EACV,8SAA8S;QAC/S,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACrB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;YAC9C,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sFAAsF,CAAC;YACtH,OAAO,EAAE,CAAC;iBACR,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;iBAC/B,QAAQ,CAAC,2EAA2E,CAAC;SACvF,CAAC;KACF,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE;QAC1C,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,KAAK,CAC9B,iBAAiB,QAAQ,aAAa,SAAS,EAAE,EACjD,EAAE,OAAO,EAAE,CACX,CAAC;QACF,OAAO;YACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SACzE,CAAC;IACH,CAAC,CACD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export function registerCreateCanvas(server, client) {
|
|
3
|
+
server.registerTool('naumu_create_canvas', {
|
|
4
|
+
title: 'Create Canvas',
|
|
5
|
+
description: 'Create a new empty canvas in a graph. Returns the new canvas row including its `id` — pass that id to `naumu_canvas_add_element` to start drawing. Bots can only create canvases in their own graph.',
|
|
6
|
+
inputSchema: z.object({
|
|
7
|
+
graphId: z.string().describe('The graph ID to create the canvas in'),
|
|
8
|
+
title: z.string().optional().describe('Optional title for the canvas'),
|
|
9
|
+
}),
|
|
10
|
+
}, async ({ graphId, title }) => {
|
|
11
|
+
const data = await client.post('/api/canvases', { graphId, title });
|
|
12
|
+
return {
|
|
13
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
14
|
+
};
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=create-canvas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-canvas.js","sourceRoot":"","sources":["../../src/tools/create-canvas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,UAAU,oBAAoB,CAAC,MAAiB,EAAE,MAAmB;IAC1E,MAAM,CAAC,YAAY,CAClB,qBAAqB,EACrB;QACC,KAAK,EAAE,eAAe;QACtB,WAAW,EACV,sMAAsM;QACvM,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACrB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;YACpE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;SACtE,CAAC;KACF,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE;QAC5B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QACpE,OAAO;YACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SACzE,CAAC;IACH,CAAC,CACD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export function registerCreateNote(server, client) {
|
|
3
|
+
server.registerTool('naumu_create_note', {
|
|
4
|
+
title: 'Create Note',
|
|
5
|
+
description: 'Create a new empty note in a graph. Returns the new note row including its `id` — pass that id to `naumu_note_append` / `naumu_note_replace` to fill in the content. Bots can only create notes in their own graph.',
|
|
6
|
+
inputSchema: z.object({
|
|
7
|
+
graphId: z.string().describe('The graph ID to create the note in'),
|
|
8
|
+
title: z.string().optional().describe('Optional title for the note'),
|
|
9
|
+
}),
|
|
10
|
+
}, async ({ graphId, title }) => {
|
|
11
|
+
const data = await client.post('/api/notes', { graphId, title });
|
|
12
|
+
return {
|
|
13
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
14
|
+
};
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=create-note.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-note.js","sourceRoot":"","sources":["../../src/tools/create-note.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,UAAU,kBAAkB,CAAC,MAAiB,EAAE,MAAmB;IACxE,MAAM,CAAC,YAAY,CAClB,mBAAmB,EACnB;QACC,KAAK,EAAE,aAAa;QACpB,WAAW,EACV,qNAAqN;QACtN,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACrB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;YAClE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;SACpE,CAAC;KACF,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE;QAC5B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QACjE,OAAO;YACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SACzE,CAAC;IACH,CAAC,CACD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export function registerCreateThread(server, client) {
|
|
3
|
+
server.registerTool('naumu_create_thread', {
|
|
4
|
+
title: 'Create Thread',
|
|
5
|
+
description: 'Start a new conversation in your graph. You are auto-attached as a permanent participant; the thread\'s formal creator is your primary owner (the user who registered you), so the thread shows up in their sidebar. Optional `participants` adds humans (by userId) and other bots (by identityId) at creation time. Optional `initialMessage` is posted as your first message — use it to open the conversation. Returns the created thread (including its id) so you can immediately call `naumu_post_message` for follow-ups. Useful for scheduled briefings ("Brief me about X every morning at 9am" — schedule on your side, then call this to deliver into Naumu).',
|
|
6
|
+
inputSchema: z.object({
|
|
7
|
+
title: z
|
|
8
|
+
.string()
|
|
9
|
+
.min(1)
|
|
10
|
+
.max(200)
|
|
11
|
+
.optional()
|
|
12
|
+
.describe('Thread title shown in the sidebar. If omitted, Naumu generates a default like "Conversation YYYY-MM-DD".'),
|
|
13
|
+
participants: z
|
|
14
|
+
.array(z.discriminatedUnion('type', [
|
|
15
|
+
z.object({
|
|
16
|
+
type: z.literal('user'),
|
|
17
|
+
userId: z.string().min(1).describe('User UUID — get these from `naumu_get_thread`/`naumu_read_thread` participant rosters or webhook payloads.'),
|
|
18
|
+
}),
|
|
19
|
+
z.object({
|
|
20
|
+
type: z.literal('identity'),
|
|
21
|
+
identityId: z.string().min(1).describe('Identity id (`identity-…` or `id-…`). Other bots in the same graph can be co-attached to multi-bot threads.'),
|
|
22
|
+
}),
|
|
23
|
+
]))
|
|
24
|
+
.max(32)
|
|
25
|
+
.optional()
|
|
26
|
+
.describe('Up to 32 humans and/or other bots to attach at creation. Your primary owner is added automatically — you do NOT need to list them here.'),
|
|
27
|
+
initialMessage: z
|
|
28
|
+
.string()
|
|
29
|
+
.min(1)
|
|
30
|
+
.max(32_000)
|
|
31
|
+
.optional()
|
|
32
|
+
.describe('Markdown body for the first message. Authored by you (the bot), so it appears in the thread under your name.'),
|
|
33
|
+
visibility: z
|
|
34
|
+
.enum(['restricted', 'internal', 'open'])
|
|
35
|
+
.optional()
|
|
36
|
+
.describe('`restricted` (invite-only, default) hides from non-participants. `internal` is visible to space members. `open` is visible to anyone who can see the space.'),
|
|
37
|
+
}),
|
|
38
|
+
}, async ({ title, participants, initialMessage, visibility }) => {
|
|
39
|
+
try {
|
|
40
|
+
const body = {};
|
|
41
|
+
if (title !== undefined)
|
|
42
|
+
body.title = title;
|
|
43
|
+
if (participants !== undefined)
|
|
44
|
+
body.participants = participants;
|
|
45
|
+
if (initialMessage !== undefined)
|
|
46
|
+
body.initialMessage = initialMessage;
|
|
47
|
+
if (visibility !== undefined)
|
|
48
|
+
body.visibility = visibility;
|
|
49
|
+
const data = await client.post('/api/identities/me/threads', body);
|
|
50
|
+
return {
|
|
51
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
56
|
+
return {
|
|
57
|
+
content: [{ type: 'text', text: `Error: ${message}` }],
|
|
58
|
+
isError: true,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=create-thread.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-thread.js","sourceRoot":"","sources":["../../src/tools/create-thread.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,UAAU,oBAAoB,CAAC,MAAiB,EAAE,MAAmB;IAC1E,MAAM,CAAC,YAAY,CAClB,qBAAqB,EACrB;QACC,KAAK,EAAE,eAAe;QACtB,WAAW,EACV,2oBAA2oB;QAC5oB,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACrB,KAAK,EAAE,CAAC;iBACN,MAAM,EAAE;iBACR,GAAG,CAAC,CAAC,CAAC;iBACN,GAAG,CAAC,GAAG,CAAC;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,0GAA0G,CAAC;YACtH,YAAY,EAAE,CAAC;iBACb,KAAK,CACL,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE;gBAC5B,CAAC,CAAC,MAAM,CAAC;oBACR,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;oBACvB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,4GAA4G,CAAC;iBAChJ,CAAC;gBACF,CAAC,CAAC,MAAM,CAAC;oBACR,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;oBAC3B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,6GAA6G,CAAC;iBACrJ,CAAC;aACF,CAAC,CACF;iBACA,GAAG,CAAC,EAAE,CAAC;iBACP,QAAQ,EAAE;iBACV,QAAQ,CAAC,yIAAyI,CAAC;YACrJ,cAAc,EAAE,CAAC;iBACf,MAAM,EAAE;iBACR,GAAG,CAAC,CAAC,CAAC;iBACN,GAAG,CAAC,MAAM,CAAC;iBACX,QAAQ,EAAE;iBACV,QAAQ,CAAC,8GAA8G,CAAC;YAC1H,UAAU,EAAE,CAAC;iBACX,IAAI,CAAC,CAAC,YAAY,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;iBACxC,QAAQ,EAAE;iBACV,QAAQ,CAAC,6JAA6J,CAAC;SACzK,CAAC;KACF,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,EAAE,EAAE;QAC7D,IAAI,CAAC;YACJ,MAAM,IAAI,GAA4B,EAAE,CAAC;YACzC,IAAI,KAAK,KAAK,SAAS;gBAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;YAC5C,IAAI,YAAY,KAAK,SAAS;gBAAE,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;YACjE,IAAI,cAAc,KAAK,SAAS;gBAAE,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;YACvE,IAAI,UAAU,KAAK,SAAS;gBAAE,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;YAC3D,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE,IAAI,CAAC,CAAC;YACnE,OAAO;gBACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;aACzE,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO;gBACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,OAAO,EAAE,EAAE,CAAC;gBAC/D,OAAO,EAAE,IAAI;aACb,CAAC;QACH,CAAC;IACF,CAAC,CACD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export function registerGetCanvasElements(server, client) {
|
|
3
|
+
server.registerTool('naumu_get_canvas_elements', {
|
|
4
|
+
title: 'Get Canvas Elements',
|
|
5
|
+
description: 'Read the structured JSON contents of a canvas — every shape, text, line, freehand stroke, image, bookmark card, and entity-embed with their positions, colors, and text. Use this when you need to reason about what a user has drawn without needing to see the visual output.',
|
|
6
|
+
inputSchema: z.object({
|
|
7
|
+
canvasId: z.string().describe('The canvas ID'),
|
|
8
|
+
}),
|
|
9
|
+
}, async ({ canvasId }) => {
|
|
10
|
+
const data = await client.get(`/api/canvases/${encodeURIComponent(canvasId)}/elements`);
|
|
11
|
+
return {
|
|
12
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
13
|
+
};
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=get-canvas-elements.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-canvas-elements.js","sourceRoot":"","sources":["../../src/tools/get-canvas-elements.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,UAAU,yBAAyB,CAAC,MAAiB,EAAE,MAAmB;IAC/E,MAAM,CAAC,YAAY,CAClB,2BAA2B,EAC3B;QACC,KAAK,EAAE,qBAAqB;QAC5B,WAAW,EACV,iRAAiR;QAClR,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACrB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;SAC9C,CAAC;KACF,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QACtB,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,iBAAiB,kBAAkB,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QACxF,OAAO;YACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SACzE,CAAC;IACH,CAAC,CACD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
const MAX_INLINE_BYTES = 4 * 1024 * 1024;
|
|
3
|
+
export function registerGetCanvasImage(server, client) {
|
|
4
|
+
server.registerTool('naumu_get_canvas_image', {
|
|
5
|
+
title: 'Get Canvas Image',
|
|
6
|
+
description: 'Render a canvas to a PNG image so you can visually inspect what was drawn — freehand strokes, spatial layout, sketches. Returns the image inline by default so any MCP host can see it directly. Use `mode: "url"` if you specifically need a signed URL (e.g. very large canvases, or to share the link).',
|
|
7
|
+
inputSchema: z.object({
|
|
8
|
+
canvasId: z.string().describe('The canvas ID'),
|
|
9
|
+
scale: z
|
|
10
|
+
.union([z.literal(1), z.literal(2)])
|
|
11
|
+
.default(2)
|
|
12
|
+
.describe('Pixel density (1 or 2). Default is 2 for retina-quality output.'),
|
|
13
|
+
theme: z
|
|
14
|
+
.enum(['light', 'dark'])
|
|
15
|
+
.default('light')
|
|
16
|
+
.describe('Background theme to render with.'),
|
|
17
|
+
mode: z
|
|
18
|
+
.enum(['inline', 'url'])
|
|
19
|
+
.default('inline')
|
|
20
|
+
.describe('`inline` (default) embeds the PNG directly so vision-capable hosts see it. `url` returns a signed S3 URL that expires in 1 hour — useful for large canvases or sharing.'),
|
|
21
|
+
}),
|
|
22
|
+
}, async ({ canvasId, scale, theme, mode }) => {
|
|
23
|
+
if (mode === 'url') {
|
|
24
|
+
return await fetchAsUrl(client, canvasId, scale, theme);
|
|
25
|
+
}
|
|
26
|
+
const params = new URLSearchParams({
|
|
27
|
+
scale: String(scale),
|
|
28
|
+
theme,
|
|
29
|
+
});
|
|
30
|
+
const { buffer, contentType } = await client.getBinary(`/api/canvases/${encodeURIComponent(canvasId)}/image?${params.toString()}`);
|
|
31
|
+
if (buffer.byteLength > MAX_INLINE_BYTES) {
|
|
32
|
+
// Too big for inline base64 — fall back to URL automatically.
|
|
33
|
+
return await fetchAsUrl(client, canvasId, scale, theme, {
|
|
34
|
+
reason: `Canvas PNG is ${formatBytes(buffer.byteLength)}, exceeds inline limit ${formatBytes(MAX_INLINE_BYTES)} — returning signed URL instead.`,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
const base64 = bufferToBase64(buffer);
|
|
38
|
+
return {
|
|
39
|
+
content: [
|
|
40
|
+
{
|
|
41
|
+
type: 'image',
|
|
42
|
+
data: base64,
|
|
43
|
+
mimeType: contentType.startsWith('image/') ? contentType : 'image/png',
|
|
44
|
+
},
|
|
45
|
+
],
|
|
46
|
+
};
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
async function fetchAsUrl(client, canvasId, scale, theme, extra) {
|
|
50
|
+
const params = new URLSearchParams({
|
|
51
|
+
as: 'url',
|
|
52
|
+
scale: String(scale),
|
|
53
|
+
theme,
|
|
54
|
+
});
|
|
55
|
+
const data = await client.get(`/api/canvases/${encodeURIComponent(canvasId)}/image?${params.toString()}`);
|
|
56
|
+
const payload = extra ? { ...data, note: extra.reason } : data;
|
|
57
|
+
return {
|
|
58
|
+
content: [{ type: 'text', text: JSON.stringify(payload, null, 2) }],
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
function bufferToBase64(buffer) {
|
|
62
|
+
if (typeof Buffer !== 'undefined') {
|
|
63
|
+
return Buffer.from(buffer).toString('base64');
|
|
64
|
+
}
|
|
65
|
+
let binary = '';
|
|
66
|
+
for (let i = 0; i < buffer.byteLength; i++) {
|
|
67
|
+
binary += String.fromCharCode(buffer[i]);
|
|
68
|
+
}
|
|
69
|
+
// eslint-disable-next-line no-undef
|
|
70
|
+
return btoa(binary);
|
|
71
|
+
}
|
|
72
|
+
function formatBytes(bytes) {
|
|
73
|
+
if (bytes >= 1024 * 1024)
|
|
74
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;
|
|
75
|
+
return `${(bytes / 1024).toFixed(1)}KB`;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=get-canvas-image.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-canvas-image.js","sourceRoot":"","sources":["../../src/tools/get-canvas-image.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export function registerGetThread(server, client) {
|
|
3
|
+
server.registerTool('naumu_get_thread', {
|
|
4
|
+
title: 'Get Thread',
|
|
5
|
+
description: 'Fetch a single thread, including the human participant roster (`participantDetails` — userId, name, image) and bot roster (`identityParticipants` — id, name, isSystem). Use this when `naumu_list_threads` surfaced a candidate and you want to know exactly who is in it before posting. Pair with `naumu_read_thread` for message history.',
|
|
6
|
+
inputSchema: z.object({
|
|
7
|
+
threadId: z.string().describe('The thread ID to fetch.'),
|
|
8
|
+
}),
|
|
9
|
+
}, async ({ threadId }) => {
|
|
10
|
+
try {
|
|
11
|
+
const data = await client.get(`/api/threads/${threadId}`);
|
|
12
|
+
return {
|
|
13
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
catch (err) {
|
|
17
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
18
|
+
return {
|
|
19
|
+
content: [{ type: 'text', text: `Error: ${message}` }],
|
|
20
|
+
isError: true,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=get-thread.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-thread.js","sourceRoot":"","sources":["../../src/tools/get-thread.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,UAAU,iBAAiB,CAAC,MAAiB,EAAE,MAAmB;IACvE,MAAM,CAAC,YAAY,CAClB,kBAAkB,EAClB;QACC,KAAK,EAAE,YAAY;QACnB,WAAW,EACV,+UAA+U;QAChV,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACrB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;SACxD,CAAC;KACF,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QACtB,IAAI,CAAC;YACJ,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,gBAAgB,QAAQ,EAAE,CAAC,CAAC;YAC1D,OAAO;gBACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;aACzE,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO;gBACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,OAAO,EAAE,EAAE,CAAC;gBAC/D,OAAO,EAAE,IAAI;aACb,CAAC;QACH,CAAC;IACF,CAAC,CACD,CAAC;AACH,CAAC"}
|
package/dist/tools/index.d.ts
CHANGED
|
@@ -1,3 +1,13 @@
|
|
|
1
1
|
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
2
|
import type { NaumuClient } from '../client.js';
|
|
3
|
+
/**
|
|
4
|
+
* Register every MCP tool. Used by user-key sessions, where no per-Identity
|
|
5
|
+
* filtering applies.
|
|
6
|
+
*/
|
|
3
7
|
export declare function registerAllTools(server: McpServer, client: NaumuClient): void;
|
|
8
|
+
/**
|
|
9
|
+
* Register only the named subset — the bot-key path. Names not present in the
|
|
10
|
+
* registrar map are silently skipped (forward compat with future tools the
|
|
11
|
+
* backend manifest may include).
|
|
12
|
+
*/
|
|
13
|
+
export declare function registerNamedTools(server: McpServer, client: NaumuClient, toolNames: readonly string[]): void;
|
package/dist/tools/index.js
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import { registerListGraphs } from './list-graphs.js';
|
|
2
2
|
import { registerGetSchema } from './get-schema.js';
|
|
3
|
+
import { registerUpdateSchema } from './update-schema.js';
|
|
4
|
+
import { registerAddNodeType } from './add-node-type.js';
|
|
5
|
+
import { registerAddConnection } from './add-connection.js';
|
|
6
|
+
import { registerAddAttribute } from './add-attribute.js';
|
|
3
7
|
import { registerTextSearch } from './text-search.js';
|
|
4
8
|
import { registerSemanticSearch } from './semantic-search.js';
|
|
5
9
|
import { registerFilter } from './filter.js';
|
|
@@ -14,22 +18,120 @@ import { registerGetAiThread } from './get-ai-thread.js';
|
|
|
14
18
|
import { registerTraverse } from './traverse.js';
|
|
15
19
|
import { registerGetView } from './get-view.js';
|
|
16
20
|
import { registerListViewNodes } from './list-view-nodes.js';
|
|
21
|
+
import { registerListCanvases } from './list-canvases.js';
|
|
22
|
+
import { registerGetCanvasElements } from './get-canvas-elements.js';
|
|
23
|
+
import { registerGetCanvasImage } from './get-canvas-image.js';
|
|
24
|
+
import { registerPostMessage } from './post-message.js';
|
|
25
|
+
import { registerReadThread } from './read-thread.js';
|
|
26
|
+
import { registerAskNaumu } from './ask-naumu.js';
|
|
27
|
+
import { registerWhoami } from './whoami.js';
|
|
28
|
+
import { registerListThreads } from './list-threads.js';
|
|
29
|
+
import { registerGetThread } from './get-thread.js';
|
|
30
|
+
import { registerCreateThread } from './create-thread.js';
|
|
31
|
+
import { registerRequestAttachmentUpload } from './request-attachment-upload.js';
|
|
32
|
+
import { registerAddReaction } from './add-reaction.js';
|
|
33
|
+
import { registerRemoveReaction } from './remove-reaction.js';
|
|
34
|
+
import { registerNaumuTyping } from './naumu-typing.js';
|
|
35
|
+
import { registerNoteRead } from './note-read.js';
|
|
36
|
+
import { registerNoteAppend } from './note-append.js';
|
|
37
|
+
import { registerNoteInsert } from './note-insert.js';
|
|
38
|
+
import { registerNoteReplaceSection } from './note-replace-section.js';
|
|
39
|
+
import { registerNoteDeleteSection } from './note-delete-section.js';
|
|
40
|
+
import { registerNoteReplace } from './note-replace.js';
|
|
41
|
+
import { registerNoteFindReplace } from './note-find-replace.js';
|
|
42
|
+
import { registerCanvasAddElement } from './canvas-add-element.js';
|
|
43
|
+
import { registerCanvasUpdateElement } from './canvas-update-element.js';
|
|
44
|
+
import { registerCanvasRemoveElement } from './canvas-remove-element.js';
|
|
45
|
+
import { registerCreateNote } from './create-note.js';
|
|
46
|
+
import { registerCreateCanvas } from './create-canvas.js';
|
|
47
|
+
import { registerListSchemaViolations } from './list-schema-violations.js';
|
|
48
|
+
/**
|
|
49
|
+
* MCP tool name → registrar. Source of truth for which tool name a registrar
|
|
50
|
+
* binds to (the registrars themselves don't expose the name in a typed shape,
|
|
51
|
+
* so the entries are kept in sync by hand).
|
|
52
|
+
*
|
|
53
|
+
* Bot keys (`Bearer nmu_bot_*`) get a filtered subset based on the manifest
|
|
54
|
+
* fetched at startup. User keys still get every tool.
|
|
55
|
+
*/
|
|
56
|
+
const TOOL_REGISTRARS = {
|
|
57
|
+
naumu_list_graphs: registerListGraphs,
|
|
58
|
+
naumu_get_schema: registerGetSchema,
|
|
59
|
+
naumu_update_schema: registerUpdateSchema,
|
|
60
|
+
naumu_add_node_type: registerAddNodeType,
|
|
61
|
+
naumu_add_connection: registerAddConnection,
|
|
62
|
+
naumu_add_attribute: registerAddAttribute,
|
|
63
|
+
naumu_text_search: registerTextSearch,
|
|
64
|
+
naumu_semantic_search: registerSemanticSearch,
|
|
65
|
+
naumu_filter: registerFilter,
|
|
66
|
+
naumu_get_node: registerGetNode,
|
|
67
|
+
naumu_get_view: registerGetView,
|
|
68
|
+
naumu_list_view_nodes: registerListViewNodes,
|
|
69
|
+
naumu_add_node: registerAddNode,
|
|
70
|
+
naumu_update_node: registerUpdateNode,
|
|
71
|
+
naumu_add_edge: registerAddEdge,
|
|
72
|
+
naumu_remove_node: registerRemoveNode,
|
|
73
|
+
naumu_remove_edge: registerRemoveEdge,
|
|
74
|
+
naumu_ask: registerAsk,
|
|
75
|
+
naumu_get_ai_thread: registerGetAiThread,
|
|
76
|
+
naumu_traverse: registerTraverse,
|
|
77
|
+
naumu_list_canvases: registerListCanvases,
|
|
78
|
+
naumu_get_canvas_elements: registerGetCanvasElements,
|
|
79
|
+
naumu_get_canvas_image: registerGetCanvasImage,
|
|
80
|
+
naumu_post_message: registerPostMessage,
|
|
81
|
+
naumu_read_thread: registerReadThread,
|
|
82
|
+
naumu_ask_naumu: registerAskNaumu,
|
|
83
|
+
naumu_whoami: registerWhoami,
|
|
84
|
+
naumu_list_threads: registerListThreads,
|
|
85
|
+
naumu_get_thread: registerGetThread,
|
|
86
|
+
naumu_create_thread: registerCreateThread,
|
|
87
|
+
naumu_request_attachment_upload: registerRequestAttachmentUpload,
|
|
88
|
+
naumu_add_reaction: registerAddReaction,
|
|
89
|
+
naumu_remove_reaction: registerRemoveReaction,
|
|
90
|
+
naumu_typing: registerNaumuTyping,
|
|
91
|
+
naumu_note_read: registerNoteRead,
|
|
92
|
+
naumu_note_append: registerNoteAppend,
|
|
93
|
+
naumu_note_insert: registerNoteInsert,
|
|
94
|
+
naumu_note_replace_section: registerNoteReplaceSection,
|
|
95
|
+
naumu_note_delete_section: registerNoteDeleteSection,
|
|
96
|
+
naumu_note_replace: registerNoteReplace,
|
|
97
|
+
naumu_note_find_replace: registerNoteFindReplace,
|
|
98
|
+
naumu_canvas_add_element: registerCanvasAddElement,
|
|
99
|
+
naumu_canvas_update_element: registerCanvasUpdateElement,
|
|
100
|
+
naumu_canvas_remove_element: registerCanvasRemoveElement,
|
|
101
|
+
naumu_create_note: registerCreateNote,
|
|
102
|
+
naumu_create_canvas: registerCreateCanvas,
|
|
103
|
+
naumu_list_schema_violations: registerListSchemaViolations,
|
|
104
|
+
};
|
|
105
|
+
/**
|
|
106
|
+
* Register every MCP tool. Used by user-key sessions, where no per-Identity
|
|
107
|
+
* filtering applies.
|
|
108
|
+
*/
|
|
17
109
|
export function registerAllTools(server, client) {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
110
|
+
for (const registrar of Object.values(TOOL_REGISTRARS)) {
|
|
111
|
+
registrar(server, client);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Register only the named subset — the bot-key path. Names not present in the
|
|
116
|
+
* registrar map are silently skipped (forward compat with future tools the
|
|
117
|
+
* backend manifest may include).
|
|
118
|
+
*/
|
|
119
|
+
export function registerNamedTools(server, client, toolNames) {
|
|
120
|
+
const registered = [];
|
|
121
|
+
const skipped = [];
|
|
122
|
+
for (const name of toolNames) {
|
|
123
|
+
const registrar = TOOL_REGISTRARS[name];
|
|
124
|
+
if (registrar) {
|
|
125
|
+
registrar(server, client);
|
|
126
|
+
registered.push(name);
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
skipped.push(name);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
if (skipped.length) {
|
|
133
|
+
console.error(`[mcp] skipped ${skipped.length} tool(s) absent from this build: ${skipped.join(', ')}`);
|
|
134
|
+
}
|
|
135
|
+
console.error(`[mcp] registered ${registered.length} tool(s) for bot key`);
|
|
34
136
|
}
|
|
35
137
|
//# sourceMappingURL=index.js.map
|