@apart-tech/intelligence-mcp 0.2.0 → 0.3.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/dist/index.js CHANGED
@@ -2,19 +2,14 @@
2
2
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
3
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
4
  import { z } from "zod";
5
- import { loadConfig, getTenantDb, NodeService, EdgeService, SearchService, ContextService, DomainService, WorkspaceService, createEmbeddingProvider, SINGLE_TENANT_ORG_ID, } from "@apart-tech/intelligence-core";
6
- const config = loadConfig();
7
- const tenant = {
8
- organizationId: config.tenancy.organizationId ?? SINGLE_TENANT_ORG_ID,
9
- };
10
- const db = getTenantDb(config.database.url, tenant);
11
- const embeddings = createEmbeddingProvider(config, { db });
12
- const nodeService = new NodeService(db, embeddings, tenant);
13
- const edgeService = new EdgeService(db);
14
- const searchService = new SearchService(db, embeddings, config, tenant);
15
- const domainService = new DomainService(db, tenant);
16
- const workspaceService = new WorkspaceService(db, tenant);
17
- const contextService = new ContextService(nodeService, edgeService, searchService, config, workspaceService, domainService);
5
+ import { createApiProvider } from "@apart-tech/intelligence-api-client";
6
+ const apiUrl = process.env.APART_API_URL;
7
+ const apiKey = process.env.APART_API_KEY;
8
+ if (!apiUrl || !apiKey) {
9
+ console.error("APART_API_URL and APART_API_KEY environment variables are required");
10
+ process.exit(1);
11
+ }
12
+ const api = createApiProvider({ server: apiUrl, apiKey });
18
13
  const server = new McpServer({
19
14
  name: "apart-intelligence",
20
15
  version: "0.1.0",
@@ -41,26 +36,16 @@ server.tool("search_knowledge", "Hybrid semantic + keyword search across all kno
41
36
  .describe("Workspace slug — auto-applies domain/type/tag filters"),
42
37
  }, async ({ query, limit, types, include_drafts, domain_slugs, workspace }) => {
43
38
  let domainIds;
44
- let resolvedTypes = types;
45
- // Apply workspace filters (explicit params override workspace defaults)
46
- if (workspace) {
47
- const filter = await workspaceService.resolveFilter(workspace, (slugs) => domainService.resolveSlugs(slugs));
48
- if (filter) {
49
- if (!domainIds && filter.domainIds)
50
- domainIds = filter.domainIds;
51
- if (!resolvedTypes && filter.types)
52
- resolvedTypes = filter.types;
53
- }
54
- }
55
39
  if (domain_slugs?.length) {
56
- domainIds = await domainService.resolveSlugs(domain_slugs);
40
+ domainIds = await api.domains.resolveSlugs(domain_slugs);
57
41
  }
58
- const results = await searchService.search({
42
+ const results = await api.search.search({
59
43
  query,
60
44
  limit,
61
- types: resolvedTypes,
45
+ types,
62
46
  includeDrafts: include_drafts,
63
47
  domainIds,
48
+ workspace,
64
49
  });
65
50
  return {
66
51
  content: [
@@ -73,15 +58,16 @@ server.tool("search_knowledge", "Hybrid semantic + keyword search across all kno
73
58
  });
74
59
  server.tool("get_node", "Retrieve a specific knowledge node by ID with its edges", {
75
60
  id: z.string().describe("Node UUID"),
76
- }, async ({ id }) => {
77
- const node = await nodeService.getById(id);
61
+ decrypt: z.boolean().optional().describe("Decrypt PII fields if the node contains encrypted PII"),
62
+ }, async ({ id, decrypt: _decrypt }) => {
63
+ const node = await api.nodes.getById(id);
78
64
  if (!node) {
79
65
  return {
80
66
  content: [{ type: "text", text: "Node not found" }],
81
67
  isError: true,
82
68
  };
83
69
  }
84
- const edges = await edgeService.getByNodeId(id);
70
+ const edges = await api.edges.getByNodeId(id);
85
71
  return {
86
72
  content: [
87
73
  {
@@ -108,9 +94,9 @@ server.tool("get_context", "Assemble a context package for a topic — returns r
108
94
  }, async ({ query, max_depth, max_nodes, include_drafts, types, domain_slugs, workspace }) => {
109
95
  let domainIds;
110
96
  if (domain_slugs?.length) {
111
- domainIds = await domainService.resolveSlugs(domain_slugs);
97
+ domainIds = await api.domains.resolveSlugs(domain_slugs);
112
98
  }
113
- const ctx = await contextService.assemble({
99
+ const ctx = await api.search.context({
114
100
  query,
115
101
  maxDepth: max_depth,
116
102
  maxNodes: max_nodes,
@@ -129,26 +115,12 @@ server.tool("get_neighborhood", "Return a node and its N-hop graph neighborhood"
129
115
  id: z.string().describe("Node UUID"),
130
116
  depth: z.number().optional().describe("Hops to traverse (default 1)"),
131
117
  }, async ({ id, depth }) => {
132
- const node = await nodeService.getById(id);
133
- if (!node) {
134
- return {
135
- content: [{ type: "text", text: "Node not found" }],
136
- isError: true,
137
- };
138
- }
139
- const neighborIds = await edgeService.getNeighborIds(id, depth ?? 1);
140
- const neighbors = [];
141
- for (const nId of neighborIds) {
142
- const n = await nodeService.getById(nId);
143
- if (n)
144
- neighbors.push(n);
145
- }
146
- const edges = await edgeService.getByNodeId(id);
118
+ const result = await api.nodes.getNeighborhood(id, depth);
147
119
  return {
148
120
  content: [
149
121
  {
150
122
  type: "text",
151
- text: JSON.stringify({ node, neighbors, edges }, null, 2),
123
+ text: JSON.stringify(result, null, 2),
152
124
  },
153
125
  ],
154
126
  };
@@ -156,7 +128,7 @@ server.tool("get_neighborhood", "Return a node and its N-hop graph neighborhood"
156
128
  server.tool("list_drafts", "List all draft nodes pending curation", {
157
129
  limit: z.number().optional().describe("Max results (default 50)"),
158
130
  }, async ({ limit }) => {
159
- const drafts = await nodeService.listDrafts(limit);
131
+ const drafts = await api.nodes.listDrafts(limit);
160
132
  return {
161
133
  content: [
162
134
  { type: "text", text: JSON.stringify(drafts, null, 2) },
@@ -165,8 +137,8 @@ server.tool("list_drafts", "List all draft nodes pending curation", {
165
137
  });
166
138
  server.tool("list_types", "List all node types and relationship types currently in use", {}, async () => {
167
139
  const [nodeTypes, edgeTypes] = await Promise.all([
168
- nodeService.listTypes(),
169
- edgeService.listRelationshipTypes(),
140
+ api.nodes.listTypes(),
141
+ api.edges.listRelationshipTypes(),
170
142
  ]);
171
143
  return {
172
144
  content: [
@@ -178,7 +150,7 @@ server.tool("list_types", "List all node types and relationship types currently
178
150
  };
179
151
  });
180
152
  server.tool("list_domains", "List the full domain taxonomy tree", {}, async () => {
181
- const tree = await domainService.getTree();
153
+ const tree = await api.domains.getTree();
182
154
  return {
183
155
  content: [
184
156
  { type: "text", text: JSON.stringify(tree, null, 2) },
@@ -186,7 +158,7 @@ server.tool("list_domains", "List the full domain taxonomy tree", {}, async () =
186
158
  };
187
159
  });
188
160
  server.tool("seed_domains", "Seed the default domain taxonomy", {}, async () => {
189
- const result = await domainService.seed();
161
+ const result = await api.domains.seed();
190
162
  return {
191
163
  content: [
192
164
  {
@@ -198,7 +170,7 @@ server.tool("seed_domains", "Seed the default domain taxonomy", {}, async () =>
198
170
  });
199
171
  // ── Workspace Tools ───────────────────────────────────────────────────────
200
172
  server.tool("list_workspaces", "List all workspaces — each defines a filtered view of the knowledge graph for a specific kind of work", {}, async () => {
201
- const list = await workspaceService.list();
173
+ const list = await api.workspaces.list();
202
174
  return {
203
175
  content: [
204
176
  { type: "text", text: JSON.stringify(list, null, 2) },
@@ -208,7 +180,7 @@ server.tool("list_workspaces", "List all workspaces — each defines a filtered
208
180
  server.tool("get_workspace", "Get full workspace definition including filter rules and system prompt", {
209
181
  slug: z.string().describe("Workspace slug"),
210
182
  }, async ({ slug }) => {
211
- const ws = await workspaceService.getBySlug(slug);
183
+ const ws = await api.workspaces.getBySlug(slug);
212
184
  if (!ws) {
213
185
  return {
214
186
  content: [{ type: "text", text: "Workspace not found" }],
@@ -224,7 +196,7 @@ server.tool("get_workspace", "Get full workspace definition including filter rul
224
196
  server.tool("export_workspace", "Export a workspace as a CLAUDE.md-formatted markdown document", {
225
197
  slug: z.string().describe("Workspace slug"),
226
198
  }, async ({ slug }) => {
227
- const md = await workspaceService.exportAsMarkdown(slug);
199
+ const md = await api.workspaces.exportAsMarkdown(slug);
228
200
  if (!md) {
229
201
  return {
230
202
  content: [{ type: "text", text: "Workspace not found" }],
@@ -257,11 +229,11 @@ server.tool("add_node", "Create a new knowledge node (defaults to draft status)"
257
229
  }, async ({ type, title, content, metadata, created_by, domain_slug }) => {
258
230
  let domainId;
259
231
  if (domain_slug) {
260
- const domain = await domainService.getBySlug(domain_slug);
232
+ const domain = await api.domains.getBySlug(domain_slug);
261
233
  if (domain)
262
234
  domainId = domain.id;
263
235
  }
264
- const node = await nodeService.create({
236
+ const node = await api.nodes.create({
265
237
  type,
266
238
  title,
267
239
  content,
@@ -282,7 +254,7 @@ server.tool("update_node", "Update content or metadata of an existing knowledge
282
254
  metadata: z.record(z.unknown()).optional().describe("New metadata"),
283
255
  type: z.string().optional().describe("New node type"),
284
256
  }, async ({ id, title, content, metadata, type }) => {
285
- const node = await nodeService.update(id, { title, content, metadata, type });
257
+ const node = await api.nodes.update(id, { title, content, metadata, type });
286
258
  if (!node) {
287
259
  return {
288
260
  content: [{ type: "text", text: "Node not found" }],
@@ -304,7 +276,7 @@ server.tool("link_nodes", "Create an edge between two knowledge nodes", {
304
276
  weight: z.number().optional().describe("Relevance weight (default 1.0)"),
305
277
  created_by: z.string().optional().describe("Creator identifier"),
306
278
  }, async ({ source_node_id, target_node_id, relationship_type, weight, created_by }) => {
307
- const edge = await edgeService.create({
279
+ const edge = await api.edges.create({
308
280
  sourceNodeId: source_node_id,
309
281
  targetNodeId: target_node_id,
310
282
  relationshipType: relationship_type,
@@ -323,7 +295,7 @@ server.tool("set_status", "Change node status (draft/reviewed/approved/archived)
323
295
  .enum(["draft", "reviewed", "approved", "archived"])
324
296
  .describe("New status"),
325
297
  }, async ({ id, status }) => {
326
- const node = await nodeService.setStatus(id, status);
298
+ const node = await api.nodes.setStatus(id, status);
327
299
  if (!node) {
328
300
  return {
329
301
  content: [{ type: "text", text: "Node not found" }],
@@ -336,6 +308,152 @@ server.tool("set_status", "Change node status (draft/reviewed/approved/archived)
336
308
  ],
337
309
  };
338
310
  });
311
+ // ── Delete Tools ──────────────────────────────────────────────────────────
312
+ server.tool("delete_node", "Delete a knowledge node and all its edges", {
313
+ id: z.string().describe("Node UUID"),
314
+ }, async ({ id }) => {
315
+ const node = await api.nodes.getById(id);
316
+ if (!node) {
317
+ return {
318
+ content: [{ type: "text", text: "Node not found" }],
319
+ isError: true,
320
+ };
321
+ }
322
+ await api.nodes.delete(node.id);
323
+ return {
324
+ content: [{ type: "text", text: `Deleted node "${node.title}" (${node.id})` }],
325
+ };
326
+ });
327
+ server.tool("delete_edge", "Delete an edge between two nodes", {
328
+ id: z.string().describe("Edge UUID"),
329
+ }, async ({ id }) => {
330
+ const deleted = await api.edges.delete(id);
331
+ if (!deleted) {
332
+ return {
333
+ content: [{ type: "text", text: "Edge not found" }],
334
+ isError: true,
335
+ };
336
+ }
337
+ return {
338
+ content: [{ type: "text", text: `Deleted edge ${id}` }],
339
+ };
340
+ });
341
+ // ── Graph Health Tools ────────────────────────────────────────────────────
342
+ server.tool("health_report", "Comprehensive graph health report — node/edge counts, orphans, stale nodes, connected components", {
343
+ stale_days: z.number().optional().describe("Days before a node is considered stale (default 90)"),
344
+ }, async ({ stale_days }) => {
345
+ const report = await api.cleaning.getHealthReport(stale_days ?? 90);
346
+ return {
347
+ content: [{ type: "text", text: JSON.stringify(report, null, 2) }],
348
+ };
349
+ });
350
+ server.tool("validate_edges", "Validate edge integrity — detect self-loops, duplicates, low-relevance connections, contradictions, and rare types", {
351
+ low_relevance_threshold: z.number().optional().describe("Similarity threshold for low-relevance detection (default 0.3)"),
352
+ rare_type_threshold: z.number().optional().describe("Flag relationship types used this many times or fewer (default 1)"),
353
+ }, async ({ low_relevance_threshold, rare_type_threshold }) => {
354
+ const report = await api.cleaning.validate({
355
+ lowRelevanceThreshold: low_relevance_threshold,
356
+ rareTypeThreshold: rare_type_threshold,
357
+ });
358
+ return {
359
+ content: [{ type: "text", text: JSON.stringify(report, null, 2) }],
360
+ };
361
+ });
362
+ server.tool("find_orphans", "Find nodes with no connections to other nodes", {}, async () => {
363
+ const orphans = await api.cleaning.findOrphans();
364
+ return {
365
+ content: [{ type: "text", text: JSON.stringify(orphans, null, 2) }],
366
+ };
367
+ });
368
+ server.tool("find_duplicates", "Find near-duplicate node pairs by embedding cosine similarity", {
369
+ threshold: z.number().optional().describe("Minimum cosine similarity 0-1 (default 0.95)"),
370
+ limit: z.number().optional().describe("Max pairs to return (default 50)"),
371
+ }, async ({ threshold, limit }) => {
372
+ const duplicates = await api.cleaning.findDuplicates(threshold ?? 0.95, limit ?? 50);
373
+ return {
374
+ content: [{ type: "text", text: JSON.stringify(duplicates, null, 2) }],
375
+ };
376
+ });
377
+ server.tool("find_islands", "Detect disconnected clusters (connected components) in the graph, optionally with bridge suggestions", {
378
+ bridges: z.boolean().optional().describe("Include suggested links to bridge islands"),
379
+ max_bridges: z.number().optional().describe("Max bridge suggestions (default 10)"),
380
+ }, async ({ bridges, max_bridges }) => {
381
+ const result = await api.cleaning.findIslands({
382
+ bridges,
383
+ maxBridges: max_bridges,
384
+ });
385
+ return {
386
+ content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
387
+ };
388
+ });
389
+ server.tool("suggest_links", "Suggest missing links between semantically similar but unconnected nodes", {
390
+ node_id: z.string().optional().describe("Node UUID to suggest links for (omit for global scan)"),
391
+ min_similarity: z.number().optional().describe("Minimum cosine similarity (default 0.8 global, 0.7 per-node)"),
392
+ limit: z.number().optional().describe("Max suggestions (default 10 per-node, 20 global)"),
393
+ }, async ({ node_id, min_similarity, limit }) => {
394
+ const suggestions = await api.cleaning.suggestLinks({
395
+ nodeId: node_id,
396
+ minSimilarity: min_similarity,
397
+ limit,
398
+ });
399
+ return {
400
+ content: [{ type: "text", text: JSON.stringify(suggestions, null, 2) }],
401
+ };
402
+ });
403
+ server.tool("analyze_relationship_types", "Analyze relationship type vocabulary and suggest merges for semantically similar types", {
404
+ min_similarity: z.number().optional().describe("Minimum similarity to suggest merge (default 0.7)"),
405
+ }, async ({ min_similarity }) => {
406
+ const report = await api.cleaning.analyzeRelationshipTypes({
407
+ minSimilarity: min_similarity,
408
+ });
409
+ return {
410
+ content: [{ type: "text", text: JSON.stringify(report, null, 2) }],
411
+ };
412
+ });
413
+ server.tool("retype_edges", "Rename all edges of one relationship type to another", {
414
+ from_type: z.string().describe("Current relationship type to rename"),
415
+ to_type: z.string().describe("New relationship type name"),
416
+ }, async ({ from_type, to_type }) => {
417
+ const result = await api.cleaning.retypeMany(from_type, to_type);
418
+ return {
419
+ content: [{ type: "text", text: JSON.stringify({ renamed: result.count, from: from_type, to: to_type }, null, 2) }],
420
+ };
421
+ });
422
+ // ── PII Tools ─────────────────────────────────────────────────────────────
423
+ server.tool("get_pii_config", "Get the current PII detection/encryption policy for this organization", {}, async () => {
424
+ const config = await api.pii.getConfig();
425
+ if (!config) {
426
+ return {
427
+ content: [{ type: "text", text: JSON.stringify({ configured: false }, null, 2) }],
428
+ };
429
+ }
430
+ return {
431
+ content: [{ type: "text", text: JSON.stringify(config, null, 2) }],
432
+ };
433
+ });
434
+ server.tool("test_pii", "Test a text string for PII detection — returns matches with types and positions", {
435
+ text: z.string().describe("Text to scan for PII"),
436
+ }, async ({ text }) => {
437
+ const result = await api.pii.test(text);
438
+ return {
439
+ content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
440
+ };
441
+ });
442
+ // ── Maintenance Tools ─────────────────────────────────────────────────────
443
+ server.tool("re_embed", "Re-generate embeddings for nodes (useful after changing embedding provider/model)", {
444
+ type: z.string().optional().describe("Only re-embed nodes of this type"),
445
+ limit: z.number().optional().describe("Limit to N nodes"),
446
+ dry_run: z.boolean().optional().describe("Show what would be re-embedded without making changes"),
447
+ }, async ({ type, limit, dry_run }) => {
448
+ const result = await api.reEmbed({
449
+ type,
450
+ limit,
451
+ dryRun: dry_run ?? false,
452
+ });
453
+ return {
454
+ content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
455
+ };
456
+ });
339
457
  // ── Start Server ───────────────────────────────────────────────────────────
340
458
  async function main() {
341
459
  const transport = new StdioServerTransport();
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,27 +1,27 @@
1
1
  {
2
2
  "name": "@apart-tech/intelligence-mcp",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "MCP server for Apart Intelligence knowledge graph",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "bin": {
8
8
  "tc-mcp": "dist/index.js"
9
9
  },
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "dev": "tsc --watch",
13
+ "start": "node dist/index.js",
14
+ "lint": "tsc --noEmit",
15
+ "test": "vitest run"
16
+ },
10
17
  "dependencies": {
11
18
  "@modelcontextprotocol/sdk": "^1.8.0",
12
- "zod": "^3.24.0",
13
- "@apart-tech/intelligence-core": "1.0.3"
19
+ "@apart-tech/intelligence-api-client": "workspace:*",
20
+ "zod": "^3.24.0"
14
21
  },
15
22
  "devDependencies": {
16
23
  "@types/node": "^25.5.0",
17
24
  "typescript": "^5.7.0",
18
25
  "vitest": "^3.0.0"
19
- },
20
- "scripts": {
21
- "build": "tsc",
22
- "dev": "tsc --watch",
23
- "start": "node dist/index.js",
24
- "lint": "tsc --noEmit",
25
- "test": "vitest run"
26
26
  }
27
- }
27
+ }
package/src/index.ts CHANGED
@@ -3,39 +3,18 @@
3
3
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
4
4
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
5
5
  import { z } from "zod";
6
- import {
7
- loadConfig,
8
- getTenantDb,
9
- NodeService,
10
- EdgeService,
11
- SearchService,
12
- ContextService,
13
- DomainService,
14
- WorkspaceService,
15
- createEmbeddingProvider,
16
- SINGLE_TENANT_ORG_ID,
17
- } from "@apart-tech/intelligence-core";
18
- import type { NodeStatus, TenantContext } from "@apart-tech/intelligence-core";
19
-
20
- const config = loadConfig();
21
- const tenant: TenantContext = {
22
- organizationId: config.tenancy.organizationId ?? SINGLE_TENANT_ORG_ID,
23
- };
24
- const db = getTenantDb(config.database.url, tenant);
25
- const embeddings = createEmbeddingProvider(config, { db });
26
- const nodeService = new NodeService(db, embeddings, tenant);
27
- const edgeService = new EdgeService(db);
28
- const searchService = new SearchService(db, embeddings, config, tenant);
29
- const domainService = new DomainService(db, tenant);
30
- const workspaceService = new WorkspaceService(db, tenant);
31
- const contextService = new ContextService(
32
- nodeService,
33
- edgeService,
34
- searchService,
35
- config,
36
- workspaceService,
37
- domainService,
38
- );
6
+ import { createApiProvider } from "@apart-tech/intelligence-api-client";
7
+ import type { ServiceProvider, NodeStatus } from "@apart-tech/intelligence-api-client";
8
+
9
+ const apiUrl = process.env.APART_API_URL;
10
+ const apiKey = process.env.APART_API_KEY;
11
+
12
+ if (!apiUrl || !apiKey) {
13
+ console.error("APART_API_URL and APART_API_KEY environment variables are required");
14
+ process.exit(1);
15
+ }
16
+
17
+ const api: ServiceProvider = createApiProvider({ server: apiUrl, apiKey });
39
18
 
40
19
  const server = new McpServer({
41
20
  name: "apart-intelligence",
@@ -69,28 +48,17 @@ server.tool(
69
48
  },
70
49
  async ({ query, limit, types, include_drafts, domain_slugs, workspace }) => {
71
50
  let domainIds: string[] | undefined;
72
- let resolvedTypes = types;
73
-
74
- // Apply workspace filters (explicit params override workspace defaults)
75
- if (workspace) {
76
- const filter = await workspaceService.resolveFilter(workspace, (slugs) =>
77
- domainService.resolveSlugs(slugs),
78
- );
79
- if (filter) {
80
- if (!domainIds && filter.domainIds) domainIds = filter.domainIds;
81
- if (!resolvedTypes && filter.types) resolvedTypes = filter.types;
82
- }
83
- }
84
51
 
85
52
  if (domain_slugs?.length) {
86
- domainIds = await domainService.resolveSlugs(domain_slugs);
53
+ domainIds = await api.domains.resolveSlugs(domain_slugs);
87
54
  }
88
- const results = await searchService.search({
55
+ const results = await api.search.search({
89
56
  query,
90
57
  limit,
91
- types: resolvedTypes,
58
+ types,
92
59
  includeDrafts: include_drafts,
93
60
  domainIds,
61
+ workspace,
94
62
  });
95
63
  return {
96
64
  content: [
@@ -108,16 +76,18 @@ server.tool(
108
76
  "Retrieve a specific knowledge node by ID with its edges",
109
77
  {
110
78
  id: z.string().describe("Node UUID"),
79
+ decrypt: z.boolean().optional().describe("Decrypt PII fields if the node contains encrypted PII"),
111
80
  },
112
- async ({ id }) => {
113
- const node = await nodeService.getById(id);
81
+ async ({ id, decrypt: _decrypt }) => {
82
+ const node = await api.nodes.getById(id);
114
83
  if (!node) {
115
84
  return {
116
85
  content: [{ type: "text" as const, text: "Node not found" }],
117
86
  isError: true,
118
87
  };
119
88
  }
120
- const edges = await edgeService.getByNodeId(id);
89
+ const edges = await api.edges.getByNodeId(id);
90
+
121
91
  return {
122
92
  content: [
123
93
  {
@@ -150,9 +120,9 @@ server.tool(
150
120
  async ({ query, max_depth, max_nodes, include_drafts, types, domain_slugs, workspace }) => {
151
121
  let domainIds: string[] | undefined;
152
122
  if (domain_slugs?.length) {
153
- domainIds = await domainService.resolveSlugs(domain_slugs);
123
+ domainIds = await api.domains.resolveSlugs(domain_slugs);
154
124
  }
155
- const ctx = await contextService.assemble({
125
+ const ctx = await api.search.context({
156
126
  query,
157
127
  maxDepth: max_depth,
158
128
  maxNodes: max_nodes,
@@ -177,25 +147,12 @@ server.tool(
177
147
  depth: z.number().optional().describe("Hops to traverse (default 1)"),
178
148
  },
179
149
  async ({ id, depth }) => {
180
- const node = await nodeService.getById(id);
181
- if (!node) {
182
- return {
183
- content: [{ type: "text" as const, text: "Node not found" }],
184
- isError: true,
185
- };
186
- }
187
- const neighborIds = await edgeService.getNeighborIds(id, depth ?? 1);
188
- const neighbors = [];
189
- for (const nId of neighborIds) {
190
- const n = await nodeService.getById(nId);
191
- if (n) neighbors.push(n);
192
- }
193
- const edges = await edgeService.getByNodeId(id);
150
+ const result = await api.nodes.getNeighborhood(id, depth);
194
151
  return {
195
152
  content: [
196
153
  {
197
154
  type: "text" as const,
198
- text: JSON.stringify({ node, neighbors, edges }, null, 2),
155
+ text: JSON.stringify(result, null, 2),
199
156
  },
200
157
  ],
201
158
  };
@@ -209,7 +166,7 @@ server.tool(
209
166
  limit: z.number().optional().describe("Max results (default 50)"),
210
167
  },
211
168
  async ({ limit }) => {
212
- const drafts = await nodeService.listDrafts(limit);
169
+ const drafts = await api.nodes.listDrafts(limit);
213
170
  return {
214
171
  content: [
215
172
  { type: "text" as const, text: JSON.stringify(drafts, null, 2) },
@@ -224,8 +181,8 @@ server.tool(
224
181
  {},
225
182
  async () => {
226
183
  const [nodeTypes, edgeTypes] = await Promise.all([
227
- nodeService.listTypes(),
228
- edgeService.listRelationshipTypes(),
184
+ api.nodes.listTypes(),
185
+ api.edges.listRelationshipTypes(),
229
186
  ]);
230
187
  return {
231
188
  content: [
@@ -243,7 +200,7 @@ server.tool(
243
200
  "List the full domain taxonomy tree",
244
201
  {},
245
202
  async () => {
246
- const tree = await domainService.getTree();
203
+ const tree = await api.domains.getTree();
247
204
  return {
248
205
  content: [
249
206
  { type: "text" as const, text: JSON.stringify(tree, null, 2) },
@@ -257,7 +214,7 @@ server.tool(
257
214
  "Seed the default domain taxonomy",
258
215
  {},
259
216
  async () => {
260
- const result = await domainService.seed();
217
+ const result = await api.domains.seed();
261
218
  return {
262
219
  content: [
263
220
  {
@@ -276,7 +233,7 @@ server.tool(
276
233
  "List all workspaces — each defines a filtered view of the knowledge graph for a specific kind of work",
277
234
  {},
278
235
  async () => {
279
- const list = await workspaceService.list();
236
+ const list = await api.workspaces.list();
280
237
  return {
281
238
  content: [
282
239
  { type: "text" as const, text: JSON.stringify(list, null, 2) },
@@ -292,7 +249,7 @@ server.tool(
292
249
  slug: z.string().describe("Workspace slug"),
293
250
  },
294
251
  async ({ slug }) => {
295
- const ws = await workspaceService.getBySlug(slug);
252
+ const ws = await api.workspaces.getBySlug(slug);
296
253
  if (!ws) {
297
254
  return {
298
255
  content: [{ type: "text" as const, text: "Workspace not found" }],
@@ -314,7 +271,7 @@ server.tool(
314
271
  slug: z.string().describe("Workspace slug"),
315
272
  },
316
273
  async ({ slug }) => {
317
- const md = await workspaceService.exportAsMarkdown(slug);
274
+ const md = await api.workspaces.exportAsMarkdown(slug);
318
275
  if (!md) {
319
276
  return {
320
277
  content: [{ type: "text" as const, text: "Workspace not found" }],
@@ -354,10 +311,10 @@ server.tool(
354
311
  async ({ type, title, content, metadata, created_by, domain_slug }) => {
355
312
  let domainId: string | undefined;
356
313
  if (domain_slug) {
357
- const domain = await domainService.getBySlug(domain_slug);
314
+ const domain = await api.domains.getBySlug(domain_slug);
358
315
  if (domain) domainId = domain.id;
359
316
  }
360
- const node = await nodeService.create({
317
+ const node = await api.nodes.create({
361
318
  type,
362
319
  title,
363
320
  content,
@@ -384,7 +341,7 @@ server.tool(
384
341
  type: z.string().optional().describe("New node type"),
385
342
  },
386
343
  async ({ id, title, content, metadata, type }) => {
387
- const node = await nodeService.update(id, { title, content, metadata, type });
344
+ const node = await api.nodes.update(id, { title, content, metadata, type });
388
345
  if (!node) {
389
346
  return {
390
347
  content: [{ type: "text" as const, text: "Node not found" }],
@@ -412,7 +369,7 @@ server.tool(
412
369
  created_by: z.string().optional().describe("Creator identifier"),
413
370
  },
414
371
  async ({ source_node_id, target_node_id, relationship_type, weight, created_by }) => {
415
- const edge = await edgeService.create({
372
+ const edge = await api.edges.create({
416
373
  sourceNodeId: source_node_id,
417
374
  targetNodeId: target_node_id,
418
375
  relationshipType: relationship_type,
@@ -437,7 +394,7 @@ server.tool(
437
394
  .describe("New status"),
438
395
  },
439
396
  async ({ id, status }) => {
440
- const node = await nodeService.setStatus(id, status as NodeStatus);
397
+ const node = await api.nodes.setStatus(id, status as NodeStatus);
441
398
  if (!node) {
442
399
  return {
443
400
  content: [{ type: "text" as const, text: "Node not found" }],
@@ -452,6 +409,234 @@ server.tool(
452
409
  }
453
410
  );
454
411
 
412
+ // ── Delete Tools ──────────────────────────────────────────────────────────
413
+
414
+ server.tool(
415
+ "delete_node",
416
+ "Delete a knowledge node and all its edges",
417
+ {
418
+ id: z.string().describe("Node UUID"),
419
+ },
420
+ async ({ id }) => {
421
+ const node = await api.nodes.getById(id);
422
+ if (!node) {
423
+ return {
424
+ content: [{ type: "text" as const, text: "Node not found" }],
425
+ isError: true,
426
+ };
427
+ }
428
+ await api.nodes.delete(node.id);
429
+ return {
430
+ content: [{ type: "text" as const, text: `Deleted node "${node.title}" (${node.id})` }],
431
+ };
432
+ }
433
+ );
434
+
435
+ server.tool(
436
+ "delete_edge",
437
+ "Delete an edge between two nodes",
438
+ {
439
+ id: z.string().describe("Edge UUID"),
440
+ },
441
+ async ({ id }) => {
442
+ const deleted = await api.edges.delete(id);
443
+ if (!deleted) {
444
+ return {
445
+ content: [{ type: "text" as const, text: "Edge not found" }],
446
+ isError: true,
447
+ };
448
+ }
449
+ return {
450
+ content: [{ type: "text" as const, text: `Deleted edge ${id}` }],
451
+ };
452
+ }
453
+ );
454
+
455
+ // ── Graph Health Tools ────────────────────────────────────────────────────
456
+
457
+ server.tool(
458
+ "health_report",
459
+ "Comprehensive graph health report — node/edge counts, orphans, stale nodes, connected components",
460
+ {
461
+ stale_days: z.number().optional().describe("Days before a node is considered stale (default 90)"),
462
+ },
463
+ async ({ stale_days }) => {
464
+ const report = await api.cleaning.getHealthReport(stale_days ?? 90);
465
+ return {
466
+ content: [{ type: "text" as const, text: JSON.stringify(report, null, 2) }],
467
+ };
468
+ }
469
+ );
470
+
471
+ server.tool(
472
+ "validate_edges",
473
+ "Validate edge integrity — detect self-loops, duplicates, low-relevance connections, contradictions, and rare types",
474
+ {
475
+ low_relevance_threshold: z.number().optional().describe("Similarity threshold for low-relevance detection (default 0.3)"),
476
+ rare_type_threshold: z.number().optional().describe("Flag relationship types used this many times or fewer (default 1)"),
477
+ },
478
+ async ({ low_relevance_threshold, rare_type_threshold }) => {
479
+ const report = await api.cleaning.validate({
480
+ lowRelevanceThreshold: low_relevance_threshold,
481
+ rareTypeThreshold: rare_type_threshold,
482
+ });
483
+ return {
484
+ content: [{ type: "text" as const, text: JSON.stringify(report, null, 2) }],
485
+ };
486
+ }
487
+ );
488
+
489
+ server.tool(
490
+ "find_orphans",
491
+ "Find nodes with no connections to other nodes",
492
+ {},
493
+ async () => {
494
+ const orphans = await api.cleaning.findOrphans();
495
+ return {
496
+ content: [{ type: "text" as const, text: JSON.stringify(orphans, null, 2) }],
497
+ };
498
+ }
499
+ );
500
+
501
+ server.tool(
502
+ "find_duplicates",
503
+ "Find near-duplicate node pairs by embedding cosine similarity",
504
+ {
505
+ threshold: z.number().optional().describe("Minimum cosine similarity 0-1 (default 0.95)"),
506
+ limit: z.number().optional().describe("Max pairs to return (default 50)"),
507
+ },
508
+ async ({ threshold, limit }) => {
509
+ const duplicates = await api.cleaning.findDuplicates(threshold ?? 0.95, limit ?? 50);
510
+ return {
511
+ content: [{ type: "text" as const, text: JSON.stringify(duplicates, null, 2) }],
512
+ };
513
+ }
514
+ );
515
+
516
+ server.tool(
517
+ "find_islands",
518
+ "Detect disconnected clusters (connected components) in the graph, optionally with bridge suggestions",
519
+ {
520
+ bridges: z.boolean().optional().describe("Include suggested links to bridge islands"),
521
+ max_bridges: z.number().optional().describe("Max bridge suggestions (default 10)"),
522
+ },
523
+ async ({ bridges, max_bridges }) => {
524
+ const result = await api.cleaning.findIslands({
525
+ bridges,
526
+ maxBridges: max_bridges,
527
+ });
528
+ return {
529
+ content: [{ type: "text" as const, text: JSON.stringify(result, null, 2) }],
530
+ };
531
+ }
532
+ );
533
+
534
+ server.tool(
535
+ "suggest_links",
536
+ "Suggest missing links between semantically similar but unconnected nodes",
537
+ {
538
+ node_id: z.string().optional().describe("Node UUID to suggest links for (omit for global scan)"),
539
+ min_similarity: z.number().optional().describe("Minimum cosine similarity (default 0.8 global, 0.7 per-node)"),
540
+ limit: z.number().optional().describe("Max suggestions (default 10 per-node, 20 global)"),
541
+ },
542
+ async ({ node_id, min_similarity, limit }) => {
543
+ const suggestions = await api.cleaning.suggestLinks({
544
+ nodeId: node_id,
545
+ minSimilarity: min_similarity,
546
+ limit,
547
+ });
548
+ return {
549
+ content: [{ type: "text" as const, text: JSON.stringify(suggestions, null, 2) }],
550
+ };
551
+ }
552
+ );
553
+
554
+ server.tool(
555
+ "analyze_relationship_types",
556
+ "Analyze relationship type vocabulary and suggest merges for semantically similar types",
557
+ {
558
+ min_similarity: z.number().optional().describe("Minimum similarity to suggest merge (default 0.7)"),
559
+ },
560
+ async ({ min_similarity }) => {
561
+ const report = await api.cleaning.analyzeRelationshipTypes({
562
+ minSimilarity: min_similarity,
563
+ });
564
+ return {
565
+ content: [{ type: "text" as const, text: JSON.stringify(report, null, 2) }],
566
+ };
567
+ }
568
+ );
569
+
570
+ server.tool(
571
+ "retype_edges",
572
+ "Rename all edges of one relationship type to another",
573
+ {
574
+ from_type: z.string().describe("Current relationship type to rename"),
575
+ to_type: z.string().describe("New relationship type name"),
576
+ },
577
+ async ({ from_type, to_type }) => {
578
+ const result = await api.cleaning.retypeMany(from_type, to_type);
579
+ return {
580
+ content: [{ type: "text" as const, text: JSON.stringify({ renamed: result.count, from: from_type, to: to_type }, null, 2) }],
581
+ };
582
+ }
583
+ );
584
+
585
+ // ── PII Tools ─────────────────────────────────────────────────────────────
586
+
587
+ server.tool(
588
+ "get_pii_config",
589
+ "Get the current PII detection/encryption policy for this organization",
590
+ {},
591
+ async () => {
592
+ const config = await api.pii.getConfig();
593
+ if (!config) {
594
+ return {
595
+ content: [{ type: "text" as const, text: JSON.stringify({ configured: false }, null, 2) }],
596
+ };
597
+ }
598
+ return {
599
+ content: [{ type: "text" as const, text: JSON.stringify(config, null, 2) }],
600
+ };
601
+ }
602
+ );
603
+
604
+ server.tool(
605
+ "test_pii",
606
+ "Test a text string for PII detection — returns matches with types and positions",
607
+ {
608
+ text: z.string().describe("Text to scan for PII"),
609
+ },
610
+ async ({ text }) => {
611
+ const result = await api.pii.test(text);
612
+ return {
613
+ content: [{ type: "text" as const, text: JSON.stringify(result, null, 2) }],
614
+ };
615
+ }
616
+ );
617
+
618
+ // ── Maintenance Tools ─────────────────────────────────────────────────────
619
+
620
+ server.tool(
621
+ "re_embed",
622
+ "Re-generate embeddings for nodes (useful after changing embedding provider/model)",
623
+ {
624
+ type: z.string().optional().describe("Only re-embed nodes of this type"),
625
+ limit: z.number().optional().describe("Limit to N nodes"),
626
+ dry_run: z.boolean().optional().describe("Show what would be re-embedded without making changes"),
627
+ },
628
+ async ({ type, limit, dry_run }) => {
629
+ const result = await api.reEmbed({
630
+ type,
631
+ limit,
632
+ dryRun: dry_run ?? false,
633
+ });
634
+ return {
635
+ content: [{ type: "text" as const, text: JSON.stringify(result, null, 2) }],
636
+ };
637
+ }
638
+ );
639
+
455
640
  // ── Start Server ───────────────────────────────────────────────────────────
456
641
 
457
642
  async function main() {