@naumu/mcp 0.1.3 → 0.1.4
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 +3 -1
- package/dist/tools/add-edge.js +1 -1
- package/dist/tools/add-edge.js.map +1 -1
- package/dist/tools/add-node.js +1 -1
- package/dist/tools/add-node.js.map +1 -1
- package/dist/tools/ask.js +1 -1
- package/dist/tools/ask.js.map +1 -1
- package/dist/tools/filter.d.ts +3 -0
- package/dist/tools/filter.js +54 -0
- package/dist/tools/filter.js.map +1 -0
- package/dist/tools/get-schema.js +27 -3
- package/dist/tools/get-schema.js.map +1 -1
- package/dist/tools/index.js +6 -2
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/remove-edge.js +1 -1
- package/dist/tools/remove-edge.js.map +1 -1
- package/dist/tools/remove-node.js +1 -1
- package/dist/tools/remove-node.js.map +1 -1
- package/dist/tools/search.js +1 -1
- package/dist/tools/search.js.map +1 -1
- package/dist/tools/semantic-search.js +1 -1
- package/dist/tools/semantic-search.js.map +1 -1
- package/dist/tools/text-search.d.ts +3 -0
- package/dist/tools/text-search.js +18 -0
- package/dist/tools/text-search.js.map +1 -0
- package/dist/tools/traverse.d.ts +3 -0
- package/dist/tools/traverse.js +19 -0
- package/dist/tools/traverse.js.map +1 -0
- package/dist/tools/update-node.js +22 -15
- package/dist/tools/update-node.js.map +1 -1
- package/package.json +5 -1
package/README.md
CHANGED
|
@@ -42,7 +42,9 @@ Add to your Cursor MCP settings:
|
|
|
42
42
|
|------|-------------|
|
|
43
43
|
| `naumu_list_graphs` | List all knowledge graphs you have access to |
|
|
44
44
|
| `naumu_get_schema` | Get the schema (node types, relationships) for a graph |
|
|
45
|
-
| `
|
|
45
|
+
| `naumu_text_search` | Search nodes by exact text match on labels and content |
|
|
46
|
+
| `naumu_semantic_search` | Search nodes by meaning using AI embeddings |
|
|
47
|
+
| `naumu_filter` | Filter nodes by type and attributes with deterministic results |
|
|
46
48
|
| `naumu_get_node` | Get a node with all its properties and connections |
|
|
47
49
|
| `naumu_add_node` | Create a new node |
|
|
48
50
|
| `naumu_update_node` | Update an existing node |
|
package/dist/tools/add-edge.js
CHANGED
|
@@ -2,7 +2,7 @@ import { z } from 'zod';
|
|
|
2
2
|
export function registerAddEdge(server, client) {
|
|
3
3
|
server.registerTool('naumu_add_edge', {
|
|
4
4
|
title: 'Add Edge',
|
|
5
|
-
description: '
|
|
5
|
+
description: 'Low-level tool: create a single relationship (edge) between two nodes. **Prefer `naumu_ask`** for adding new knowledge — it automatically discovers and creates all relevant connections. Use this only when you need precise control over a specific relationship.',
|
|
6
6
|
inputSchema: z.object({
|
|
7
7
|
graphId: z.string().describe('The graph ID'),
|
|
8
8
|
source: z.string().describe('Source node ID'),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add-edge.js","sourceRoot":"","sources":["../../src/tools/add-edge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,UAAU,eAAe,CAAC,MAAiB,EAAE,MAAmB;IACrE,MAAM,CAAC,YAAY,CAClB,gBAAgB,EAChB;QACC,KAAK,EAAE,UAAU;QACjB,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"add-edge.js","sourceRoot":"","sources":["../../src/tools/add-edge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,UAAU,eAAe,CAAC,MAAiB,EAAE,MAAmB;IACrE,MAAM,CAAC,YAAY,CAClB,gBAAgB,EAChB;QACC,KAAK,EAAE,UAAU;QACjB,WAAW,EAAE,qQAAqQ;QAClR,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACrB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;YAC5C,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YAC7C,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YAC7C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qDAAqD,CAAC;YACjF,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;SAClF,CAAC;KACF,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE;QACtD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,eAAe,OAAO,QAAQ,EAAE;YAC9D,MAAM;YACN,MAAM;YACN,KAAK;YACL,QAAQ,EAAE,QAAQ,IAAI,KAAK;SAC3B,CAAC,CAAC;QACH,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"}
|
package/dist/tools/add-node.js
CHANGED
|
@@ -2,7 +2,7 @@ import { z } from 'zod';
|
|
|
2
2
|
export function registerAddNode(server, client) {
|
|
3
3
|
server.registerTool('naumu_add_node', {
|
|
4
4
|
title: 'Add Node',
|
|
5
|
-
description: '
|
|
5
|
+
description: 'Low-level tool: create a single node in the knowledge graph. Warning: this creates an isolated node with no connections — the whole point of a knowledge graph is interconnectedness. **Prefer `naumu_ask`** for adding new knowledge, as it automatically discovers and creates relevant connections. Use this only when you need precise, surgical control over node creation.',
|
|
6
6
|
inputSchema: z.object({
|
|
7
7
|
graphId: z.string().describe('The graph ID'),
|
|
8
8
|
label: z.string().describe('Display name of the node'),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add-node.js","sourceRoot":"","sources":["../../src/tools/add-node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,UAAU,eAAe,CAAC,MAAiB,EAAE,MAAmB;IACrE,MAAM,CAAC,YAAY,CAClB,gBAAgB,EAChB;QACC,KAAK,EAAE,UAAU;QACjB,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"add-node.js","sourceRoot":"","sources":["../../src/tools/add-node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,UAAU,eAAe,CAAC,MAAiB,EAAE,MAAmB;IACrE,MAAM,CAAC,YAAY,CAClB,gBAAgB,EAChB;QACC,KAAK,EAAE,UAAU;QACjB,WAAW,EAAE,kXAAkX;QAC/X,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACrB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;YAC5C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;YACtD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8DAA8D,CAAC;YACzF,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;YAC1E,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;SACpG,CAAC;KACF,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE;QACvD,MAAM,IAAI,GAA4B,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QACtD,IAAI,OAAO;YAAE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACpC,IAAI,UAAU;YAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAEhD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,eAAe,OAAO,QAAQ,EAAE,IAAI,CAAC,CAAC;QACrE,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"}
|
package/dist/tools/ask.js
CHANGED
|
@@ -2,7 +2,7 @@ import { z } from 'zod';
|
|
|
2
2
|
export function registerAsk(server, client) {
|
|
3
3
|
server.registerTool('naumu_ask', {
|
|
4
4
|
title: 'Ask AI',
|
|
5
|
-
description: 'Ask the Naumu AI agent
|
|
5
|
+
description: '**Recommended for adding or modifying knowledge.** Ask the Naumu AI agent to make changes to the knowledge graph. The agent understands the full graph context — it automatically discovers connections, places new nodes in the right context, and propagates updates to related nodes. Use this instead of direct CRUD tools (add_node, update_node, etc.) when adding new knowledge or making structural changes. Also useful for asking questions, analyzing data, and exploring the graph. Returns the complete AI response. Use threadId for follow-up questions in the same conversation.',
|
|
6
6
|
inputSchema: z.object({
|
|
7
7
|
graphId: z.string().describe('The graph ID to query against'),
|
|
8
8
|
question: z.string().describe('Your question about the knowledge graph'),
|
package/dist/tools/ask.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ask.js","sourceRoot":"","sources":["../../src/tools/ask.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,UAAU,WAAW,CAAC,MAAiB,EAAE,MAAmB;IACjE,MAAM,CAAC,YAAY,CAClB,WAAW,EACX;QACC,KAAK,EAAE,QAAQ;QACf,WAAW,EACV,
|
|
1
|
+
{"version":3,"file":"ask.js","sourceRoot":"","sources":["../../src/tools/ask.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export function registerFilter(server, client) {
|
|
3
|
+
server.registerTool('naumu_filter', {
|
|
4
|
+
title: 'Filter Graph Nodes',
|
|
5
|
+
description: 'Filter nodes by type and attributes with deterministic, complete results. Use this for structured queries like "all in-progress Tasks" or "Bugs not yet resolved." Unlike search tools, this returns every matching node (up to the limit) — no semantic ranking, no missed results. Results are sorted by sortKey or recency.',
|
|
6
|
+
inputSchema: z.object({
|
|
7
|
+
graphId: z.string().describe('The graph ID'),
|
|
8
|
+
nodeTypes: z
|
|
9
|
+
.array(z.string())
|
|
10
|
+
.optional()
|
|
11
|
+
.describe('Filter to specific node types (e.g. ["Task", "Bug"])'),
|
|
12
|
+
includeAttributes: z
|
|
13
|
+
.record(z.array(z.string()))
|
|
14
|
+
.optional()
|
|
15
|
+
.describe('Only include nodes where attribute matches one of the values. Example: {"Status": ["Todo", "In Progress"]}'),
|
|
16
|
+
excludeAttributes: z
|
|
17
|
+
.record(z.array(z.string()))
|
|
18
|
+
.optional()
|
|
19
|
+
.describe('Exclude nodes where attribute matches any of the values. Example: {"Status": ["Done", "Wont do"]}'),
|
|
20
|
+
sortBy: z
|
|
21
|
+
.enum(['sortKey', 'updatedAt', 'label'])
|
|
22
|
+
.optional()
|
|
23
|
+
.default('sortKey')
|
|
24
|
+
.describe('Sort order: "sortKey" (default), "updatedAt" (most recent first), or "label" (alphabetical)'),
|
|
25
|
+
limit: z
|
|
26
|
+
.number()
|
|
27
|
+
.optional()
|
|
28
|
+
.default(50)
|
|
29
|
+
.describe('Max results to return (default 50, max 200)'),
|
|
30
|
+
}),
|
|
31
|
+
}, async ({ graphId, nodeTypes, includeAttributes, excludeAttributes, sortBy, limit }) => {
|
|
32
|
+
const params = new URLSearchParams();
|
|
33
|
+
if (nodeTypes?.length)
|
|
34
|
+
params.set('nodeTypes', nodeTypes.join(','));
|
|
35
|
+
if (sortBy)
|
|
36
|
+
params.set('sortBy', sortBy);
|
|
37
|
+
if (limit)
|
|
38
|
+
params.set('limit', String(limit));
|
|
39
|
+
// Serialize attribute filters: "Status:Todo,In Progress;Priority:High"
|
|
40
|
+
if (includeAttributes) {
|
|
41
|
+
const parts = Object.entries(includeAttributes).map(([k, v]) => `${k}:${v.join(',')}`);
|
|
42
|
+
params.set('includeAttributes', parts.join(';'));
|
|
43
|
+
}
|
|
44
|
+
if (excludeAttributes) {
|
|
45
|
+
const parts = Object.entries(excludeAttributes).map(([k, v]) => `${k}:${v.join(',')}`);
|
|
46
|
+
params.set('excludeAttributes', parts.join(';'));
|
|
47
|
+
}
|
|
48
|
+
const data = await client.get(`/api/graphs/${graphId}/filter?${params.toString()}`);
|
|
49
|
+
return {
|
|
50
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
51
|
+
};
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter.js","sourceRoot":"","sources":["../../src/tools/filter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,UAAU,cAAc,CAAC,MAAiB,EAAE,MAAmB;IACpE,MAAM,CAAC,YAAY,CAClB,cAAc,EACd;QACC,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EACV,gUAAgU;QACjU,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACrB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;YAC5C,SAAS,EAAE,CAAC;iBACV,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;iBACjB,QAAQ,EAAE;iBACV,QAAQ,CAAC,sDAAsD,CAAC;YAClE,iBAAiB,EAAE,CAAC;iBAClB,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;iBAC3B,QAAQ,EAAE;iBACV,QAAQ,CACR,4GAA4G,CAC5G;YACF,iBAAiB,EAAE,CAAC;iBAClB,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;iBAC3B,QAAQ,EAAE;iBACV,QAAQ,CACR,mGAAmG,CACnG;YACF,MAAM,EAAE,CAAC;iBACP,IAAI,CAAC,CAAC,SAAS,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;iBACvC,QAAQ,EAAE;iBACV,OAAO,CAAC,SAAS,CAAC;iBAClB,QAAQ,CAAC,6FAA6F,CAAC;YACzG,KAAK,EAAE,CAAC;iBACN,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,OAAO,CAAC,EAAE,CAAC;iBACX,QAAQ,CAAC,6CAA6C,CAAC;SACzD,CAAC;KACF,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE;QACrF,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QACrC,IAAI,SAAS,EAAE,MAAM;YAAE,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACpE,IAAI,MAAM;YAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACzC,IAAI,KAAK;YAAE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAE9C,uEAAuE;QACvE,IAAI,iBAAiB,EAAE,CAAC;YACvB,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACvF,MAAM,CAAC,GAAG,CAAC,mBAAmB,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAClD,CAAC;QACD,IAAI,iBAAiB,EAAE,CAAC;YACvB,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACvF,MAAM,CAAC,GAAG,CAAC,mBAAmB,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAClD,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,eAAe,OAAO,WAAW,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACpF,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"}
|
package/dist/tools/get-schema.js
CHANGED
|
@@ -1,15 +1,39 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
/** Format raw schema into a structured, LLM-friendly representation. */
|
|
3
|
+
function formatSchema(schema) {
|
|
4
|
+
return {
|
|
5
|
+
description: schema.description ?? null,
|
|
6
|
+
types: schema.nodes.map((node) => {
|
|
7
|
+
const result = { type: node.type };
|
|
8
|
+
if (node.connections.parent) {
|
|
9
|
+
result.parent = `${node.connections.parent.relation} → ${node.connections.parent.target_node}`;
|
|
10
|
+
}
|
|
11
|
+
const connections = [
|
|
12
|
+
...node.connections.required.map((c) => `${c.relation} → ${c.target_node} (required)`),
|
|
13
|
+
...node.connections.suggested.map((c) => `${c.relation} → ${c.target_node}`),
|
|
14
|
+
];
|
|
15
|
+
if (connections.length > 0)
|
|
16
|
+
result.connections = connections;
|
|
17
|
+
if (node.attributes && node.attributes.length > 0) {
|
|
18
|
+
result.attributes = Object.fromEntries(node.attributes.map((a) => [a.name, a.values.map((v) => v.label)]));
|
|
19
|
+
}
|
|
20
|
+
return result;
|
|
21
|
+
}),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
2
24
|
export function registerGetSchema(server, client) {
|
|
3
25
|
server.registerTool('naumu_get_schema', {
|
|
4
26
|
title: 'Get Graph Schema',
|
|
5
|
-
description: 'Get the schema definition for a knowledge graph. Returns node types, their attributes, and allowed relationships.',
|
|
27
|
+
description: 'Get the schema definition for a knowledge graph. Returns node types, their allowed attributes (with valid values), and allowed relationships. Use this before updating node attributes to check valid values.',
|
|
6
28
|
inputSchema: z.object({
|
|
7
29
|
graphId: z.string().describe('The graph ID'),
|
|
8
30
|
}),
|
|
9
31
|
}, async ({ graphId }) => {
|
|
10
|
-
const data = await client.get(`/api/graphs/${graphId}/schema`);
|
|
32
|
+
const data = (await client.get(`/api/graphs/${graphId}/schema`));
|
|
33
|
+
const schema = JSON.parse(data.definition);
|
|
34
|
+
const formatted = formatSchema(schema);
|
|
11
35
|
return {
|
|
12
|
-
content: [{ type: 'text', text: JSON.stringify(
|
|
36
|
+
content: [{ type: 'text', text: JSON.stringify(formatted, null, 2) }],
|
|
13
37
|
};
|
|
14
38
|
});
|
|
15
39
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-schema.js","sourceRoot":"","sources":["../../src/tools/get-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"get-schema.js","sourceRoot":"","sources":["../../src/tools/get-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA6BxB,wEAAwE;AACxE,SAAS,YAAY,CAAC,MAAwB;IAC7C,OAAO;QACN,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,IAAI;QACvC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YAChC,MAAM,MAAM,GAA4B,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;YAE5D,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;gBAC7B,MAAM,CAAC,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YAChG,CAAC;YAED,MAAM,WAAW,GAAG;gBACnB,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,QAAQ,MAAM,CAAC,CAAC,WAAW,aAAa,CAAC;gBACtF,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,QAAQ,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;aAC5E,CAAC;YACF,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC;gBAAE,MAAM,CAAC,WAAW,GAAG,WAAW,CAAC;YAE7D,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACnD,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,WAAW,CACrC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAClE,CAAC;YACH,CAAC;YAED,OAAO,MAAM,CAAC;QACf,CAAC,CAAC;KACF,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAiB,EAAE,MAAmB;IACvE,MAAM,CAAC,YAAY,CAClB,kBAAkB,EAClB;QACC,KAAK,EAAE,kBAAkB;QACzB,WAAW,EACV,+MAA+M;QAChN,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACrB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;SAC5C,CAAC;KACF,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;QACrB,MAAM,IAAI,GAAG,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,eAAe,OAAO,SAAS,CAAC,CAA2B,CAAC;QAC3F,MAAM,MAAM,GAAqB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC7D,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QACvC,OAAO;YACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SAC9E,CAAC;IACH,CAAC,CACD,CAAC;AACH,CAAC"}
|
package/dist/tools/index.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { registerListGraphs } from './list-graphs.js';
|
|
2
2
|
import { registerGetSchema } from './get-schema.js';
|
|
3
|
-
import {
|
|
3
|
+
import { registerTextSearch } from './text-search.js';
|
|
4
4
|
import { registerSemanticSearch } from './semantic-search.js';
|
|
5
|
+
import { registerFilter } from './filter.js';
|
|
5
6
|
import { registerGetNode } from './get-node.js';
|
|
6
7
|
import { registerAddNode } from './add-node.js';
|
|
7
8
|
import { registerUpdateNode } from './update-node.js';
|
|
@@ -10,11 +11,13 @@ import { registerRemoveNode } from './remove-node.js';
|
|
|
10
11
|
import { registerRemoveEdge } from './remove-edge.js';
|
|
11
12
|
import { registerAsk } from './ask.js';
|
|
12
13
|
import { registerGetAiThread } from './get-ai-thread.js';
|
|
14
|
+
import { registerTraverse } from './traverse.js';
|
|
13
15
|
export function registerAllTools(server, client) {
|
|
14
16
|
registerListGraphs(server, client);
|
|
15
17
|
registerGetSchema(server, client);
|
|
16
|
-
|
|
18
|
+
registerTextSearch(server, client);
|
|
17
19
|
registerSemanticSearch(server, client);
|
|
20
|
+
registerFilter(server, client);
|
|
18
21
|
registerGetNode(server, client);
|
|
19
22
|
registerAddNode(server, client);
|
|
20
23
|
registerUpdateNode(server, client);
|
|
@@ -23,5 +26,6 @@ export function registerAllTools(server, client) {
|
|
|
23
26
|
registerRemoveEdge(server, client);
|
|
24
27
|
registerAsk(server, client);
|
|
25
28
|
registerGetAiThread(server, client);
|
|
29
|
+
registerTraverse(server, client);
|
|
26
30
|
}
|
|
27
31
|
//# sourceMappingURL=index.js.map
|
package/dist/tools/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEjD,MAAM,UAAU,gBAAgB,CAAC,MAAiB,EAAE,MAAmB;IACtE,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAClC,CAAC"}
|
|
@@ -2,7 +2,7 @@ import { z } from 'zod';
|
|
|
2
2
|
export function registerRemoveEdge(server, client) {
|
|
3
3
|
server.registerTool('naumu_remove_edge', {
|
|
4
4
|
title: 'Remove Edge',
|
|
5
|
-
description: '
|
|
5
|
+
description: 'Low-level tool: delete a specific relationship (edge) between two nodes. **Prefer `naumu_ask`** for structural changes — it understands the broader graph context. Use this only when you need precise control over a specific relationship removal.',
|
|
6
6
|
inputSchema: z.object({
|
|
7
7
|
graphId: z.string().describe('The graph ID'),
|
|
8
8
|
source: z.string().describe('Source node ID'),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remove-edge.js","sourceRoot":"","sources":["../../src/tools/remove-edge.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,EAAE,
|
|
1
|
+
{"version":3,"file":"remove-edge.js","sourceRoot":"","sources":["../../src/tools/remove-edge.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,EAAE,sPAAsP;QACnQ,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACrB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;YAC5C,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YAC7C,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YAC7C,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;SAC5D,CAAC;KACF,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC/C,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,eAAe,OAAO,QAAQ,EAAE;YAC7D,MAAM;YACN,MAAM;YACN,QAAQ;SACR,CAAC,CAAC;QACH,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"}
|
|
@@ -2,7 +2,7 @@ import { z } from 'zod';
|
|
|
2
2
|
export function registerRemoveNode(server, client) {
|
|
3
3
|
server.registerTool('naumu_remove_node', {
|
|
4
4
|
title: 'Remove Node',
|
|
5
|
-
description: '
|
|
5
|
+
description: 'Low-level tool: delete a node and all its connections from the knowledge graph. This is a destructive operation. **Prefer `naumu_ask`** for removing knowledge — it understands the impact on the broader graph and can handle cascading changes. Use this only when you need precise, surgical deletion.',
|
|
6
6
|
inputSchema: z.object({
|
|
7
7
|
graphId: z.string().describe('The graph ID'),
|
|
8
8
|
nodeId: z.string().describe('The node ID to delete'),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remove-node.js","sourceRoot":"","sources":["../../src/tools/remove-node.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,EAAE,
|
|
1
|
+
{"version":3,"file":"remove-node.js","sourceRoot":"","sources":["../../src/tools/remove-node.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,EAAE,2SAA2S;QACxT,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACrB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;YAC5C,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;SACpD,CAAC;KACF,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE;QAC7B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,eAAe,OAAO,UAAU,MAAM,EAAE,CAAC,CAAC;QACxE,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"}
|
package/dist/tools/search.js
CHANGED
|
@@ -2,7 +2,7 @@ import { z } from 'zod';
|
|
|
2
2
|
export function registerSearch(server, client) {
|
|
3
3
|
server.registerTool('naumu_search', {
|
|
4
4
|
title: 'Search Graph',
|
|
5
|
-
description: '
|
|
5
|
+
description: 'Exact text pattern search over node labels, content, and types. Only use this when you know the exact name or keyword you\'re looking for. For exploratory searches, discovering related nodes, or when you\'re unsure of exact wording, use `naumu_semantic_search` instead — it understands meaning and returns richer context.',
|
|
6
6
|
inputSchema: z.object({
|
|
7
7
|
graphId: z.string().describe('The graph ID'),
|
|
8
8
|
query: z.string().describe('Search query text'),
|
package/dist/tools/search.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,UAAU,cAAc,CAAC,MAAiB,EAAE,MAAmB;IACpE,MAAM,CAAC,YAAY,CAClB,cAAc,EACd;QACC,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,UAAU,cAAc,CAAC,MAAiB,EAAE,MAAmB;IACpE,MAAM,CAAC,YAAY,CAClB,cAAc,EACd;QACC,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE,mUAAmU;QAChV,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACrB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;YAC5C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;YAC/C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,6CAA6C,CAAC;SAChG,CAAC;KACF,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;QACnC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,eAAe,OAAO,aAAa,kBAAkB,CAAC,KAAK,CAAC,UAAU,KAAK,EAAE,CAAC,CAAC;QAC7G,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"}
|
|
@@ -2,7 +2,7 @@ import { z } from 'zod';
|
|
|
2
2
|
export function registerSemanticSearch(server, client) {
|
|
3
3
|
server.registerTool('naumu_semantic_search', {
|
|
4
4
|
title: 'Semantic Search Graph',
|
|
5
|
-
description: 'Semantic search over a knowledge graph using AI embeddings.
|
|
5
|
+
description: 'Semantic search over a knowledge graph using AI embeddings. Understands meaning and context, not just exact text matches. Use `naumu_text_search` for literal/exact string matching. Use `naumu_filter` for structured queries by type and attributes (e.g. "all in-progress Tasks"). Returns nodes ranked by semantic similarity. Tip: expand your query with synonyms and related terms for best results.',
|
|
6
6
|
inputSchema: z.object({
|
|
7
7
|
graphId: z.string().describe('The graph ID'),
|
|
8
8
|
query: z
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"semantic-search.js","sourceRoot":"","sources":["../../src/tools/semantic-search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,UAAU,sBAAsB,CAAC,MAAiB,EAAE,MAAmB;IAC5E,MAAM,CAAC,YAAY,CAClB,uBAAuB,EACvB;QACC,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EACV,
|
|
1
|
+
{"version":3,"file":"semantic-search.js","sourceRoot":"","sources":["../../src/tools/semantic-search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,UAAU,sBAAsB,CAAC,MAAiB,EAAE,MAAmB;IAC5E,MAAM,CAAC,YAAY,CAClB,uBAAuB,EACvB;QACC,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EACV,6YAA6Y;QAC9Y,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACrB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;YAC5C,KAAK,EAAE,CAAC;iBACN,MAAM,EAAE;iBACR,QAAQ,CACR,+IAA+I,CAC/I;YACF,KAAK,EAAE,CAAC;iBACN,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,OAAO,CAAC,GAAG,CAAC;iBACZ,QAAQ,CAAC,8CAA8C,CAAC;YAC1D,SAAS,EAAE,CAAC;iBACV,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;iBACjB,QAAQ,EAAE;iBACV,QAAQ,CAAC,0DAA0D,CAAC;SACtE,CAAC;KACF,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE;QAC9C,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACvB,IAAI,KAAK;YAAE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9C,IAAI,SAAS,EAAE,MAAM;YAAE,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAEpE,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,eAAe,OAAO,oBAAoB,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC7F,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,18 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export function registerTextSearch(server, client) {
|
|
3
|
+
server.registerTool('naumu_text_search', {
|
|
4
|
+
title: 'Text Search Graph',
|
|
5
|
+
description: "Exact text pattern search over node labels, content, and types. Use this when you know the exact name or keyword you're looking for. For meaning-based discovery, use `naumu_semantic_search`. For structured filtering by type/attributes, use `naumu_filter`.",
|
|
6
|
+
inputSchema: z.object({
|
|
7
|
+
graphId: z.string().describe('The graph ID'),
|
|
8
|
+
query: z.string().describe('Search query text'),
|
|
9
|
+
limit: z.number().optional().default(20).describe('Max results to return (default 20, max 200)'),
|
|
10
|
+
}),
|
|
11
|
+
}, async ({ graphId, query, limit }) => {
|
|
12
|
+
const data = await client.get(`/api/graphs/${graphId}/search?q=${encodeURIComponent(query)}&limit=${limit}`);
|
|
13
|
+
return {
|
|
14
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
15
|
+
};
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=text-search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-search.js","sourceRoot":"","sources":["../../src/tools/text-search.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,mBAAmB;QAC1B,WAAW,EACV,iQAAiQ;QAClQ,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACrB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;YAC5C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;YAC/C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,6CAA6C,CAAC;SAChG,CAAC;KACF,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;QACnC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,eAAe,OAAO,aAAa,kBAAkB,CAAC,KAAK,CAAC,UAAU,KAAK,EAAE,CAAC,CAAC;QAC7G,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,19 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export function registerTraverse(server, client) {
|
|
3
|
+
server.registerTool('naumu_traverse', {
|
|
4
|
+
title: 'Traverse Knowledge Graph',
|
|
5
|
+
description: 'Query the graph structurally using natural language. A sub-LLM generates and executes Cypher queries. Use for structural questions like "tasks without a parent", "features with most tasks", "orphan nodes", "everything within 2 hops of X", or temporal filters like "nodes updated this week". For meaning-based search, use `naumu_semantic_search` instead.',
|
|
6
|
+
inputSchema: z.object({
|
|
7
|
+
graphId: z.string().describe('The graph ID'),
|
|
8
|
+
query: z
|
|
9
|
+
.string()
|
|
10
|
+
.describe('Natural language description of the structural pattern to find (e.g. "tasks without a parent", "features that don\'t resolve any pain")'),
|
|
11
|
+
}),
|
|
12
|
+
}, async ({ graphId, query }) => {
|
|
13
|
+
const data = await client.post(`/api/graphs/${graphId}/traverse`, { query });
|
|
14
|
+
return {
|
|
15
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
16
|
+
};
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=traverse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"traverse.js","sourceRoot":"","sources":["../../src/tools/traverse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,UAAU,gBAAgB,CAAC,MAAiB,EAAE,MAAmB;IACtE,MAAM,CAAC,YAAY,CAClB,gBAAgB,EAChB;QACC,KAAK,EAAE,0BAA0B;QACjC,WAAW,EACV,mWAAmW;QACpW,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACrB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;YAC5C,KAAK,EAAE,CAAC;iBACN,MAAM,EAAE;iBACR,QAAQ,CACR,yIAAyI,CACzI;SACF,CAAC;KACF,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE;QAC5B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,eAAe,OAAO,WAAW,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAC7E,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"}
|
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
/** Build a map of lowercase attribute name → valid values for a given node type. */
|
|
3
|
+
function getAttributeMap(schema, nodeType) {
|
|
4
|
+
const map = new Map();
|
|
4
5
|
const nodeDef = schema.nodes.find((n) => n.type === nodeType);
|
|
5
6
|
if (nodeDef?.attributes) {
|
|
6
7
|
for (const attr of nodeDef.attributes) {
|
|
7
|
-
|
|
8
|
+
map.set(attr.name.toLowerCase(), attr);
|
|
8
9
|
}
|
|
9
10
|
}
|
|
10
|
-
return
|
|
11
|
+
return map;
|
|
11
12
|
}
|
|
12
13
|
export function registerUpdateNode(server, client) {
|
|
13
14
|
server.registerTool('naumu_update_node', {
|
|
14
15
|
title: 'Update Node',
|
|
15
|
-
description: 'Update properties of an existing node. Only the provided fields will be changed. Attribute keys must match the schema for the node type
|
|
16
|
+
description: 'Update properties of an existing node. Only the provided fields will be changed. Good for simple attribute changes like setting a status or priority. For content or structural changes, consider `naumu_ask` instead — it understands the full graph context and can propagate updates to related nodes. Attribute keys AND values must match the schema for the node type. Use naumu_get_schema to check valid attribute names and values before updating.',
|
|
16
17
|
inputSchema: z.object({
|
|
17
18
|
graphId: z.string().describe('The graph ID'),
|
|
18
19
|
nodeId: z.string().describe('The node ID to update'),
|
|
@@ -22,7 +23,7 @@ export function registerUpdateNode(server, client) {
|
|
|
22
23
|
attributes: z
|
|
23
24
|
.record(z.string(), z.unknown())
|
|
24
25
|
.optional()
|
|
25
|
-
.describe('Schema-defined attributes to set (e.g., {"
|
|
26
|
+
.describe('Schema-defined attributes to set (e.g., {"Status": "In Progress"})'),
|
|
26
27
|
}),
|
|
27
28
|
}, async ({ graphId, nodeId, label, type, content, attributes }) => {
|
|
28
29
|
const body = {};
|
|
@@ -38,24 +39,30 @@ export function registerUpdateNode(server, client) {
|
|
|
38
39
|
const nodeType = (type ?? node.type);
|
|
39
40
|
const schemaRes = (await client.get(`/api/graphs/${graphId}/schema`));
|
|
40
41
|
const schema = JSON.parse(schemaRes.definition);
|
|
41
|
-
const
|
|
42
|
-
const
|
|
42
|
+
const attrMap = getAttributeMap(schema, nodeType);
|
|
43
|
+
const errors = [];
|
|
43
44
|
for (const [key, val] of Object.entries(attributes)) {
|
|
44
45
|
const normalized = key.toLowerCase();
|
|
45
|
-
|
|
46
|
-
|
|
46
|
+
const schemaDef = attrMap.get(normalized);
|
|
47
|
+
if (!schemaDef) {
|
|
48
|
+
const validNames = [...attrMap.values()].map((a) => a.name);
|
|
49
|
+
errors.push(`Unknown attribute "${key}" for type "${nodeType}". Valid attributes: ${validNames.length > 0 ? validNames.join(', ') : 'none'}.`);
|
|
50
|
+
continue;
|
|
47
51
|
}
|
|
48
|
-
|
|
49
|
-
|
|
52
|
+
// Validate value against allowed values
|
|
53
|
+
const validValues = schemaDef.values.map((v) => v.label);
|
|
54
|
+
if (typeof val === 'string' && validValues.length > 0 && !validValues.includes(val)) {
|
|
55
|
+
errors.push(`Invalid value "${val}" for attribute "${schemaDef.name}" on type "${nodeType}". Valid values: ${validValues.join(', ')}.`);
|
|
56
|
+
continue;
|
|
50
57
|
}
|
|
58
|
+
body[normalized] = val;
|
|
51
59
|
}
|
|
52
|
-
if (
|
|
53
|
-
const validList = [...validAttrs.keys()].join(', ');
|
|
60
|
+
if (errors.length > 0) {
|
|
54
61
|
return {
|
|
55
62
|
content: [
|
|
56
63
|
{
|
|
57
64
|
type: 'text',
|
|
58
|
-
text: `
|
|
65
|
+
text: `Attribute validation failed:\n${errors.join('\n')}\n\nUse naumu_get_schema to check valid attributes and values for this node type.`,
|
|
59
66
|
},
|
|
60
67
|
],
|
|
61
68
|
isError: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-node.js","sourceRoot":"","sources":["../../src/tools/update-node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"update-node.js","sourceRoot":"","sources":["../../src/tools/update-node.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@naumu/mcp",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.4",
|
|
4
4
|
"description": "MCP server for Naumu – access your knowledge graph from Claude Code, Cursor, and other AI coding agents",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Naumu <hello@naumu.ai>",
|
|
@@ -37,6 +37,7 @@
|
|
|
37
37
|
"build": "tsc",
|
|
38
38
|
"dev": "tsc --watch",
|
|
39
39
|
"start": "node dist/index.js",
|
|
40
|
+
"test": "NODE_OPTIONS=--experimental-vm-modules jest",
|
|
40
41
|
"prepublishOnly": "tsc"
|
|
41
42
|
},
|
|
42
43
|
"dependencies": {
|
|
@@ -44,7 +45,10 @@
|
|
|
44
45
|
"zod": "^3.25.23"
|
|
45
46
|
},
|
|
46
47
|
"devDependencies": {
|
|
48
|
+
"@types/jest": "^30.0.0",
|
|
47
49
|
"@types/node": "*",
|
|
50
|
+
"jest": "^30.3.0",
|
|
51
|
+
"ts-jest": "^29.4.6",
|
|
48
52
|
"typescript": "*"
|
|
49
53
|
}
|
|
50
54
|
}
|