mcp-docs-service 0.3.10 → 0.3.11

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 (48) hide show
  1. package/README.md +178 -54
  2. package/dist/cli/bin.d.ts +8 -0
  3. package/dist/cli/bin.js +133 -0
  4. package/dist/cli/bin.js.map +1 -0
  5. package/dist/handlers/docs.d.ts +26 -0
  6. package/dist/handlers/docs.js +513 -0
  7. package/dist/handlers/docs.js.map +1 -0
  8. package/dist/handlers/documents.js +282 -0
  9. package/dist/handlers/file.d.ts +32 -0
  10. package/dist/handlers/file.js +222 -0
  11. package/dist/handlers/file.js.map +1 -0
  12. package/dist/handlers/health.js +196 -0
  13. package/dist/handlers/index.d.ts +1 -0
  14. package/dist/handlers/index.js +8 -0
  15. package/dist/handlers/index.js.map +1 -0
  16. package/dist/handlers/navigation.js +128 -0
  17. package/dist/index.js +107 -549
  18. package/dist/schemas/index.d.ts +1 -0
  19. package/dist/schemas/index.js +1 -0
  20. package/dist/schemas/index.js.map +1 -0
  21. package/dist/schemas/tools.d.ts +164 -0
  22. package/dist/schemas/tools.js +47 -0
  23. package/dist/schemas/tools.js.map +1 -0
  24. package/dist/types/docs.d.ts +74 -0
  25. package/dist/types/docs.js +1 -0
  26. package/dist/types/docs.js.map +1 -0
  27. package/dist/types/file.d.ts +21 -0
  28. package/dist/types/file.js +2 -0
  29. package/dist/types/file.js.map +1 -0
  30. package/dist/types/index.d.ts +44 -0
  31. package/dist/types/index.js +2 -0
  32. package/dist/types/index.js.map +1 -0
  33. package/dist/types/tools.d.ts +11 -0
  34. package/dist/types/tools.js +1 -0
  35. package/dist/types/tools.js.map +1 -0
  36. package/dist/utils/file.d.ts +24 -0
  37. package/dist/utils/file.js +94 -0
  38. package/dist/utils/file.js.map +1 -0
  39. package/dist/utils/index.d.ts +1 -0
  40. package/dist/utils/index.js +2 -0
  41. package/dist/utils/index.js.map +1 -0
  42. package/dist/utils/logging.js +27 -0
  43. package/dist/utils/path.d.ts +16 -0
  44. package/dist/utils/path.js +69 -0
  45. package/dist/utils/path.js.map +1 -0
  46. package/package.json +4 -8
  47. package/cursor-wrapper.cjs +0 -111
  48. package/npx-wrapper.cjs +0 -160
