@naumu/mcp 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +64 -0
- package/dist/client.d.ts +12 -0
- package/dist/client.js +109 -0
- package/dist/client.js.map +1 -0
- package/dist/errors.d.ts +4 -0
- package/dist/errors.js +9 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/add-edge.d.ts +3 -0
- package/dist/tools/add-edge.js +25 -0
- package/dist/tools/add-edge.js.map +1 -0
- package/dist/tools/add-node.d.ts +3 -0
- package/dist/tools/add-node.js +25 -0
- package/dist/tools/add-node.js.map +1 -0
- package/dist/tools/ask.d.ts +3 -0
- package/dist/tools/ask.js +24 -0
- package/dist/tools/ask.js.map +1 -0
- package/dist/tools/get-ai-thread.d.ts +3 -0
- package/dist/tools/get-ai-thread.js +16 -0
- package/dist/tools/get-ai-thread.js.map +1 -0
- package/dist/tools/get-node.d.ts +3 -0
- package/dist/tools/get-node.js +17 -0
- package/dist/tools/get-node.js.map +1 -0
- package/dist/tools/get-schema.d.ts +3 -0
- package/dist/tools/get-schema.js +16 -0
- package/dist/tools/get-schema.js.map +1 -0
- package/dist/tools/index.d.ts +3 -0
- package/dist/tools/index.js +27 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/list-graphs.d.ts +3 -0
- package/dist/tools/list-graphs.js +14 -0
- package/dist/tools/list-graphs.js.map +1 -0
- package/dist/tools/remove-edge.d.ts +3 -0
- package/dist/tools/remove-edge.js +23 -0
- package/dist/tools/remove-edge.js.map +1 -0
- package/dist/tools/remove-node.d.ts +3 -0
- package/dist/tools/remove-node.js +17 -0
- package/dist/tools/remove-node.js.map +1 -0
- package/dist/tools/search.d.ts +3 -0
- package/dist/tools/search.js +18 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/semantic-search.d.ts +3 -0
- package/dist/tools/semantic-search.js +34 -0
- package/dist/tools/semantic-search.js.map +1 -0
- package/dist/tools/update-node.d.ts +3 -0
- package/dist/tools/update-node.js +71 -0
- package/dist/tools/update-node.js.map +1 -0
- package/package.json +50 -0
package/README.md
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# naumu-mcp-server
|
|
2
|
+
|
|
3
|
+
MCP server for [Naumu](https://naumu.app) — access your knowledge graph from Claude Code, Cursor, and other AI coding agents.
|
|
4
|
+
|
|
5
|
+
## Setup
|
|
6
|
+
|
|
7
|
+
### 1. Get an API key
|
|
8
|
+
|
|
9
|
+
Generate an API key from your Naumu account settings.
|
|
10
|
+
|
|
11
|
+
### 2. Configure your IDE
|
|
12
|
+
|
|
13
|
+
#### Claude Code
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
claude mcp add naumu -s user \
|
|
17
|
+
-e NAUMU_API_KEY=nmu_your_key_here \
|
|
18
|
+
-- npx -y naumu-mcp-server
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
#### Cursor
|
|
22
|
+
|
|
23
|
+
Add to your Cursor MCP settings:
|
|
24
|
+
|
|
25
|
+
```json
|
|
26
|
+
{
|
|
27
|
+
"mcpServers": {
|
|
28
|
+
"naumu": {
|
|
29
|
+
"command": "npx",
|
|
30
|
+
"args": ["-y", "naumu-mcp-server"],
|
|
31
|
+
"env": {
|
|
32
|
+
"NAUMU_API_KEY": "nmu_your_key_here"
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Available tools
|
|
40
|
+
|
|
41
|
+
| Tool | Description |
|
|
42
|
+
|------|-------------|
|
|
43
|
+
| `naumu_list_graphs` | List all knowledge graphs you have access to |
|
|
44
|
+
| `naumu_get_schema` | Get the schema (node types, relationships) for a graph |
|
|
45
|
+
| `naumu_search` | Search nodes by text query |
|
|
46
|
+
| `naumu_get_node` | Get a node with all its properties and connections |
|
|
47
|
+
| `naumu_add_node` | Create a new node |
|
|
48
|
+
| `naumu_update_node` | Update an existing node |
|
|
49
|
+
| `naumu_add_edge` | Create a relationship between two nodes |
|
|
50
|
+
| `naumu_remove_node` | Delete a node and its connections |
|
|
51
|
+
| `naumu_remove_edge` | Delete a relationship |
|
|
52
|
+
| `naumu_ask` | Ask the Naumu AI agent a question about your graph |
|
|
53
|
+
| `naumu_get_ai_thread` | Retrieve messages from a previous AI conversation |
|
|
54
|
+
|
|
55
|
+
## Environment variables
|
|
56
|
+
|
|
57
|
+
| Variable | Required | Default | Description |
|
|
58
|
+
|----------|----------|---------|-------------|
|
|
59
|
+
| `NAUMU_API_KEY` | Yes | — | Your API key (starts with `nmu_`) |
|
|
60
|
+
| `NAUMU_API_URL` | No | `https://naumu.ai` | Naumu API base URL (only change for self-hosted) |
|
|
61
|
+
|
|
62
|
+
## License
|
|
63
|
+
|
|
64
|
+
MIT
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare class NaumuClient {
|
|
2
|
+
private baseUrl;
|
|
3
|
+
private apiKey;
|
|
4
|
+
constructor(baseUrl: string, apiKey: string);
|
|
5
|
+
private headers;
|
|
6
|
+
private handleResponse;
|
|
7
|
+
get(path: string): Promise<unknown>;
|
|
8
|
+
post(path: string, body?: unknown): Promise<unknown>;
|
|
9
|
+
patch(path: string, body: unknown): Promise<unknown>;
|
|
10
|
+
del(path: string, body?: unknown): Promise<unknown>;
|
|
11
|
+
postStream(path: string, body: unknown): Promise<string>;
|
|
12
|
+
}
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { NaumuApiError } from './errors.js';
|
|
2
|
+
export class NaumuClient {
|
|
3
|
+
baseUrl;
|
|
4
|
+
apiKey;
|
|
5
|
+
constructor(baseUrl, apiKey) {
|
|
6
|
+
this.baseUrl = baseUrl.replace(/\/+$/, '');
|
|
7
|
+
this.apiKey = apiKey;
|
|
8
|
+
}
|
|
9
|
+
headers() {
|
|
10
|
+
return {
|
|
11
|
+
'Authorization': `Bearer ${this.apiKey}`,
|
|
12
|
+
'Content-Type': 'application/json',
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
async handleResponse(res) {
|
|
16
|
+
if (!res.ok) {
|
|
17
|
+
const text = await res.text().catch(() => 'Unknown error');
|
|
18
|
+
let message;
|
|
19
|
+
try {
|
|
20
|
+
const json = JSON.parse(text);
|
|
21
|
+
message = json.message || text;
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
message = text;
|
|
25
|
+
}
|
|
26
|
+
throw new NaumuApiError(res.status, message);
|
|
27
|
+
}
|
|
28
|
+
return res.json();
|
|
29
|
+
}
|
|
30
|
+
async get(path) {
|
|
31
|
+
const res = await fetch(`${this.baseUrl}${path}`, {
|
|
32
|
+
method: 'GET',
|
|
33
|
+
headers: this.headers(),
|
|
34
|
+
});
|
|
35
|
+
return this.handleResponse(res);
|
|
36
|
+
}
|
|
37
|
+
async post(path, body) {
|
|
38
|
+
const res = await fetch(`${this.baseUrl}${path}`, {
|
|
39
|
+
method: 'POST',
|
|
40
|
+
headers: this.headers(),
|
|
41
|
+
body: body !== undefined ? JSON.stringify(body) : undefined,
|
|
42
|
+
});
|
|
43
|
+
return this.handleResponse(res);
|
|
44
|
+
}
|
|
45
|
+
async patch(path, body) {
|
|
46
|
+
const res = await fetch(`${this.baseUrl}${path}`, {
|
|
47
|
+
method: 'PATCH',
|
|
48
|
+
headers: this.headers(),
|
|
49
|
+
body: JSON.stringify(body),
|
|
50
|
+
});
|
|
51
|
+
return this.handleResponse(res);
|
|
52
|
+
}
|
|
53
|
+
async del(path, body) {
|
|
54
|
+
const res = await fetch(`${this.baseUrl}${path}`, {
|
|
55
|
+
method: 'DELETE',
|
|
56
|
+
headers: this.headers(),
|
|
57
|
+
body: body !== undefined ? JSON.stringify(body) : undefined,
|
|
58
|
+
});
|
|
59
|
+
return this.handleResponse(res);
|
|
60
|
+
}
|
|
61
|
+
async postStream(path, body) {
|
|
62
|
+
const res = await fetch(`${this.baseUrl}${path}`, {
|
|
63
|
+
method: 'POST',
|
|
64
|
+
headers: this.headers(),
|
|
65
|
+
body: JSON.stringify(body),
|
|
66
|
+
});
|
|
67
|
+
if (!res.ok) {
|
|
68
|
+
const text = await res.text().catch(() => 'Unknown error');
|
|
69
|
+
throw new NaumuApiError(res.status, text);
|
|
70
|
+
}
|
|
71
|
+
if (!res.body) {
|
|
72
|
+
throw new NaumuApiError(500, 'No response body');
|
|
73
|
+
}
|
|
74
|
+
const reader = res.body.getReader();
|
|
75
|
+
const decoder = new TextDecoder();
|
|
76
|
+
let buffer = '';
|
|
77
|
+
let lastChunk = null;
|
|
78
|
+
while (true) {
|
|
79
|
+
const { done, value } = await reader.read();
|
|
80
|
+
if (done)
|
|
81
|
+
break;
|
|
82
|
+
buffer += decoder.decode(value, { stream: true });
|
|
83
|
+
const lines = buffer.split('\n');
|
|
84
|
+
buffer = lines.pop() || '';
|
|
85
|
+
for (const line of lines) {
|
|
86
|
+
const trimmed = line.trim();
|
|
87
|
+
if (!trimmed)
|
|
88
|
+
continue;
|
|
89
|
+
try {
|
|
90
|
+
lastChunk = JSON.parse(trimmed);
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
// Skip non-JSON lines
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// Process remaining buffer
|
|
98
|
+
if (buffer.trim()) {
|
|
99
|
+
try {
|
|
100
|
+
lastChunk = JSON.parse(buffer.trim());
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
// Skip
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return JSON.stringify(lastChunk);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts
ADDED
package/dist/errors.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,aAAc,SAAQ,KAAK;IAEtB;IADjB,YACiB,MAAc,EAC9B,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,WAAM,GAAN,MAAM,CAAQ;QAI9B,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC7B,CAAC;CACD"}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
3
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
4
|
+
import { NaumuClient } from './client.js';
|
|
5
|
+
import { registerAllTools } from './tools/index.js';
|
|
6
|
+
const DEFAULT_API_URL = 'https://naumu.ai';
|
|
7
|
+
const apiUrl = (process.env.NAUMU_API_URL || DEFAULT_API_URL).replace(/\/api\/?$/, '');
|
|
8
|
+
const apiKey = process.env.NAUMU_API_KEY;
|
|
9
|
+
if (!apiKey) {
|
|
10
|
+
console.error('Missing required environment variable: NAUMU_API_KEY');
|
|
11
|
+
process.exit(1);
|
|
12
|
+
}
|
|
13
|
+
const client = new NaumuClient(apiUrl, apiKey);
|
|
14
|
+
const server = new McpServer({
|
|
15
|
+
name: 'naumu',
|
|
16
|
+
version: '0.1.0',
|
|
17
|
+
});
|
|
18
|
+
registerAllTools(server, client);
|
|
19
|
+
const transport = new StdioServerTransport();
|
|
20
|
+
await server.connect(transport);
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,MAAM,eAAe,GAAG,kBAAkB,CAAC;AAE3C,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,eAAe,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;AACvF,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;AAEzC,IAAI,CAAC,MAAM,EAAE,CAAC;IACb,OAAO,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;IACtE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC;AAED,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAE/C,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC5B,IAAI,EAAE,OAAO;IACb,OAAO,EAAE,OAAO;CAChB,CAAC,CAAC;AAEH,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEjC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export function registerAddEdge(server, client) {
|
|
3
|
+
server.registerTool('naumu_add_edge', {
|
|
4
|
+
title: 'Add Edge',
|
|
5
|
+
description: 'Create a relationship (edge) between two nodes in the graph.',
|
|
6
|
+
inputSchema: z.object({
|
|
7
|
+
graphId: z.string().describe('The graph ID'),
|
|
8
|
+
source: z.string().describe('Source node ID'),
|
|
9
|
+
target: z.string().describe('Target node ID'),
|
|
10
|
+
label: z.string().describe('Relationship type (e.g. RELATES_TO, SOLVES, TRACKS)'),
|
|
11
|
+
isParent: z.boolean().optional().describe('Whether this is a parent relationship'),
|
|
12
|
+
}),
|
|
13
|
+
}, async ({ graphId, source, target, label, isParent }) => {
|
|
14
|
+
const data = await client.post(`/api/graphs/${graphId}/edges`, {
|
|
15
|
+
source,
|
|
16
|
+
target,
|
|
17
|
+
label,
|
|
18
|
+
isParent: isParent || false,
|
|
19
|
+
});
|
|
20
|
+
return {
|
|
21
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
22
|
+
};
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=add-edge.js.map
|
|
@@ -0,0 +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,8DAA8D;QAC3E,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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export function registerAddNode(server, client) {
|
|
3
|
+
server.registerTool('naumu_add_node', {
|
|
4
|
+
title: 'Add Node',
|
|
5
|
+
description: 'Create a new node in the knowledge graph. Requires a label (display name) and type (schema type). Optionally provide content and custom attributes.',
|
|
6
|
+
inputSchema: z.object({
|
|
7
|
+
graphId: z.string().describe('The graph ID'),
|
|
8
|
+
label: z.string().describe('Display name of the node'),
|
|
9
|
+
type: z.string().describe('Node type from the graph schema (e.g. Feature, Pain, Metric)'),
|
|
10
|
+
content: z.string().optional().describe('Rich text content / description'),
|
|
11
|
+
attributes: z.record(z.string(), z.unknown()).optional().describe('Additional key-value attributes'),
|
|
12
|
+
}),
|
|
13
|
+
}, async ({ graphId, label, type, content, attributes }) => {
|
|
14
|
+
const body = { label, type };
|
|
15
|
+
if (content)
|
|
16
|
+
body.content = content;
|
|
17
|
+
if (attributes)
|
|
18
|
+
Object.assign(body, attributes);
|
|
19
|
+
const data = await client.post(`/api/graphs/${graphId}/nodes`, body);
|
|
20
|
+
return {
|
|
21
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
22
|
+
};
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=add-node.js.map
|
|
@@ -0,0 +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,qJAAqJ;QAClK,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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export function registerAsk(server, client) {
|
|
3
|
+
server.registerTool('naumu_ask', {
|
|
4
|
+
title: 'Ask AI',
|
|
5
|
+
description: 'Ask the Naumu AI agent a question about the knowledge graph. The agent can search the graph, analyze data, and suggest changes. Returns the complete AI response after streaming finishes.',
|
|
6
|
+
inputSchema: z.object({
|
|
7
|
+
graphId: z.string().describe('The graph ID to query against'),
|
|
8
|
+
question: z.string().describe('Your question about the knowledge graph'),
|
|
9
|
+
threadId: z.string().optional().describe('Thread ID for follow-up questions (omit for new conversation)'),
|
|
10
|
+
}),
|
|
11
|
+
}, async ({ graphId, question, threadId }) => {
|
|
12
|
+
const body = {
|
|
13
|
+
graphId,
|
|
14
|
+
input: question,
|
|
15
|
+
};
|
|
16
|
+
if (threadId)
|
|
17
|
+
body.threadId = threadId;
|
|
18
|
+
const result = await client.postStream('/api/graph', body);
|
|
19
|
+
return {
|
|
20
|
+
content: [{ type: 'text', text: result }],
|
|
21
|
+
};
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=ask.js.map
|
|
@@ -0,0 +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,EAAE,4LAA4L;QACzM,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACrB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;YAC7D,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;YACxE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+DAA+D,CAAC;SACzG,CAAC;KACF,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE;QACzC,MAAM,IAAI,GAA4B;YACrC,OAAO;YACP,KAAK,EAAE,QAAQ;SACf,CAAC;QACF,IAAI,QAAQ;YAAE,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAEvC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;QAC3D,OAAO;YACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;SAClD,CAAC;IACH,CAAC,CACD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export function registerGetAiThread(server, client) {
|
|
3
|
+
server.registerTool('naumu_get_ai_thread', {
|
|
4
|
+
title: 'Get AI Thread',
|
|
5
|
+
description: 'Retrieve messages from a previous AI conversation thread. Useful for reviewing past AI interactions.',
|
|
6
|
+
inputSchema: z.object({
|
|
7
|
+
threadId: z.string().describe('The thread ID'),
|
|
8
|
+
}),
|
|
9
|
+
}, async ({ threadId }) => {
|
|
10
|
+
const data = await client.get(`/api/threads/${threadId}/messages`);
|
|
11
|
+
return {
|
|
12
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
13
|
+
};
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=get-ai-thread.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-ai-thread.js","sourceRoot":"","sources":["../../src/tools/get-ai-thread.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,UAAU,mBAAmB,CAAC,MAAiB,EAAE,MAAmB;IACzE,MAAM,CAAC,YAAY,CAClB,qBAAqB,EACrB;QACC,KAAK,EAAE,eAAe;QACtB,WAAW,EAAE,sGAAsG;QACnH,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,gBAAgB,QAAQ,WAAW,CAAC,CAAC;QACnE,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 registerGetNode(server, client) {
|
|
3
|
+
server.registerTool('naumu_get_node', {
|
|
4
|
+
title: 'Get Node',
|
|
5
|
+
description: 'Get a single node with all its properties and connections (incoming and outgoing edges).',
|
|
6
|
+
inputSchema: z.object({
|
|
7
|
+
graphId: z.string().describe('The graph ID'),
|
|
8
|
+
nodeId: z.string().describe('The node ID'),
|
|
9
|
+
}),
|
|
10
|
+
}, async ({ graphId, nodeId }) => {
|
|
11
|
+
const data = await client.get(`/api/graphs/${graphId}/nodes/${nodeId}`);
|
|
12
|
+
return {
|
|
13
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
14
|
+
};
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=get-node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-node.js","sourceRoot":"","sources":["../../src/tools/get-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,0FAA0F;QACvG,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,aAAa,CAAC;SAC1C,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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export function registerGetSchema(server, client) {
|
|
3
|
+
server.registerTool('naumu_get_schema', {
|
|
4
|
+
title: 'Get Graph Schema',
|
|
5
|
+
description: 'Get the schema definition for a knowledge graph. Returns node types, their attributes, and allowed relationships.',
|
|
6
|
+
inputSchema: z.object({
|
|
7
|
+
graphId: z.string().describe('The graph ID'),
|
|
8
|
+
}),
|
|
9
|
+
}, async ({ graphId }) => {
|
|
10
|
+
const data = await client.get(`/api/graphs/${graphId}/schema`);
|
|
11
|
+
return {
|
|
12
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
13
|
+
};
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=get-schema.js.map
|
|
@@ -0,0 +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;AAIxB,MAAM,UAAU,iBAAiB,CAAC,MAAiB,EAAE,MAAmB;IACvE,MAAM,CAAC,YAAY,CAClB,kBAAkB,EAClB;QACC,KAAK,EAAE,kBAAkB;QACzB,WAAW,EAAE,mHAAmH;QAChI,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,MAAM,MAAM,CAAC,GAAG,CAAC,eAAe,OAAO,SAAS,CAAC,CAAC;QAC/D,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,27 @@
|
|
|
1
|
+
import { registerListGraphs } from './list-graphs.js';
|
|
2
|
+
import { registerGetSchema } from './get-schema.js';
|
|
3
|
+
import { registerSearch } from './search.js';
|
|
4
|
+
import { registerSemanticSearch } from './semantic-search.js';
|
|
5
|
+
import { registerGetNode } from './get-node.js';
|
|
6
|
+
import { registerAddNode } from './add-node.js';
|
|
7
|
+
import { registerUpdateNode } from './update-node.js';
|
|
8
|
+
import { registerAddEdge } from './add-edge.js';
|
|
9
|
+
import { registerRemoveNode } from './remove-node.js';
|
|
10
|
+
import { registerRemoveEdge } from './remove-edge.js';
|
|
11
|
+
import { registerAsk } from './ask.js';
|
|
12
|
+
import { registerGetAiThread } from './get-ai-thread.js';
|
|
13
|
+
export function registerAllTools(server, client) {
|
|
14
|
+
registerListGraphs(server, client);
|
|
15
|
+
registerGetSchema(server, client);
|
|
16
|
+
registerSearch(server, client);
|
|
17
|
+
registerSemanticSearch(server, client);
|
|
18
|
+
registerGetNode(server, client);
|
|
19
|
+
registerAddNode(server, client);
|
|
20
|
+
registerUpdateNode(server, client);
|
|
21
|
+
registerAddEdge(server, client);
|
|
22
|
+
registerRemoveNode(server, client);
|
|
23
|
+
registerRemoveEdge(server, client);
|
|
24
|
+
registerAsk(server, client);
|
|
25
|
+
registerGetAiThread(server, client);
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +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,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,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;AAEzD,MAAM,UAAU,gBAAgB,CAAC,MAAiB,EAAE,MAAmB;IACtE,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,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;AACrC,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export function registerListGraphs(server, client) {
|
|
3
|
+
server.registerTool('naumu_list_graphs', {
|
|
4
|
+
title: 'List Graphs',
|
|
5
|
+
description: 'List all knowledge graphs (spaces) the authenticated user has access to. Returns graph IDs, names, and roles.',
|
|
6
|
+
inputSchema: z.object({}),
|
|
7
|
+
}, async () => {
|
|
8
|
+
const data = await client.get('/api/graphs');
|
|
9
|
+
return {
|
|
10
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
11
|
+
};
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=list-graphs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-graphs.js","sourceRoot":"","sources":["../../src/tools/list-graphs.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,+GAA+G;QAC5H,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;KACzB,EACD,KAAK,IAAI,EAAE;QACV,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC7C,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,23 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export function registerRemoveEdge(server, client) {
|
|
3
|
+
server.registerTool('naumu_remove_edge', {
|
|
4
|
+
title: 'Remove Edge',
|
|
5
|
+
description: 'Delete a relationship (edge) between two nodes.',
|
|
6
|
+
inputSchema: z.object({
|
|
7
|
+
graphId: z.string().describe('The graph ID'),
|
|
8
|
+
source: z.string().describe('Source node ID'),
|
|
9
|
+
target: z.string().describe('Target node ID'),
|
|
10
|
+
relation: z.string().describe('Relationship type to delete'),
|
|
11
|
+
}),
|
|
12
|
+
}, async ({ graphId, source, target, relation }) => {
|
|
13
|
+
const data = await client.del(`/api/graphs/${graphId}/edges`, {
|
|
14
|
+
source,
|
|
15
|
+
target,
|
|
16
|
+
relation,
|
|
17
|
+
});
|
|
18
|
+
return {
|
|
19
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
20
|
+
};
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=remove-edge.js.map
|
|
@@ -0,0 +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,iDAAiD;QAC9D,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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export function registerRemoveNode(server, client) {
|
|
3
|
+
server.registerTool('naumu_remove_node', {
|
|
4
|
+
title: 'Remove Node',
|
|
5
|
+
description: 'Delete a node and all its connections from the knowledge graph.',
|
|
6
|
+
inputSchema: z.object({
|
|
7
|
+
graphId: z.string().describe('The graph ID'),
|
|
8
|
+
nodeId: z.string().describe('The node ID to delete'),
|
|
9
|
+
}),
|
|
10
|
+
}, async ({ graphId, nodeId }) => {
|
|
11
|
+
const data = await client.del(`/api/graphs/${graphId}/nodes/${nodeId}`);
|
|
12
|
+
return {
|
|
13
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
14
|
+
};
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=remove-node.js.map
|
|
@@ -0,0 +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,iEAAiE;QAC9E,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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export function registerSearch(server, client) {
|
|
3
|
+
server.registerTool('naumu_search', {
|
|
4
|
+
title: 'Search Graph',
|
|
5
|
+
description: 'Simple text pattern search over node labels, content, and types. For smarter, context-aware results use `naumu_semantic_search` instead.',
|
|
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=search.js.map
|
|
@@ -0,0 +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,0IAA0I;QACvJ,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,34 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export function registerSemanticSearch(server, client) {
|
|
3
|
+
server.registerTool('naumu_semantic_search', {
|
|
4
|
+
title: 'Semantic Search Graph',
|
|
5
|
+
description: 'Semantic search over a knowledge graph using AI embeddings. **This is the recommended search tool** — it understands meaning and context, not just exact text matches. Use `naumu_search` only when you need literal/exact string matching. Returns nodes ranked by semantic similarity with their 1-hop and 2-hop neighbors for rich context. Tip: expand your query with synonyms and related terms for best results.',
|
|
6
|
+
inputSchema: z.object({
|
|
7
|
+
graphId: z.string().describe('The graph ID'),
|
|
8
|
+
query: z
|
|
9
|
+
.string()
|
|
10
|
+
.describe('Search query text. For best results, expand with synonyms and related terms (e.g. "authentication login sign-in auth" instead of just "auth")'),
|
|
11
|
+
limit: z
|
|
12
|
+
.number()
|
|
13
|
+
.optional()
|
|
14
|
+
.default(100)
|
|
15
|
+
.describe('Max results to return (default 100, max 200)'),
|
|
16
|
+
nodeTypes: z
|
|
17
|
+
.array(z.string())
|
|
18
|
+
.optional()
|
|
19
|
+
.describe('Filter to specific node types (e.g. ["Feature", "Pain"])'),
|
|
20
|
+
}),
|
|
21
|
+
}, async ({ graphId, query, limit, nodeTypes }) => {
|
|
22
|
+
const params = new URLSearchParams();
|
|
23
|
+
params.set('q', query);
|
|
24
|
+
if (limit)
|
|
25
|
+
params.set('limit', String(limit));
|
|
26
|
+
if (nodeTypes?.length)
|
|
27
|
+
params.set('nodeTypes', nodeTypes.join(','));
|
|
28
|
+
const data = await client.get(`/api/graphs/${graphId}/search/semantic?${params.toString()}`);
|
|
29
|
+
return {
|
|
30
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
31
|
+
};
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=semantic-search.js.map
|
|
@@ -0,0 +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,yZAAyZ;QAC1Z,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,71 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
function getValidAttributes(schema, nodeType) {
|
|
3
|
+
const attrs = new Map();
|
|
4
|
+
const nodeDef = schema.nodes.find((n) => n.type === nodeType);
|
|
5
|
+
if (nodeDef?.attributes) {
|
|
6
|
+
for (const attr of nodeDef.attributes) {
|
|
7
|
+
attrs.set(attr.name.toLowerCase(), nodeDef.attributes);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
return attrs;
|
|
11
|
+
}
|
|
12
|
+
export function registerUpdateNode(server, client) {
|
|
13
|
+
server.registerTool('naumu_update_node', {
|
|
14
|
+
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 (e.g., status, size).',
|
|
16
|
+
inputSchema: z.object({
|
|
17
|
+
graphId: z.string().describe('The graph ID'),
|
|
18
|
+
nodeId: z.string().describe('The node ID to update'),
|
|
19
|
+
label: z.string().optional().describe('New display name'),
|
|
20
|
+
type: z.string().optional().describe('New node type'),
|
|
21
|
+
content: z.string().optional().describe('New content / description'),
|
|
22
|
+
attributes: z
|
|
23
|
+
.record(z.string(), z.unknown())
|
|
24
|
+
.optional()
|
|
25
|
+
.describe('Schema-defined attributes to set (e.g., {"status": "Done", "size": "M"})'),
|
|
26
|
+
}),
|
|
27
|
+
}, async ({ graphId, nodeId, label, type, content, attributes }) => {
|
|
28
|
+
const body = {};
|
|
29
|
+
if (label !== undefined)
|
|
30
|
+
body.label = label;
|
|
31
|
+
if (type !== undefined)
|
|
32
|
+
body.type = type;
|
|
33
|
+
if (content !== undefined)
|
|
34
|
+
body.content = content;
|
|
35
|
+
if (attributes && Object.keys(attributes).length > 0) {
|
|
36
|
+
// Fetch the node to get its type, then validate attributes against schema
|
|
37
|
+
const node = (await client.get(`/api/graphs/${graphId}/nodes/${nodeId}`));
|
|
38
|
+
const nodeType = (type ?? node.type);
|
|
39
|
+
const schemaRes = (await client.get(`/api/graphs/${graphId}/schema`));
|
|
40
|
+
const schema = JSON.parse(schemaRes.definition);
|
|
41
|
+
const validAttrs = getValidAttributes(schema, nodeType);
|
|
42
|
+
const invalidKeys = [];
|
|
43
|
+
for (const [key, val] of Object.entries(attributes)) {
|
|
44
|
+
const normalized = key.toLowerCase();
|
|
45
|
+
if (!validAttrs.has(normalized)) {
|
|
46
|
+
invalidKeys.push(key);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
body[normalized] = val;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
if (invalidKeys.length > 0) {
|
|
53
|
+
const validList = [...validAttrs.keys()].join(', ');
|
|
54
|
+
return {
|
|
55
|
+
content: [
|
|
56
|
+
{
|
|
57
|
+
type: 'text',
|
|
58
|
+
text: `Error: Unknown attributes [${invalidKeys.join(', ')}] for node type "${nodeType}". Valid attributes: ${validList || 'none'}`,
|
|
59
|
+
},
|
|
60
|
+
],
|
|
61
|
+
isError: true,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
const data = await client.patch(`/api/graphs/${graphId}/nodes/${nodeId}`, body);
|
|
66
|
+
return {
|
|
67
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
68
|
+
};
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=update-node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-node.js","sourceRoot":"","sources":["../../src/tools/update-node.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@naumu/mcp",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "MCP server for Naumu – access your knowledge graph from Claude Code, Cursor, and other AI coding agents",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "Naumu <hello@naumu.app>",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/naumu-app/naumu",
|
|
10
|
+
"directory": "packages/mcp"
|
|
11
|
+
},
|
|
12
|
+
"homepage": "https://naumu.app",
|
|
13
|
+
"bugs": "https://github.com/naumu-app/naumu/issues",
|
|
14
|
+
"keywords": [
|
|
15
|
+
"mcp",
|
|
16
|
+
"model-context-protocol",
|
|
17
|
+
"knowledge-graph",
|
|
18
|
+
"naumu",
|
|
19
|
+
"claude",
|
|
20
|
+
"cursor",
|
|
21
|
+
"ai-agent",
|
|
22
|
+
"knowledge-management"
|
|
23
|
+
],
|
|
24
|
+
"bin": {
|
|
25
|
+
"naumu-mcp": "./dist/index.js"
|
|
26
|
+
},
|
|
27
|
+
"main": "dist/index.js",
|
|
28
|
+
"type": "module",
|
|
29
|
+
"files": [
|
|
30
|
+
"dist",
|
|
31
|
+
"README.md"
|
|
32
|
+
],
|
|
33
|
+
"engines": {
|
|
34
|
+
"node": ">=18"
|
|
35
|
+
},
|
|
36
|
+
"scripts": {
|
|
37
|
+
"build": "tsc",
|
|
38
|
+
"dev": "tsc --watch",
|
|
39
|
+
"start": "node dist/index.js",
|
|
40
|
+
"prepublishOnly": "tsc"
|
|
41
|
+
},
|
|
42
|
+
"dependencies": {
|
|
43
|
+
"@modelcontextprotocol/sdk": "^1.12.1",
|
|
44
|
+
"zod": "^3.25.23"
|
|
45
|
+
},
|
|
46
|
+
"devDependencies": {
|
|
47
|
+
"@types/node": "*",
|
|
48
|
+
"typescript": "*"
|
|
49
|
+
}
|
|
50
|
+
}
|