knowledge-mcp-server 1.0.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 (52) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/LICENSE +21 -0
  3. package/README.md +205 -0
  4. package/dist/analytics.d.ts +24 -0
  5. package/dist/analytics.js +102 -0
  6. package/dist/analytics.js.map +1 -0
  7. package/dist/cli.d.ts +2 -0
  8. package/dist/cli.js +98 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/config.d.ts +39 -0
  11. package/dist/config.js +80 -0
  12. package/dist/config.js.map +1 -0
  13. package/dist/embeddings.d.ts +26 -0
  14. package/dist/embeddings.js +534 -0
  15. package/dist/embeddings.js.map +1 -0
  16. package/dist/formatter.d.ts +51 -0
  17. package/dist/formatter.js +273 -0
  18. package/dist/formatter.js.map +1 -0
  19. package/dist/generate-embeddings.d.ts +8 -0
  20. package/dist/generate-embeddings.js +146 -0
  21. package/dist/generate-embeddings.js.map +1 -0
  22. package/dist/graph.d.ts +20 -0
  23. package/dist/graph.js +133 -0
  24. package/dist/graph.js.map +1 -0
  25. package/dist/index.d.ts +14 -0
  26. package/dist/index.js +481 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/init.d.ts +1 -0
  29. package/dist/init.js +65 -0
  30. package/dist/init.js.map +1 -0
  31. package/dist/loader.d.ts +26 -0
  32. package/dist/loader.js +151 -0
  33. package/dist/loader.js.map +1 -0
  34. package/dist/logger.d.ts +6 -0
  35. package/dist/logger.js +15 -0
  36. package/dist/logger.js.map +1 -0
  37. package/dist/query-classifier.d.ts +23 -0
  38. package/dist/query-classifier.js +111 -0
  39. package/dist/query-classifier.js.map +1 -0
  40. package/dist/reranker.d.ts +7 -0
  41. package/dist/reranker.js +38 -0
  42. package/dist/reranker.js.map +1 -0
  43. package/dist/search.d.ts +17 -0
  44. package/dist/search.js +299 -0
  45. package/dist/search.js.map +1 -0
  46. package/dist/validator.d.ts +23 -0
  47. package/dist/validator.js +97 -0
  48. package/dist/validator.js.map +1 -0
  49. package/dist/writer.d.ts +36 -0
  50. package/dist/writer.js +360 -0
  51. package/dist/writer.js.map +1 -0
  52. package/package.json +58 -0
