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.
- package/CHANGELOG.md +11 -0
- package/LICENSE +21 -0
- package/README.md +205 -0
- package/dist/analytics.d.ts +24 -0
- package/dist/analytics.js +102 -0
- package/dist/analytics.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +98 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +39 -0
- package/dist/config.js +80 -0
- package/dist/config.js.map +1 -0
- package/dist/embeddings.d.ts +26 -0
- package/dist/embeddings.js +534 -0
- package/dist/embeddings.js.map +1 -0
- package/dist/formatter.d.ts +51 -0
- package/dist/formatter.js +273 -0
- package/dist/formatter.js.map +1 -0
- package/dist/generate-embeddings.d.ts +8 -0
- package/dist/generate-embeddings.js +146 -0
- package/dist/generate-embeddings.js.map +1 -0
- package/dist/graph.d.ts +20 -0
- package/dist/graph.js +133 -0
- package/dist/graph.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.js +481 -0
- package/dist/index.js.map +1 -0
- package/dist/init.d.ts +1 -0
- package/dist/init.js +65 -0
- package/dist/init.js.map +1 -0
- package/dist/loader.d.ts +26 -0
- package/dist/loader.js +151 -0
- package/dist/loader.js.map +1 -0
- package/dist/logger.d.ts +6 -0
- package/dist/logger.js +15 -0
- package/dist/logger.js.map +1 -0
- package/dist/query-classifier.d.ts +23 -0
- package/dist/query-classifier.js +111 -0
- package/dist/query-classifier.js.map +1 -0
- package/dist/reranker.d.ts +7 -0
- package/dist/reranker.js +38 -0
- package/dist/reranker.js.map +1 -0
- package/dist/search.d.ts +17 -0
- package/dist/search.js +299 -0
- package/dist/search.js.map +1 -0
- package/dist/validator.d.ts +23 -0
- package/dist/validator.js +97 -0
- package/dist/validator.js.map +1 -0
- package/dist/writer.d.ts +36 -0
- package/dist/writer.js +360 -0
- package/dist/writer.js.map +1 -0
- 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
|
+
}
|