@@ -0,0 +1,513 @@
1
+ import fs from "fs/promises";
2
+ import path from "path";
3
+ import { validatePath } from "../utils/path.js";
4
+ import matter from "gray-matter";
5
+ /**
6
+ * Reads a markdown document and extracts its content and metadata
7
+ */
8
+ export async function readDocument(docPath, allowedDirectories) {
9
+ try {
10
+ const normalizedPath = await validatePath(docPath, allowedDirectories);
11
+ // Read the file
12
+ const content = await fs.readFile(normalizedPath, "utf-8");
13
+ // Parse frontmatter
14
+ const { data: metadata, content: markdownContent } = matter(content);
15
+ return {
16
+ content: [{ type: "text", text: "Document read successfully" }],
17
+ metadata: {
18
+ path: docPath,
19
+ content: markdownContent,
20
+ metadata,
21
+ },
22
+ };
23
+ }
24
+ catch (error) {
25
+ return {
26
+ content: [
27
+ { type: "text", text: `Error reading document: ${error.message}` },
28
+ ],
29
+ isError: true,
30
+ };
31
+ }
32
+ }
33
+ /**
34
+ * Lists all markdown documents in a directory
35
+ */
36
+ export async function listDocuments(basePath, allowedDirectories) {
37
+ try {
38
+ const normalizedBasePath = basePath
39
+ ? await validatePath(basePath, allowedDirectories)
40
+ : allowedDirectories[0];
41
+ const documents = [];
42
+ async function processDirectory(dirPath) {
43
+ const entries = await fs.readdir(dirPath, { withFileTypes: true });
44
+ for (const entry of entries) {
45
+ const entryPath = path.join(dirPath, entry.name);
46
+ if (entry.isDirectory()) {
47
+ await processDirectory(entryPath);
48
+ }
49
+ else if (entry.name.endsWith(".md")) {
50
+ try {
51
+ const content = await fs.readFile(entryPath, "utf-8");
52
+ const { data: metadata } = matter(content);
53
+ documents.push({
54
+ path: entryPath,
55
+ name: entry.name,
56
+ metadata: metadata,
57
+ });
58
+ }
59
+ catch (error) {
60
+ console.error(`Error processing ${entryPath}: ${error.message}`);
61
+ }
62
+ }
63
+ }
64
+ }
65
+ await processDirectory(normalizedBasePath);
66
+ return {
67
+ content: [{ type: "text", text: `Found ${documents.length} documents` }],
68
+ metadata: {
69
+ documents,
70
+ },
71
+ };
72
+ }
73
+ catch (error) {
74
+ return {
75
+ content: [
76
+ { type: "text", text: `Error listing documents: ${error.message}` },
77
+ ],
78
+ isError: true,
79
+ };
80
+ }
81
+ }
82
+ /**
83
+ * Gets the structure of the documentation directory
84
+ */
85
+ export async function getStructure(basePath, allowedDirectories) {
86
+ try {
87
+ const normalizedBasePath = basePath
88
+ ? await validatePath(basePath, allowedDirectories)
89
+ : allowedDirectories[0];
90
+ async function buildStructure(dirPath, relativePath = "") {
91
+ try {
92
+ const entries = await fs.readdir(dirPath, { withFileTypes: true });
93
+ const children = [];
94
+ let metadata;
95
+ // Check if there's an index.md file to get directory metadata
96
+ const indexPath = path.join(dirPath, "index.md");
97
+ try {
98
+ const indexStat = await fs.stat(indexPath);
99
+ if (indexStat.isFile()) {
100
+ const content = await fs.readFile(indexPath, "utf-8");
101
+ const { data } = matter(content);
102
+ metadata = data;
103
+ }
104
+ }
105
+ catch (error) {
106
+ // No index.md file, that's fine
107
+ }
108
+ // Process all entries
109
+ for (const entry of entries) {
110
+ const entryPath = path.join(dirPath, entry.name);
111
+ const entryRelativePath = path.join(relativePath, entry.name);
112
+ if (entry.isDirectory()) {
113
+ const subDir = await buildStructure(entryPath, entryRelativePath);
114
+ children.push(subDir);
115
+ }
116
+ else if (entry.name.endsWith(".md") && entry.name !== "index.md") {
117
+ try {
118
+ const content = await fs.readFile(entryPath, "utf-8");
119
+ const { data } = matter(content);
120
+ children.push({
121
+ name: entry.name,
122
+ path: entryRelativePath,
123
+ type: "file",
124
+ metadata: data,
125
+ children: [],
126
+ });
127
+ }
128
+ catch (error) {
129
+ children.push({
130
+ name: entry.name,
131
+ path: entryRelativePath,
132
+ type: "file",
133
+ error: error.message,
134
+ children: [],
135
+ });
136
+ }
137
+ }
138
+ }
139
+ // Sort children by order metadata if available, then by name
140
+ children.sort((a, b) => {
141
+ const orderA = a.metadata?.order ?? Infinity;
142
+ const orderB = b.metadata?.order ?? Infinity;
143
+ if (orderA !== orderB) {
144
+ return orderA - orderB;
145
+ }
146
+ return a.name.localeCompare(b.name);
147
+ });
148
+ return {
149
+ name: path.basename(dirPath),
150
+ path: relativePath,
151
+ type: "directory",
152
+ metadata,
153
+ children,
154
+ };
155
+ }
156
+ catch (error) {
157
+ return {
158
+ name: path.basename(dirPath),
159
+ path: relativePath,
160
+ type: "directory",
161
+ error: error.message,
162
+ children: [],
163
+ };
164
+ }
165
+ }
166
+ const structure = await buildStructure(normalizedBasePath);
167
+ return {
168
+ content: [
169
+ {
170
+ type: "text",
171
+ text: "Documentation structure retrieved successfully",
172
+ },
173
+ ],
174
+ metadata: {
175
+ structure,
176
+ },
177
+ };
178
+ }
179
+ catch (error) {
180
+ return {
181
+ content: [
182
+ { type: "text", text: `Error getting structure: ${error.message}` },
183
+ ],
184
+ isError: true,
185
+ };
186
+ }
187
+ }
188
+ /**
189
+ * Gets the navigation structure for the documentation
190
+ */
191
+ export async function getNavigation(basePath, allowedDirectories) {
192
+ try {
193
+ const normalizedBasePath = basePath
194
+ ? await validatePath(basePath, allowedDirectories)
195
+ : allowedDirectories[0];
196
+ // First try to load navigation from .navigation file
197
+ const navigationFilePath = path.join(normalizedBasePath, ".navigation");
198
+ const navigationJsonPath = path.join(normalizedBasePath, "_navigation.json");
199
+ const navigationYmlPath = path.join(normalizedBasePath, "_navigation.yml");
200
+ let navigation = [];
201
+ // Try to load from .navigation file
202
+ try {
203
+ const navigationContent = await fs.readFile(navigationFilePath, "utf-8");
204
+ navigation = JSON.parse(navigationContent);
205
+ console.log("Loaded navigation from .navigation file");
206
+ return {
207
+ content: [
208
+ {
209
+ type: "text",
210
+ text: "Navigation structure loaded from .navigation file",
211
+ },
212
+ ],
213
+ metadata: {
214
+ navigation,
215
+ },
216
+ };
217
+ }
218
+ catch (error) {
219
+ console.log("No .navigation file found or error loading it:", error.message);
220
+ }
221
+ // Try to load from _navigation.json file
222
+ try {
223
+ const navigationContent = await fs.readFile(navigationJsonPath, "utf-8");
224
+ navigation = JSON.parse(navigationContent);
225
+ console.log("Loaded navigation from _navigation.json file");
226
+ return {
227
+ content: [
228
+ {
229
+ type: "text",
230
+ text: "Navigation structure loaded from _navigation.json file",
231
+ },
232
+ ],
233
+ metadata: {
234
+ navigation,
235
+ },
236
+ };
237
+ }
238
+ catch (error) {
239
+ console.log("No _navigation.json file found or error loading it:", error.message);
240
+ }
241
+ // If no navigation file found, build from structure
242
+ console.log("Building navigation from directory structure");
243
+ // Get the structure
244
+ const structureResponse = await getStructure(basePath, allowedDirectories);
245
+ if (structureResponse.isError) {
246
+ return structureResponse;
247
+ }
248
+ const structure = structureResponse.metadata?.structure;
249
+ // Build navigation from structure
250
+ function buildNavigation(structure) {
251
+ const sections = [];
252
+ function processNode(node, parentPath = []) {
253
+ // Skip nodes with errors
254
+ if (node.error) {
255
+ return;
256
+ }
257
+ if (node.type === "directory") {
258
+ // Create a section for this directory
259
+ const section = {
260
+ title: node.metadata?.title || node.name,
261
+ path: node.path ? `/${node.path}` : null,
262
+ items: [],
263
+ order: node.metadata?.order ?? Infinity,
264
+ };
265
+ // Process children
266
+ for (const child of node.children) {
267
+ if (child.type === "file") {
268
+ // Add file as an item
269
+ section.items.push({
270
+ title: child.metadata?.title || child.name.replace(/\.md$/, ""),
271
+ path: `/${child.path}`,
272
+ order: child.metadata?.order ?? Infinity,
273
+ });
274
+ }
275
+ else if (child.type === "directory") {
276
+ // Process subdirectory
277
+ const childSections = processNode(child, [
278
+ ...parentPath,
279
+ node.name,
280
+ ]);
281
+ if (childSections) {
282
+ sections.push(...childSections);
283
+ }
284
+ }
285
+ }
286
+ // Sort items by order
287
+ section.items.sort((a, b) => {
288
+ if (a.order !== b.order) {
289
+ return a.order - b.order;
290
+ }
291
+ return a.title.localeCompare(b.title);
292
+ });
293
+ // Only add section if it has items
294
+ if (section.items.length > 0) {
295
+ sections.push(section);
296
+ }
297
+ return sections;
298
+ }
299
+ return null;
300
+ }
301
+ processNode(structure);
302
+ // Sort sections by order
303
+ sections.sort((a, b) => {
304
+ if (a.order !== b.order) {
305
+ return a.order - b.order;
306
+ }
307
+ return a.title.localeCompare(b.title);
308
+ });
309
+ return sections;
310
+ }
311
+ navigation = buildNavigation(structure);
312
+ // Add debug logging
313
+ console.log("Navigation structure:", JSON.stringify(navigation, null, 2));
314
+ return {
315
+ content: [
316
+ { type: "text", text: "Navigation structure retrieved successfully" },
317
+ ],
318
+ metadata: {
319
+ navigation,
320
+ },
321
+ };
322
+ }
323
+ catch (error) {
324
+ return {
325
+ content: [
326
+ { type: "text", text: `Error getting navigation: ${error.message}` },
327
+ ],
328
+ isError: true,
329
+ };
330
+ }
331
+ }
332
+ /**
333
+ * Checks the health of documentation
334
+ */
335
+ export async function checkDocumentationHealth(basePath, options, allowedDirectories) {
336
+ try {
337
+ // Set default options
338
+ const checkLinks = options.checkLinks !== false;
339
+ const checkMetadata = options.checkMetadata !== false;
340
+ const checkOrphans = options.checkOrphans !== false;
341
+ const requiredMetadataFields = options.requiredMetadataFields || [
342
+ "title",
343
+ "description",
344
+ "status",
345
+ ];
346
+ // Use the first allowed directory if basePath is empty
347
+ const effectiveBasePath = basePath || allowedDirectories[0];
348
+ // Get all documents
349
+ const docsResult = await listDocuments(effectiveBasePath, allowedDirectories);
350
+ if (docsResult.isError) {
351
+ return docsResult;
352
+ }
353
+ const documents = docsResult.metadata?.documents || [];
354
+ // Get navigation if checking for orphans
355
+ let navigation = [];
356
+ if (checkOrphans) {
357
+ const navResult = await getNavigation(effectiveBasePath, allowedDirectories);
358
+ if (!navResult.isError && navResult.metadata?.navigation) {
359
+ navigation = navResult.metadata.navigation;
360
+ }
361
+ }
362
+ // Initialize health check result
363
+ const healthResult = {
364
+ score: 0,
365
+ totalDocuments: documents.length,
366
+ issues: [],
367
+ metadataCompleteness: 0,
368
+ brokenLinks: 0,
369
+ orphanedDocuments: 0,
370
+ missingReferences: 0,
371
+ documentsByStatus: {},
372
+ documentsByTag: {},
373
+ };
374
+ // Track documents by status and tags
375
+ documents.forEach((doc) => {
376
+ // Track by status
377
+ if (doc.metadata?.status) {
378
+ const status = doc.metadata.status;
379
+ healthResult.documentsByStatus[status] =
380
+ (healthResult.documentsByStatus[status] || 0) + 1;
381
+ }
382
+ // Track by tags
383
+ if (doc.metadata?.tags && Array.isArray(doc.metadata.tags)) {
384
+ doc.metadata.tags.forEach((tag) => {
385
+ healthResult.documentsByTag[tag] =
386
+ (healthResult.documentsByTag[tag] || 0) + 1;
387
+ });
388
+ }
389
+ });
390
+ // Check metadata completeness
391
+ if (checkMetadata) {
392
+ let totalFields = 0;
393
+ let missingFields = 0;
394
+ for (const doc of documents) {
395
+ const metadata = doc.metadata || {};
396
+ for (const field of requiredMetadataFields) {
397
+ totalFields++;
398
+ if (!metadata[field]) {
399
+ missingFields++;
400
+ healthResult.issues.push({
401
+ path: doc.path,
402
+ type: "missing_metadata",
403
+ severity: "error",
404
+ message: `Missing required metadata field: ${field}`,
405
+ details: { field },
406
+ });
407
+ }
408
+ }
409
+ }
410
+ // Calculate metadata completeness percentage
411
+ healthResult.metadataCompleteness =
412
+ totalFields > 0
413
+ ? Math.round(((totalFields - missingFields) / totalFields) * 100)
414
+ : 100;
415
+ }
416
+ // Check for orphaned documents (not in navigation)
417
+ if (checkOrphans) {
418
+ // Completely disable orphaned documents check
419
+ console.log("Orphaned documents check is disabled");
420
+ healthResult.orphanedDocuments = 0;
421
+ // Ensure we don't have any orphaned document issues in the result
422
+ healthResult.issues = healthResult.issues.filter((issue) => issue.type !== "orphaned");
423
+ }
424
+ // Check for broken links
425
+ if (checkLinks) {
426
+ // Create a set of all valid document paths
427
+ const validPaths = new Set();
428
+ for (const doc of documents) {
429
+ validPaths.add(doc.path);
430
+ // Also add without .md extension
431
+ validPaths.add(doc.path.replace(/\.md$/, ""));
432
+ }
433
+ // Check each document for links
434
+ for (const doc of documents) {
435
+ try {
436
+ const content = await fs.readFile(doc.path, "utf-8");
437
+ // Find markdown links [text](link)
438
+ const linkRegex = /\[([^\]]+)\]\(([^)]+)\)/g;
439
+ let match;
440
+ while ((match = linkRegex.exec(content)) !== null) {
441
+ const link = match[2];
442
+ // Only check internal links (not external URLs)
443
+ if (!link.startsWith("http://") && !link.startsWith("https://")) {
444
+ // Resolve the link relative to the document
445
+ const docDir = path.dirname(doc.path);
446
+ const resolvedPath = path.resolve(docDir, link);
447
+ // Check if the link target exists
448
+ if (!validPaths.has(resolvedPath) &&
449
+ !validPaths.has(resolvedPath + ".md")) {
450
+ healthResult.brokenLinks++;
451
+ healthResult.issues.push({
452
+ path: doc.path,
453
+ type: "broken_link",
454
+ severity: "error",
455
+ message: `Broken link: ${link}`,
456
+ details: { link, linkText: match[1] },
457
+ });
458
+ }
459
+ }
460
+ }
461
+ }
462
+ catch (error) {
463
+ // Skip files that can't be read
464
+ console.error(`Error reading file ${doc.path}:`, error);
465
+ }
466
+ }
467
+ }
468
+ // Calculate health score
469
+ // The score is based on:
470
+ // - Metadata completeness (70%)
471
+ // - No broken links (30%)
472
+ // - Orphaned documents check is disabled
473
+ const metadataScore = healthResult.metadataCompleteness * 0.7;
474
+ const brokenLinksScore = healthResult.brokenLinks === 0
475
+ ? 30
476
+ : Math.max(0, 30 - (healthResult.brokenLinks / healthResult.totalDocuments) * 100);
477
+ // Calculate the final score
478
+ healthResult.score = Math.round(metadataScore + brokenLinksScore);
479
+ // Create a clean result object to ensure proper JSON formatting
480
+ const finalResult = {
481
+ score: healthResult.score,
482
+ totalDocuments: healthResult.totalDocuments,
483
+ issues: healthResult.issues,
484
+ metadataCompleteness: healthResult.metadataCompleteness,
485
+ brokenLinks: healthResult.brokenLinks,
486
+ orphanedDocuments: 0,
487
+ missingReferences: healthResult.missingReferences,
488
+ documentsByStatus: healthResult.documentsByStatus,
489
+ documentsByTag: healthResult.documentsByTag,
490
+ };
491
+ return {
492
+ content: [
493
+ {
494
+ type: "text",
495
+ text: `Documentation health check completed. Overall health score: ${finalResult.score}%`,
496
+ },
497
+ ],
498
+ metadata: finalResult,
499
+ };
500
+ }
501
+ catch (error) {
502
+ return {
503
+ content: [
504
+ {
505
+ type: "text",
506
+ text: `Error checking documentation health: ${error.message}`,
507
+ },
508
+ ],
509
+ isError: true,
510
+ };
511
+ }
512
+ }
513
+ //# sourceMappingURL=docs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs.js","sourceRoot":"","sources":["../../src/handlers/docs.ts"],"names":[],"mappings":"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"}