package/dist/writer.js ADDED
@@ -0,0 +1,360 @@
1
+ import { writeFileSync, mkdirSync, unlinkSync } from "node:fs";
2
+ import { join, relative } from "node:path";
3
+ import { stringify as stringifyYaml } from "yaml";
4
+ import { deriveParentId, VALID_TYPES } from "./loader.js";
5
+ import { updateBm25Index, embedSingleDocument, removeEmbedding, } from "./embeddings.js";
6
+ const ID_PATTERN = /^[a-z][a-z0-9-]*(\/[a-z][a-z0-9-]*)*$/;
7
+ function validateWriteParams(params, validDomains, validPhaseIds) {
8
+ if (!ID_PATTERN.test(params.id)) {
9
+ throw new Error(`Invalid document ID "${params.id}". Must match pattern: lowercase letters, digits, hyphens, separated by slashes.`);
10
+ }
11
+ if (validDomains && !validDomains.includes(params.domain)) {
12
+ throw new Error(`Invalid domain "${params.domain}". Must be one of: ${validDomains.join(", ")}`);
13
+ }
14
+ if (!VALID_TYPES.includes(params.type)) {
15
+ throw new Error(`Invalid type "${params.type}". Must be one of: ${VALID_TYPES.join(", ")}`);
16
+ }
17
+ for (const p of params.phase) {
18
+ if (validPhaseIds) {
19
+ if (!validPhaseIds.includes(p)) {
20
+ throw new Error(`Invalid phase value ${p}. Must be one of: ${validPhaseIds.join(", ")}`);
21
+ }
22
+ }
23
+ else if (p < 1 || !Number.isInteger(p)) {
24
+ throw new Error(`Invalid phase value ${p}. Must be a positive integer.`);
25
+ }
26
+ }
27
+ if (!params.title.trim()) {
28
+ throw new Error("Title must not be empty.");
29
+ }
30
+ if (!params.content.trim()) {
31
+ throw new Error("Content must not be empty.");
32
+ }
33
+ }
34
+ function findClosestTag(tag, knownTags) {
35
+ const lower = tag.toLowerCase();
36
+ let bestMatch = null;
37
+ let bestScore = 0;
38
+ for (const known of knownTags) {
39
+ const knownLower = known.toLowerCase();
40
+ // Exact case-insensitive match
41
+ if (knownLower === lower)
42
+ return known;
43
+ // Substring containment: tag is part of known or known is part of tag
44
+ if (knownLower.includes(lower) || lower.includes(knownLower)) {
45
+ const score = Math.min(lower.length, knownLower.length) / Math.max(lower.length, knownLower.length);
46
+ if (score > bestScore) {
47
+ bestScore = score;
48
+ bestMatch = known;
49
+ }
50
+ }
51
+ }
52
+ // Only suggest if the match is reasonably close (>40% overlap ratio)
53
+ return bestScore > 0.4 ? bestMatch : null;
54
+ }
55
+ function validateTags(tags, taxonomy, warnings) {
56
+ const correctedTags = [];
57
+ for (const tag of tags) {
58
+ const lower = tag.toLowerCase();
59
+ // Check alias map first
60
+ const aliasTarget = taxonomy.aliases.get(lower);
61
+ if (aliasTarget) {
62
+ correctedTags.push(aliasTarget);
63
+ warnings.push(`Tag "${tag}" auto-corrected to "${aliasTarget}" (known alias).`);
64
+ continue;
65
+ }
66
+ // Check if it's a known tag
67
+ if (taxonomy.knownTags.has(tag)) {
68
+ correctedTags.push(tag);
69
+ continue;
70
+ }
71
+ // Unknown tag — find closest match and warn
72
+ const closest = findClosestTag(tag, taxonomy.knownTags);
73
+ if (closest) {
74
+ warnings.push(`Tag "${tag}" is not in the taxonomy. Did you mean "${closest}"?`);
75
+ }
76
+ else {
77
+ warnings.push(`Tag "${tag}" is not in the taxonomy. Consider adding it to .tags.json.`);
78
+ }
79
+ correctedTags.push(tag);
80
+ }
81
+ return correctedTags;
82
+ }
83
+ export function writeDocument(graph, tfidfIndex, knowledgeDir, params, validDomains, validPhaseIds) {
84
+ validateWriteParams(params, validDomains ?? null, validPhaseIds ?? null);
85
+ // Validate and auto-correct tags against taxonomy (warnings only)
86
+ const tagWarnings = [];
87
+ if (graph.tagTaxonomy) {
88
+ params.tags = validateTags(params.tags, graph.tagTaxonomy, tagWarnings);
89
+ }
90
+ const parentId = deriveParentId(params.id);
91
+ const warnings = [...tagWarnings];
92
+ // Parent must exist (unless this is a top-level domain doc whose parent is "root")
93
+ if (parentId && !graph.documents.has(parentId)) {
94
+ throw new Error(`Parent document "${parentId}" does not exist. Create parent summary documents first.`);
95
+ }
96
+ // Validate related references (warn, not error)
97
+ if (params.related) {
98
+ for (const relId of params.related) {
99
+ if (!graph.documents.has(relId)) {
100
+ warnings.push(`Related reference "${relId}" does not exist in the knowledge graph.`);
101
+ }
102
+ }
103
+ }
104
+ // Derive file path: summary type uses _summary.md, others use {last-segment}.md
105
+ const segments = params.id.split("/");
106
+ const isSummary = params.type === "summary";
107
+ const fileName = isSummary ? "_summary.md" : `${segments[segments.length - 1]}.md`;
108
+ const dirPath = isSummary
109
+ ? join(knowledgeDir, ...segments)
110
+ : join(knowledgeDir, ...segments.slice(0, -1));
111
+ const filePath = join(dirPath, fileName);
112
+ const isUpdate = graph.documents.has(params.id);
113
+ // If updating, remove old entries from tag, domain, phase, and backlink indices
114
+ if (isUpdate) {
115
+ const oldDoc = graph.documents.get(params.id);
116
+ for (const tag of oldDoc.tags) {
117
+ const tagSet = graph.tagIndex.get(tag.toLowerCase());
118
+ if (tagSet) {
119
+ tagSet.delete(params.id);
120
+ if (tagSet.size === 0)
121
+ graph.tagIndex.delete(tag.toLowerCase());
122
+ }
123
+ }
124
+ const domainSet = graph.domainIndex.get(oldDoc.domain.toLowerCase());
125
+ if (domainSet) {
126
+ domainSet.delete(params.id);
127
+ if (domainSet.size === 0)
128
+ graph.domainIndex.delete(oldDoc.domain.toLowerCase());
129
+ }
130
+ for (const phase of oldDoc.phase) {
131
+ const phaseSet = graph.phaseIndex.get(phase);
132
+ if (phaseSet) {
133
+ phaseSet.delete(params.id);
134
+ if (phaseSet.size === 0)
135
+ graph.phaseIndex.delete(phase);
136
+ }
137
+ }
138
+ // Remove from type index
139
+ const typeSet = graph.typeIndex.get(oldDoc.type);
140
+ if (typeSet) {
141
+ typeSet.delete(params.id);
142
+ if (typeSet.size === 0)
143
+ graph.typeIndex.delete(oldDoc.type);
144
+ }
145
+ // Remove old backlink entries
146
+ for (const targetId of oldDoc.related) {
147
+ const backlinks = graph.backlinkIndex.get(targetId);
148
+ if (backlinks) {
149
+ backlinks.delete(params.id);
150
+ if (backlinks.size === 0)
151
+ graph.backlinkIndex.delete(targetId);
152
+ }
153
+ }
154
+ }
155
+ // For summary updates, merge provided children with existing auto-discovered children
156
+ let childrenIds = [];
157
+ if (isUpdate && isSummary) {
158
+ const existingDoc = graph.documents.get(params.id);
159
+ const existingChildren = new Set(existingDoc.childrenIds);
160
+ if (params.children) {
161
+ for (const c of params.children)
162
+ existingChildren.add(c);
163
+ }
164
+ childrenIds = [...existingChildren];
165
+ }
166
+ else if (params.children) {
167
+ childrenIds = params.children;
168
+ }
169
+ const wordCount = params.content.split(/\s+/).filter(Boolean).length;
170
+ // Build frontmatter
171
+ const frontmatter = {
172
+ id: params.id,
173
+ title: params.title,
174
+ type: params.type,
175
+ domain: params.domain,
176
+ };
177
+ if (params.subdomain)
178
+ frontmatter.subdomain = params.subdomain;
179
+ frontmatter.tags = params.tags;
180
+ frontmatter.phase = params.phase;
181
+ if (params.related && params.related.length > 0)
182
+ frontmatter.related = params.related;
183
+ if (childrenIds.length > 0 && isSummary)
184
+ frontmatter.children = childrenIds;
185
+ const docStatus = params.status || "active";
186
+ if (docStatus !== "active")
187
+ frontmatter.status = docStatus;
188
+ if (params.superseded_by)
189
+ frontmatter.superseded_by = params.superseded_by;
190
+ if (params.type === "decision") {
191
+ if (params.decision_status)
192
+ frontmatter.decision_status = params.decision_status;
193
+ if (params.alternatives_considered && params.alternatives_considered.length > 0)
194
+ frontmatter.alternatives_considered = params.alternatives_considered;
195
+ if (params.decision_date)
196
+ frontmatter.decision_date = params.decision_date;
197
+ }
198
+ frontmatter.word_count = wordCount;
199
+ frontmatter.last_updated = new Date().toISOString().split("T")[0];
200
+ const fileContent = `---\n${stringifyYaml(frontmatter).trim()}\n---\n\n${params.content}`;
201
+ // Write file (create directories as needed)
202
+ mkdirSync(dirPath, { recursive: true });
203
+ writeFileSync(filePath, fileContent, "utf-8");
204
+ const lastUpdated = frontmatter.last_updated;
205
+ // Build the in-memory document
206
+ const doc = {
207
+ id: params.id,
208
+ title: params.title,
209
+ type: params.type,
210
+ domain: params.domain,
211
+ subdomain: params.subdomain,
212
+ tags: params.tags,
213
+ phase: params.phase,
214
+ related: params.related || [],
215
+ parentId,
216
+ childrenIds,
217
+ contentBody: params.content,
218
+ filePath: relative(join(knowledgeDir, ".."), filePath),
219
+ wordCount,
220
+ status: docStatus,
221
+ supersededBy: params.superseded_by,
222
+ lastUpdated,
223
+ decisionStatus: params.decision_status,
224
+ alternativesConsidered: params.alternatives_considered,
225
+ decisionDate: params.decision_date,
226
+ };
227
+ // Update in-memory graph
228
+ graph.documents.set(params.id, doc);
229
+ // Update tag index
230
+ for (const tag of doc.tags) {
231
+ const lower = tag.toLowerCase();
232
+ if (!graph.tagIndex.has(lower))
233
+ graph.tagIndex.set(lower, new Set());
234
+ graph.tagIndex.get(lower).add(doc.id);
235
+ }
236
+ // Update domain index
237
+ const domainLower = doc.domain.toLowerCase();
238
+ if (!graph.domainIndex.has(domainLower))
239
+ graph.domainIndex.set(domainLower, new Set());
240
+ graph.domainIndex.get(domainLower).add(doc.id);
241
+ // Update type index
242
+ if (!graph.typeIndex.has(doc.type))
243
+ graph.typeIndex.set(doc.type, new Set());
244
+ graph.typeIndex.get(doc.type).add(doc.id);
245
+ // Update phase index
246
+ for (const phase of doc.phase) {
247
+ if (!graph.phaseIndex.has(phase))
248
+ graph.phaseIndex.set(phase, new Set());
249
+ graph.phaseIndex.get(phase).add(doc.id);
250
+ }
251
+ // Update backlink index
252
+ for (const targetId of doc.related) {
253
+ if (!graph.backlinkIndex.has(targetId))
254
+ graph.backlinkIndex.set(targetId, new Set());
255
+ graph.backlinkIndex.get(targetId).add(doc.id);
256
+ }
257
+ // Update parent's childrenIds
258
+ if (parentId) {
259
+ const parent = graph.documents.get(parentId);
260
+ if (parent && !parent.childrenIds.includes(doc.id)) {
261
+ parent.childrenIds.push(doc.id);
262
+ }
263
+ }
264
+ // Incremental BM25 index update (no full rebuild)
265
+ updateBm25Index(tfidfIndex, doc.id, doc);
266
+ // Fire-and-forget inline embedding
267
+ embedSingleDocument(graph.embeddings, knowledgeDir, doc).catch(() => { });
268
+ return {
269
+ id: params.id,
270
+ filePath: relative(join(knowledgeDir, ".."), filePath),
271
+ parentId,
272
+ status: isUpdate ? "updated" : "created",
273
+ tfidfIndex,
274
+ warnings,
275
+ };
276
+ }
277
+ export function deleteDocument(graph, tfidfIndex, knowledgeDir, id) {
278
+ const doc = graph.documents.get(id);
279
+ if (!doc) {
280
+ throw new Error(`Document not found: "${id}".`);
281
+ }
282
+ const warnings = [];
283
+ // Warn about children
284
+ if (doc.childrenIds.length > 0) {
285
+ warnings.push(`Document has ${doc.childrenIds.length} children that will be orphaned: ${doc.childrenIds.join(", ")}`);
286
+ }
287
+ // Warn about documents that reference this one (via backlink index)
288
+ const backlinks = graph.backlinkIndex.get(id);
289
+ if (backlinks) {
290
+ for (const sourceId of backlinks) {
291
+ warnings.push(`Document "${sourceId}" has a related reference to this document.`);
292
+ }
293
+ }
294
+ // Remove from tag index
295
+ for (const tag of doc.tags) {
296
+ const tagSet = graph.tagIndex.get(tag.toLowerCase());
297
+ if (tagSet) {
298
+ tagSet.delete(id);
299
+ if (tagSet.size === 0)
300
+ graph.tagIndex.delete(tag.toLowerCase());
301
+ }
302
+ }
303
+ // Remove from domain index
304
+ const domainSet = graph.domainIndex.get(doc.domain.toLowerCase());
305
+ if (domainSet) {
306
+ domainSet.delete(id);
307
+ if (domainSet.size === 0)
308
+ graph.domainIndex.delete(doc.domain.toLowerCase());
309
+ }
310
+ // Remove from type index
311
+ const delTypeSet = graph.typeIndex.get(doc.type);
312
+ if (delTypeSet) {
313
+ delTypeSet.delete(id);
314
+ if (delTypeSet.size === 0)
315
+ graph.typeIndex.delete(doc.type);
316
+ }
317
+ // Remove from phase index
318
+ for (const phase of doc.phase) {
319
+ const phaseSet = graph.phaseIndex.get(phase);
320
+ if (phaseSet) {
321
+ phaseSet.delete(id);
322
+ if (phaseSet.size === 0)
323
+ graph.phaseIndex.delete(phase);
324
+ }
325
+ }
326
+ // Remove from parent's childrenIds
327
+ if (doc.parentId) {
328
+ const parent = graph.documents.get(doc.parentId);
329
+ if (parent) {
330
+ parent.childrenIds = parent.childrenIds.filter((c) => c !== id);
331
+ }
332
+ }
333
+ // Remove from backlink index (forward links this doc had)
334
+ for (const targetId of doc.related) {
335
+ const bl = graph.backlinkIndex.get(targetId);
336
+ if (bl) {
337
+ bl.delete(id);
338
+ if (bl.size === 0)
339
+ graph.backlinkIndex.delete(targetId);
340
+ }
341
+ }
342
+ // Remove backlink entry for this doc
343
+ graph.backlinkIndex.delete(id);
344
+ // Remove from documents map
345
+ graph.documents.delete(id);
346
+ // Delete file from disk
347
+ const fullPath = join(knowledgeDir, "..", doc.filePath);
348
+ try {
349
+ unlinkSync(fullPath);
350
+ }
351
+ catch {
352
+ warnings.push(`Could not delete file: ${doc.filePath}`);
353
+ }
354
+ // Incremental BM25 index update (remove doc, no full rebuild)
355
+ updateBm25Index(tfidfIndex, id, null);
356
+ // Remove stale embedding
357
+ removeEmbedding(graph.embeddings, knowledgeDir, id);
358
+ return { id, warnings, tfidfIndex };
359
+ }
360
+ //# sourceMappingURL=writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writer.js","sourceRoot":"","sources":["../src/writer.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,58 @@
1
+ {
2
+ "name": "knowledge-mcp-server",
3
+ "version": "1.0.0",
4
+ "description": "MCP server for semantic search, CRUD, and graph operations over hierarchical knowledge bases stored as Markdown with YAML frontmatter",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "bin": {
9
+ "knowledge-mcp-server": "dist/cli.js"
10
+ },
11
+ "files": [
12
+ "dist/**/*.js",
13
+ "dist/**/*.d.ts",
14
+ "dist/**/*.js.map",
15
+ "README.md",
16
+ "LICENSE",
17
+ "CHANGELOG.md"
18
+ ],
19
+ "scripts": {
20
+ "build": "tsc",
21
+ "start": "node dist/cli.js",
22
+ "dev": "tsc --watch",
23
+ "test": "vitest run",
24
+ "test:watch": "vitest",
25
+ "lint": "eslint src/",
26
+ "lint:fix": "eslint src/ --fix",
27
+ "format": "prettier --write \"src/**/*.ts\"",
28
+ "format:check": "prettier --check \"src/**/*.ts\"",
29
+ "prepublishOnly": "npm run build && npm run test"
30
+ },
31
+ "keywords": [
32
+ "mcp",
33
+ "knowledge-graph",
34
+ "markdown",
35
+ "semantic-search",
36
+ "model-context-protocol",
37
+ "rag",
38
+ "bm25"
39
+ ],
40
+ "license": "MIT",
41
+ "engines": {
42
+ "node": ">=20"
43
+ },
44
+ "dependencies": {
45
+ "@modelcontextprotocol/sdk": "^1.12.1",
46
+ "yaml": "^2.7.1"
47
+ },
48
+ "devDependencies": {
49
+ "@eslint/js": "^10.0.1",
50
+ "@types/node": "^22.15.3",
51
+ "eslint": "^10.1.0",
52
+ "eslint-config-prettier": "^10.1.8",
53
+ "prettier": "^3.8.1",
54
+ "typescript": "^5.8.3",
55
+ "typescript-eslint": "^8.57.1",
56
+ "vitest": "^4.1.0"
57
+ }
58
+ }