@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.
Files changed (50) hide show
  1. package/README.md +64 -0
  2. package/dist/client.d.ts +12 -0
  3. package/dist/client.js +109 -0
  4. package/dist/client.js.map +1 -0
  5. package/dist/errors.d.ts +4 -0
  6. package/dist/errors.js +9 -0
  7. package/dist/errors.js.map +1 -0
  8. package/dist/index.d.ts +2 -0
  9. package/dist/index.js +21 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/tools/add-edge.d.ts +3 -0
  12. package/dist/tools/add-edge.js +25 -0
  13. package/dist/tools/add-edge.js.map +1 -0
  14. package/dist/tools/add-node.d.ts +3 -0
  15. package/dist/tools/add-node.js +25 -0
  16. package/dist/tools/add-node.js.map +1 -0
  17. package/dist/tools/ask.d.ts +3 -0
  18. package/dist/tools/ask.js +24 -0
  19. package/dist/tools/ask.js.map +1 -0
  20. package/dist/tools/get-ai-thread.d.ts +3 -0
  21. package/dist/tools/get-ai-thread.js +16 -0
  22. package/dist/tools/get-ai-thread.js.map +1 -0
  23. package/dist/tools/get-node.d.ts +3 -0
  24. package/dist/tools/get-node.js +17 -0
  25. package/dist/tools/get-node.js.map +1 -0
  26. package/dist/tools/get-schema.d.ts +3 -0
  27. package/dist/tools/get-schema.js +16 -0
  28. package/dist/tools/get-schema.js.map +1 -0
  29. package/dist/tools/index.d.ts +3 -0
  30. package/dist/tools/index.js +27 -0
  31. package/dist/tools/index.js.map +1 -0
  32. package/dist/tools/list-graphs.d.ts +3 -0
  33. package/dist/tools/list-graphs.js +14 -0
  34. package/dist/tools/list-graphs.js.map +1 -0
  35. package/dist/tools/remove-edge.d.ts +3 -0
  36. package/dist/tools/remove-edge.js +23 -0
  37. package/dist/tools/remove-edge.js.map +1 -0
  38. package/dist/tools/remove-node.d.ts +3 -0
  39. package/dist/tools/remove-node.js +17 -0
  40. package/dist/tools/remove-node.js.map +1 -0
  41. package/dist/tools/search.d.ts +3 -0
  42. package/dist/tools/search.js +18 -0
  43. package/dist/tools/search.js.map +1 -0
  44. package/dist/tools/semantic-search.d.ts +3 -0
  45. package/dist/tools/semantic-search.js +34 -0
  46. package/dist/tools/semantic-search.js.map +1 -0
  47. package/dist/tools/update-node.d.ts +3 -0
  48. package/dist/tools/update-node.js +71 -0
  49. package/dist/tools/update-node.js.map +1 -0
  50. 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
@@ -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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"}
@@ -0,0 +1,4 @@
1
+ export declare class NaumuApiError extends Error {
2
+ readonly status: number;
3
+ constructor(status: number, message: string);
4
+ }
package/dist/errors.js ADDED
@@ -0,0 +1,9 @@
1
+ export class NaumuApiError extends Error {
2
+ status;
3
+ constructor(status, message) {
4
+ super(message);
5
+ this.status = status;
6
+ this.name = 'NaumuApiError';
7
+ }
8
+ }
9
+ //# sourceMappingURL=errors.js.map
@@ -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"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
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,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { NaumuClient } from '../client.js';
3
+ export declare function registerAddEdge(server: McpServer, client: NaumuClient): void;
@@ -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,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { NaumuClient } from '../client.js';
3
+ export declare function registerAddNode(server: McpServer, client: NaumuClient): void;
@@ -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,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { NaumuClient } from '../client.js';
3
+ export declare function registerAsk(server: McpServer, client: NaumuClient): void;
@@ -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,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { NaumuClient } from '../client.js';
3
+ export declare function registerGetAiThread(server: McpServer, client: NaumuClient): void;
@@ -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,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { NaumuClient } from '../client.js';
3
+ export declare function registerGetNode(server: McpServer, client: NaumuClient): void;
@@ -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,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { NaumuClient } from '../client.js';
3
+ export declare function registerGetSchema(server: McpServer, client: NaumuClient): void;
@@ -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,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { NaumuClient } from '../client.js';
3
+ export declare function registerAllTools(server: McpServer, client: NaumuClient): void;
@@ -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,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { NaumuClient } from '../client.js';
3
+ export declare function registerListGraphs(server: McpServer, client: NaumuClient): void;
@@ -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,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { NaumuClient } from '../client.js';
3
+ export declare function registerRemoveEdge(server: McpServer, client: NaumuClient): void;
@@ -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,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { NaumuClient } from '../client.js';
3
+ export declare function registerRemoveNode(server: McpServer, client: NaumuClient): void;
@@ -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,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { NaumuClient } from '../client.js';
3
+ export declare function registerSearch(server: McpServer, client: NaumuClient): void;
@@ -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,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { NaumuClient } from '../client.js';
3
+ export declare function registerSemanticSearch(server: McpServer, client: NaumuClient): void;
@@ -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,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { NaumuClient } from '../client.js';
3
+ export declare function registerUpdateNode(server: McpServer, client: NaumuClient): void;
@@ -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
+ }