@arabold/docs-mcp-server 1.6.0 → 1.7.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.
@@ -0,0 +1,124 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __commonJS = (cb, mod) => function __require() {
8
+ return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
9
+ };
10
+ var __export = (target, all) => {
11
+ for (var name in all)
12
+ __defProp(target, name, { get: all[name], enumerable: true });
13
+ };
14
+ var __copyProps = (to, from, except, desc) => {
15
+ if (from && typeof from === "object" || typeof from === "function") {
16
+ for (let key of __getOwnPropNames(from))
17
+ if (!__hasOwnProp.call(to, key) && key !== except)
18
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
19
+ }
20
+ return to;
21
+ };
22
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
23
+ // If the importer is in node compatibility mode or this is not an ESM
24
+ // file that has been converted to a CommonJS file using a Babel-
25
+ // compatible transform (i.e. "__esModule" has not been set), then set
26
+ // "default" to the CommonJS "module.exports" for node compatibility.
27
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
28
+ mod
29
+ ));
30
+
31
+ // src/store/schema.ts
32
+ var VECTOR_DIMENSION = 1536;
33
+ var createTablesSQL = `
34
+ -- Documents table
35
+ CREATE TABLE IF NOT EXISTS documents(
36
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
37
+ library TEXT NOT NULL,
38
+ version TEXT NOT NULL DEFAULT '',
39
+ url TEXT NOT NULL,
40
+ content TEXT,
41
+ metadata JSON,
42
+ sort_order INTEGER NOT NULL,
43
+ UNIQUE(url, library, version, sort_order)
44
+ );
45
+
46
+ -- Indexes
47
+ CREATE INDEX IF NOT EXISTS idx_documents_library_lower ON documents(lower(library));
48
+ CREATE INDEX IF NOT EXISTS idx_documents_version_lower ON documents(lower(library), lower(version));
49
+
50
+ -- Create Embeddings virtual table
51
+ CREATE VIRTUAL TABLE IF NOT EXISTS documents_vec USING vec0(
52
+ library TEXT NOT NULL,
53
+ version TEXT NOT NULL,
54
+ embedding FLOAT[${VECTOR_DIMENSION}]
55
+ );
56
+
57
+ -- Create FTS5 virtual table
58
+ CREATE VIRTUAL TABLE IF NOT EXISTS documents_fts USING fts5(
59
+ content,
60
+ title,
61
+ url,
62
+ path,
63
+ tokenize='porter unicode61',
64
+ content='documents',
65
+ content_rowid='id'
66
+ );
67
+
68
+ -- Delete trigger to maintain FTS index
69
+ CREATE TRIGGER IF NOT EXISTS documents_fts_after_delete AFTER DELETE ON documents BEGIN
70
+ INSERT INTO documents_fts(documents_fts, rowid, content, title, url, path)
71
+ VALUES('delete', old.id, old.content, json_extract(old.metadata, '$.title'), old.url, json_extract(old.metadata, '$.path'));
72
+ END;
73
+
74
+ -- Update trigger to maintain FTS index
75
+ CREATE TRIGGER IF NOT EXISTS documents_fts_after_update AFTER UPDATE ON documents BEGIN
76
+ INSERT INTO documents_fts(documents_fts, rowid, content, title, url, path)
77
+ VALUES('delete', old.id, old.content, json_extract(old.metadata, '$.title'), old.url, json_extract(old.metadata, '$.path'));
78
+ INSERT INTO documents_fts(rowid, content, title, url, path)
79
+ VALUES(new.id, new.content, json_extract(new.metadata, '$.title'), new.url, json_extract(new.metadata, '$.path'));
80
+ END;
81
+
82
+ -- Insert trigger to maintain FTS index
83
+ CREATE TRIGGER IF NOT EXISTS documents_fts_after_insert AFTER INSERT ON documents BEGIN
84
+ INSERT INTO documents_fts(rowid, content, title, url, path)
85
+ VALUES(new.id, new.content, json_extract(new.metadata, '$.title'), new.url, json_extract(new.metadata, '$.path'));
86
+ END;
87
+ `;
88
+
89
+ // src/store/errors.ts
90
+ var StoreError = class extends Error {
91
+ constructor(message, cause) {
92
+ super(cause ? `${message} caused by ${cause}` : message);
93
+ this.cause = cause;
94
+ this.name = this.constructor.name;
95
+ const causeError = cause instanceof Error ? cause : cause ? new Error(String(cause)) : void 0;
96
+ if (causeError?.stack) {
97
+ this.stack = causeError.stack;
98
+ }
99
+ }
100
+ };
101
+ var DimensionError = class extends StoreError {
102
+ constructor(modelName, modelDimension, dbDimension) {
103
+ super(
104
+ `Model "${modelName}" produces ${modelDimension}-dimensional vectors, which exceeds the database's fixed dimension of ${dbDimension}. Please use a model with dimension \u2264 ${dbDimension}.`
105
+ );
106
+ this.modelName = modelName;
107
+ this.modelDimension = modelDimension;
108
+ this.dbDimension = dbDimension;
109
+ }
110
+ };
111
+ var ConnectionError = class extends StoreError {
112
+ };
113
+
114
+ export {
115
+ __commonJS,
116
+ __export,
117
+ __toESM,
118
+ StoreError,
119
+ DimensionError,
120
+ ConnectionError,
121
+ VECTOR_DIMENSION,
122
+ createTablesSQL
123
+ };
124
+ //# sourceMappingURL=chunk-YCXNASA6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/store/schema.ts","../src/store/errors.ts"],"sourcesContent":["/** Default vector dimension used across the application */\nexport const VECTOR_DIMENSION = 1536;\n\n// Main table and index creation SQL\nexport const createTablesSQL = `\n -- Documents table\n CREATE TABLE IF NOT EXISTS documents(\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n library TEXT NOT NULL,\n version TEXT NOT NULL DEFAULT '',\n url TEXT NOT NULL,\n content TEXT,\n metadata JSON,\n sort_order INTEGER NOT NULL,\n UNIQUE(url, library, version, sort_order)\n );\n\n -- Indexes\n CREATE INDEX IF NOT EXISTS idx_documents_library_lower ON documents(lower(library));\n CREATE INDEX IF NOT EXISTS idx_documents_version_lower ON documents(lower(library), lower(version));\n\n -- Create Embeddings virtual table\n CREATE VIRTUAL TABLE IF NOT EXISTS documents_vec USING vec0(\n library TEXT NOT NULL,\n version TEXT NOT NULL,\n embedding FLOAT[${VECTOR_DIMENSION}]\n );\n\n -- Create FTS5 virtual table\n CREATE VIRTUAL TABLE IF NOT EXISTS documents_fts USING fts5(\n content,\n title,\n url,\n path,\n tokenize='porter unicode61',\n content='documents',\n content_rowid='id'\n );\n\n -- Delete trigger to maintain FTS index\n CREATE TRIGGER IF NOT EXISTS documents_fts_after_delete AFTER DELETE ON documents BEGIN\n INSERT INTO documents_fts(documents_fts, rowid, content, title, url, path) \n VALUES('delete', old.id, old.content, json_extract(old.metadata, '$.title'), old.url, json_extract(old.metadata, '$.path'));\n END;\n\n -- Update trigger to maintain FTS index \n CREATE TRIGGER IF NOT EXISTS documents_fts_after_update AFTER UPDATE ON documents BEGIN\n INSERT INTO documents_fts(documents_fts, rowid, content, title, url, path) \n VALUES('delete', old.id, old.content, json_extract(old.metadata, '$.title'), old.url, json_extract(old.metadata, '$.path'));\n INSERT INTO documents_fts(rowid, content, title, url, path) \n VALUES(new.id, new.content, json_extract(new.metadata, '$.title'), new.url, json_extract(new.metadata, '$.path'));\n END;\n\n -- Insert trigger to maintain FTS index\n CREATE TRIGGER IF NOT EXISTS documents_fts_after_insert AFTER INSERT ON documents BEGIN\n INSERT INTO documents_fts(rowid, content, title, url, path)\n VALUES(new.id, new.content, json_extract(new.metadata, '$.title'), new.url, json_extract(new.metadata, '$.path'));\n END;\n`;\n","class StoreError extends Error {\n constructor(\n message: string,\n public readonly cause?: unknown,\n ) {\n super(cause ? `${message} caused by ${cause}` : message);\n this.name = this.constructor.name;\n\n const causeError =\n cause instanceof Error ? cause : cause ? new Error(String(cause)) : undefined;\n if (causeError?.stack) {\n this.stack = causeError.stack;\n }\n }\n}\n\nclass DimensionError extends StoreError {\n constructor(\n public readonly modelName: string,\n public readonly modelDimension: number,\n public readonly dbDimension: number,\n ) {\n super(\n `Model \"${modelName}\" produces ${modelDimension}-dimensional vectors, ` +\n `which exceeds the database's fixed dimension of ${dbDimension}. ` +\n `Please use a model with dimension ≤ ${dbDimension}.`,\n );\n }\n}\n\nclass ConnectionError extends StoreError {}\n\nclass DocumentNotFoundError extends StoreError {\n constructor(public readonly id: string) {\n super(`Document ${id} not found`);\n }\n}\n\nexport { StoreError, ConnectionError, DocumentNotFoundError, DimensionError };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACO,IAAM,mBAAmB;AAGzB,IAAM,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAqBT,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACzBtC,IAAM,aAAN,cAAyB,MAAM;AAAA,EAC7B,YACE,SACgB,OAChB;AACA,UAAM,QAAQ,GAAG,OAAO,cAAc,KAAK,KAAK,OAAO;AAFvC;AAGhB,SAAK,OAAO,KAAK,YAAY;AAE7B,UAAM,aACJ,iBAAiB,QAAQ,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,IAAI;AACtE,QAAI,YAAY,OAAO;AACrB,WAAK,QAAQ,WAAW;AAAA,IAC1B;AAAA,EACF;AACF;AAEA,IAAM,iBAAN,cAA6B,WAAW;AAAA,EACtC,YACkB,WACA,gBACA,aAChB;AACA;AAAA,MACE,UAAU,SAAS,cAAc,cAAc,yEACM,WAAW,8CACvB,WAAW;AAAA,IACtD;AARgB;AACA;AACA;AAAA,EAOlB;AACF;AAEA,IAAM,kBAAN,cAA8B,WAAW;AAAC;","names":[]}
package/dist/cli.js CHANGED
@@ -7,7 +7,8 @@ import {
7
7
  ScrapeTool,
8
8
  SearchTool,
9
9
  setLogLevel
10
- } from "./chunk-S7C2LRQA.js";
10
+ } from "./chunk-FAZDXJQN.js";
11
+ import "./chunk-YCXNASA6.js";
11
12
 
12
13
  // src/cli.ts
13
14
  import "dotenv/config";
@@ -16,7 +17,7 @@ import { Command } from "commander";
16
17
  // package.json
17
18
  var package_default = {
18
19
  name: "@arabold/docs-mcp-server",
19
- version: "1.5.0",
20
+ version: "1.6.0",
20
21
  description: "MCP server for fetching and searching documentation",
21
22
  type: "module",
22
23
  bin: {
@@ -51,7 +52,10 @@ var package_default = {
51
52
  "db:push": "drizzle-kit push"
52
53
  },
53
54
  dependencies: {
55
+ "@langchain/aws": "^0.1.8",
54
56
  "@langchain/community": "^0.3.34",
57
+ "@langchain/google-genai": "^0.2.3",
58
+ "@langchain/google-vertexai": "^0.2.4",
55
59
  "@langchain/openai": "^0.5.0",
56
60
  "@modelcontextprotocol/sdk": "^1.6.1",
57
61
  axios: "^1.8.3",
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../package.json"],"sourcesContent":["#!/usr/bin/env node\nimport \"dotenv/config\";\nimport { Command } from \"commander\";\nimport packageJson from \"../package.json\";\nimport { PipelineManager } from \"./pipeline/PipelineManager\";\nimport { DocumentManagementService } from \"./store/DocumentManagementService\";\nimport { FindVersionTool, ListLibrariesTool, ScrapeTool, SearchTool } from \"./tools\";\nimport { LogLevel, setLogLevel } from \"./utils/logger\";\n\nconst formatOutput = (data: unknown) => JSON.stringify(data, null, 2);\n\nasync function main() {\n let docService: DocumentManagementService | undefined;\n let pipelineManager: PipelineManager | undefined;\n\n try {\n docService = new DocumentManagementService();\n await docService.initialize();\n\n // Instantiate PipelineManager for CLI use\n pipelineManager = new PipelineManager(docService); // Assign inside try\n // Start the manager for the CLI session\n await pipelineManager.start();\n\n const tools = {\n listLibraries: new ListLibrariesTool(docService),\n findVersion: new FindVersionTool(docService),\n scrape: new ScrapeTool(docService, pipelineManager), // Pass manager\n search: new SearchTool(docService),\n };\n\n const program = new Command();\n\n // Handle cleanup on SIGINT\n process.on(\"SIGINT\", async () => {\n if (pipelineManager) await pipelineManager.stop(); // Check before stopping\n if (docService) await docService.shutdown(); // Check before stopping\n process.exit(0);\n });\n\n program\n .name(\"docs-mcp\")\n .description(\"CLI for managing documentation vector store\")\n .version(packageJson.version)\n // Add global options for logging level\n .option(\"--verbose\", \"Enable verbose (debug) logging\", false)\n .option(\"--silent\", \"Disable all logging except errors\", false);\n\n program\n .command(\"scrape <library> <url>\") // Remove <version> as positional\n .description(\"Scrape and index documentation from a URL\")\n .option(\"-v, --version <string>\", \"Version of the library (optional)\") // Add optional version flag\n .option(\"-p, --max-pages <number>\", \"Maximum pages to scrape\", \"100\")\n .option(\"-d, --max-depth <number>\", \"Maximum navigation depth\", \"3\")\n .option(\"-c, --max-concurrency <number>\", \"Maximum concurrent page requests\", \"3\")\n .option(\"--ignore-errors\", \"Ignore errors during scraping\", true)\n .option(\n \"--scope <scope>\",\n \"Crawling boundary: 'subpages' (default), 'hostname', or 'domain'\",\n (value) => {\n const validScopes = [\"subpages\", \"hostname\", \"domain\"];\n if (!validScopes.includes(value)) {\n console.warn(`Warning: Invalid scope '${value}'. Using default 'subpages'.`);\n return \"subpages\";\n }\n return value;\n },\n \"subpages\",\n )\n .option(\n \"--no-follow-redirects\",\n \"Disable following HTTP redirects (default: follow redirects)\",\n )\n .action(async (library, url, options) => {\n // Update action parameters\n const result = await tools.scrape.execute({\n url,\n library,\n version: options.version, // Get version from options\n options: {\n maxPages: Number.parseInt(options.maxPages),\n maxDepth: Number.parseInt(options.maxDepth),\n maxConcurrency: Number.parseInt(options.maxConcurrency),\n ignoreErrors: options.ignoreErrors,\n scope: options.scope,\n followRedirects: options.followRedirects, // This will be `true` by default, or `false` if --no-follow-redirects is used\n },\n // CLI always waits for completion (default behavior)\n });\n // Type guard to satisfy TypeScript\n if (\"pagesScraped\" in result) {\n console.log(`✅ Successfully scraped ${result.pagesScraped} pages`);\n } else {\n // This branch should not be hit by the CLI\n console.log(`🚀 Scraping job started with ID: ${result.jobId}`);\n }\n });\n\n program\n .command(\"search <library> <query>\") // Remove <version> as positional\n .description(\n \"Search documents in a library. Version matching examples:\\n\" +\n \" - search react --version 18.0.0 'hooks' -> matches docs for React 18.0.0 or earlier versions\\n\" +\n \" - search react --version 18.0.0 'hooks' --exact-match -> only matches React 18.0.0\\n\" +\n \" - search typescript --version 5.x 'types' -> matches any TypeScript 5.x.x version\\n\" +\n \" - search typescript --version 5.2.x 'types' -> matches any TypeScript 5.2.x version\",\n )\n .option(\n \"-v, --version <string>\", // Add optional version flag\n \"Version of the library (optional, supports ranges)\",\n )\n .option(\"-l, --limit <number>\", \"Maximum number of results\", \"5\")\n .option(\n \"-e, --exact-match\",\n \"Only use exact version match (e.g., '18.0.0' matches only 18.0.0, not 17.x.x) (default: false)\",\n false,\n )\n .action(async (library, query, options) => {\n // Update action parameters\n const result = await tools.search.execute({\n library,\n version: options.version, // Get version from options\n query,\n limit: Number.parseInt(options.limit),\n exactMatch: options.exactMatch,\n });\n console.log(formatOutput(result.results));\n });\n\n program\n .command(\"list\")\n .description(\"List all available libraries and their versions\")\n .action(async () => {\n const result = await tools.listLibraries.execute();\n console.log(formatOutput(result.libraries));\n });\n\n program\n .command(\"find-version <library>\") // Remove [targetVersion] positional\n .description(\"Find the best matching version for a library\")\n .option(\n \"-v, --version <string>\", // Add optional version flag\n \"Target version to match (optional, supports ranges)\",\n )\n .action(async (library, options) => {\n // Update action parameters\n const versionInfo = await tools.findVersion.execute({\n library,\n targetVersion: options.version, // Get version from options\n });\n // findVersion.execute now returns a string, handle potential error messages within it\n if (!versionInfo) {\n // Should not happen with current tool logic, but good practice\n throw new Error(\"Failed to get version information\");\n }\n console.log(versionInfo); // Log the descriptive string from the tool\n });\n\n program\n .command(\"remove <library>\") // Library as positional argument\n .description(\"Remove documents for a specific library and version\")\n .option(\n \"-v, --version <string>\",\n \"Version to remove (optional, removes unversioned if omitted)\",\n )\n .action(async (library, options) => {\n // library is now the first arg\n if (!docService) {\n throw new Error(\"Document service not initialized.\");\n }\n const { version } = options; // Get version from options\n try {\n await docService.removeAllDocuments(library, version);\n console.log(\n `✅ Successfully removed documents for ${library}${version ? `@${version}` : \" (unversioned)\"}.`,\n );\n } catch (error) {\n console.error(\n `❌ Failed to remove documents for ${library}${version ? `@${version}` : \" (unversioned)\"}:`,\n error instanceof Error ? error.message : String(error),\n );\n // Re-throw to trigger the main catch block for shutdown\n throw error;\n }\n });\n\n // Hook to set log level after parsing global options but before executing command action\n program.hook(\"preAction\", (thisCommand) => {\n // Global options are attached to the program (thisCommand)\n const options = thisCommand.opts();\n if (options.silent) {\n // If silent is true, it overrides verbose\n setLogLevel(LogLevel.ERROR);\n } else if (options.verbose) {\n setLogLevel(LogLevel.DEBUG);\n }\n // Otherwise, the default LogLevel.INFO remains set from logger.ts\n });\n\n await program.parseAsync();\n } catch (error) {\n console.error(\"Error:\", error instanceof Error ? error.message : String(error));\n if (pipelineManager) await pipelineManager.stop(); // Check before stopping\n if (docService) await docService.shutdown();\n process.exit(1);\n }\n\n // Clean shutdown after successful execution\n if (pipelineManager) await pipelineManager.stop(); // Check before stopping\n await docService.shutdown();\n process.exit(0);\n}\n\nmain().catch((error) => {\n console.error(\"Fatal error:\", error);\n process.exit(1);\n});\n","{\n \"name\": \"@arabold/docs-mcp-server\",\n \"version\": \"1.5.0\",\n \"description\": \"MCP server for fetching and searching documentation\",\n \"type\": \"module\",\n \"bin\": {\n \"docs-server\": \"dist/server.js\",\n \"docs-cli\": \"dist/cli.js\"\n },\n \"license\": \"MIT\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/arabold/docs-mcp-server.git\"\n },\n \"files\": [\n \"dist\",\n \"README.md\",\n \"LICENSE\",\n \"package.json\"\n ],\n \"scripts\": {\n \"prepare\": \"husky || true\",\n \"build\": \"tsup\",\n \"cli\": \"node --enable-source-maps dist/cli.js\",\n \"start\": \"node --enable-source-maps dist/server.js\",\n \"dev:cli\": \"npm run build && node --enable-source-maps dist/cli.js\",\n \"server\": \"node --enable-source-maps --watch dist/server.js\",\n \"dev:server\": \"run-p \\\"build -- --watch\\\" \\\"server\\\"\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"test:coverage\": \"vitest run --coverage\",\n \"lint\": \"biome check .\",\n \"format\": \"biome format . --write\",\n \"db:generate\": \"drizzle-kit generate\",\n \"db:push\": \"drizzle-kit push\"\n },\n \"dependencies\": {\n \"@langchain/community\": \"^0.3.34\",\n \"@langchain/openai\": \"^0.5.0\",\n \"@modelcontextprotocol/sdk\": \"^1.6.1\",\n \"axios\": \"^1.8.3\",\n \"axios-retry\": \"^4.5.0\",\n \"better-sqlite3\": \"^11.9.1\",\n \"commander\": \"^13.1.0\",\n \"dompurify\": \"^3.2.4\",\n \"dotenv\": \"^16.4.7\",\n \"drizzle-orm\": \"^0.41.0\",\n \"env-paths\": \"^3.0.0\",\n \"fuse.js\": \"^7.1.0\",\n \"jsdom\": \"^26.0.0\",\n \"langchain\": \"0.3.19\",\n \"pg\": \"^8.14.0\",\n \"psl\": \"^1.15.0\",\n \"remark\": \"^15.0.1\",\n \"remark-gfm\": \"^4.0.1\",\n \"remark-html\": \"^16.0.1\",\n \"semver\": \"^7.7.1\",\n \"sqlite-vec\": \"^0.1.7-alpha.2\",\n \"turndown\": \"^7.2.0\",\n \"zod\": \"^3.24.2\"\n },\n \"devDependencies\": {\n \"@biomejs/biome\": \"1.9.4\",\n \"@commitlint/cli\": \"^19.8.0\",\n \"@commitlint/config-conventional\": \"^19.8.0\",\n \"@semantic-release/changelog\": \"^6.0.3\",\n \"@semantic-release/git\": \"^10.0.1\",\n \"@semantic-release/github\": \"^11.0.1\",\n \"@semantic-release/npm\": \"^12.0.1\",\n \"@types/better-sqlite3\": \"^7.6.12\",\n \"@types/jsdom\": \"~21.1.7\",\n \"@types/lint-staged\": \"~13.3.0\",\n \"@types/node\": \"^20.17.23\",\n \"@types/node-fetch\": \"^2.6.12\",\n \"@types/pg\": \"~8.11.11\",\n \"@types/psl\": \"^1.1.3\",\n \"@types/semver\": \"^7.5.8\",\n \"@types/turndown\": \"^5.0.5\",\n \"drizzle-kit\": \"^0.30.5\",\n \"husky\": \"^9.1.7\",\n \"lint-staged\": \"^15.5.0\",\n \"memfs\": \"^4.17.0\",\n \"npm-run-all\": \"^4.1.5\",\n \"semantic-release\": \"^24.2.3\",\n \"tsup\": \"^8.4.0\",\n \"typescript\": \"^5.8.2\",\n \"vite\": \"^6.2.1\",\n \"vitest\": \"^3.0.8\"\n },\n \"engines\": {\n \"node\": \">=20.0.0\"\n },\n \"lint-staged\": {\n \"*.{js,ts,jsx,tsx,json,md}\": [\n \"biome check --apply --no-errors-on-unmatched\",\n \"biome format --write --no-errors-on-unmatched\"\n ]\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/cli.ts","../package.json"],"sourcesContent":["#!/usr/bin/env node\nimport \"dotenv/config\";\nimport { Command } from \"commander\";\nimport packageJson from \"../package.json\";\nimport { PipelineManager } from \"./pipeline/PipelineManager\";\nimport { DocumentManagementService } from \"./store/DocumentManagementService\";\nimport { FindVersionTool, ListLibrariesTool, ScrapeTool, SearchTool } from \"./tools\";\nimport { LogLevel, setLogLevel } from \"./utils/logger\";\n\nconst formatOutput = (data: unknown) => JSON.stringify(data, null, 2);\n\nasync function main() {\n let docService: DocumentManagementService | undefined;\n let pipelineManager: PipelineManager | undefined;\n\n try {\n docService = new DocumentManagementService();\n await docService.initialize();\n\n // Instantiate PipelineManager for CLI use\n pipelineManager = new PipelineManager(docService); // Assign inside try\n // Start the manager for the CLI session\n await pipelineManager.start();\n\n const tools = {\n listLibraries: new ListLibrariesTool(docService),\n findVersion: new FindVersionTool(docService),\n scrape: new ScrapeTool(docService, pipelineManager), // Pass manager\n search: new SearchTool(docService),\n };\n\n const program = new Command();\n\n // Handle cleanup on SIGINT\n process.on(\"SIGINT\", async () => {\n if (pipelineManager) await pipelineManager.stop(); // Check before stopping\n if (docService) await docService.shutdown(); // Check before stopping\n process.exit(0);\n });\n\n program\n .name(\"docs-mcp\")\n .description(\"CLI for managing documentation vector store\")\n .version(packageJson.version)\n // Add global options for logging level\n .option(\"--verbose\", \"Enable verbose (debug) logging\", false)\n .option(\"--silent\", \"Disable all logging except errors\", false);\n\n program\n .command(\"scrape <library> <url>\") // Remove <version> as positional\n .description(\"Scrape and index documentation from a URL\")\n .option(\"-v, --version <string>\", \"Version of the library (optional)\") // Add optional version flag\n .option(\"-p, --max-pages <number>\", \"Maximum pages to scrape\", \"100\")\n .option(\"-d, --max-depth <number>\", \"Maximum navigation depth\", \"3\")\n .option(\"-c, --max-concurrency <number>\", \"Maximum concurrent page requests\", \"3\")\n .option(\"--ignore-errors\", \"Ignore errors during scraping\", true)\n .option(\n \"--scope <scope>\",\n \"Crawling boundary: 'subpages' (default), 'hostname', or 'domain'\",\n (value) => {\n const validScopes = [\"subpages\", \"hostname\", \"domain\"];\n if (!validScopes.includes(value)) {\n console.warn(`Warning: Invalid scope '${value}'. Using default 'subpages'.`);\n return \"subpages\";\n }\n return value;\n },\n \"subpages\",\n )\n .option(\n \"--no-follow-redirects\",\n \"Disable following HTTP redirects (default: follow redirects)\",\n )\n .action(async (library, url, options) => {\n // Update action parameters\n const result = await tools.scrape.execute({\n url,\n library,\n version: options.version, // Get version from options\n options: {\n maxPages: Number.parseInt(options.maxPages),\n maxDepth: Number.parseInt(options.maxDepth),\n maxConcurrency: Number.parseInt(options.maxConcurrency),\n ignoreErrors: options.ignoreErrors,\n scope: options.scope,\n followRedirects: options.followRedirects, // This will be `true` by default, or `false` if --no-follow-redirects is used\n },\n // CLI always waits for completion (default behavior)\n });\n // Type guard to satisfy TypeScript\n if (\"pagesScraped\" in result) {\n console.log(`✅ Successfully scraped ${result.pagesScraped} pages`);\n } else {\n // This branch should not be hit by the CLI\n console.log(`🚀 Scraping job started with ID: ${result.jobId}`);\n }\n });\n\n program\n .command(\"search <library> <query>\") // Remove <version> as positional\n .description(\n \"Search documents in a library. Version matching examples:\\n\" +\n \" - search react --version 18.0.0 'hooks' -> matches docs for React 18.0.0 or earlier versions\\n\" +\n \" - search react --version 18.0.0 'hooks' --exact-match -> only matches React 18.0.0\\n\" +\n \" - search typescript --version 5.x 'types' -> matches any TypeScript 5.x.x version\\n\" +\n \" - search typescript --version 5.2.x 'types' -> matches any TypeScript 5.2.x version\",\n )\n .option(\n \"-v, --version <string>\", // Add optional version flag\n \"Version of the library (optional, supports ranges)\",\n )\n .option(\"-l, --limit <number>\", \"Maximum number of results\", \"5\")\n .option(\n \"-e, --exact-match\",\n \"Only use exact version match (e.g., '18.0.0' matches only 18.0.0, not 17.x.x) (default: false)\",\n false,\n )\n .action(async (library, query, options) => {\n // Update action parameters\n const result = await tools.search.execute({\n library,\n version: options.version, // Get version from options\n query,\n limit: Number.parseInt(options.limit),\n exactMatch: options.exactMatch,\n });\n console.log(formatOutput(result.results));\n });\n\n program\n .command(\"list\")\n .description(\"List all available libraries and their versions\")\n .action(async () => {\n const result = await tools.listLibraries.execute();\n console.log(formatOutput(result.libraries));\n });\n\n program\n .command(\"find-version <library>\") // Remove [targetVersion] positional\n .description(\"Find the best matching version for a library\")\n .option(\n \"-v, --version <string>\", // Add optional version flag\n \"Target version to match (optional, supports ranges)\",\n )\n .action(async (library, options) => {\n // Update action parameters\n const versionInfo = await tools.findVersion.execute({\n library,\n targetVersion: options.version, // Get version from options\n });\n // findVersion.execute now returns a string, handle potential error messages within it\n if (!versionInfo) {\n // Should not happen with current tool logic, but good practice\n throw new Error(\"Failed to get version information\");\n }\n console.log(versionInfo); // Log the descriptive string from the tool\n });\n\n program\n .command(\"remove <library>\") // Library as positional argument\n .description(\"Remove documents for a specific library and version\")\n .option(\n \"-v, --version <string>\",\n \"Version to remove (optional, removes unversioned if omitted)\",\n )\n .action(async (library, options) => {\n // library is now the first arg\n if (!docService) {\n throw new Error(\"Document service not initialized.\");\n }\n const { version } = options; // Get version from options\n try {\n await docService.removeAllDocuments(library, version);\n console.log(\n `✅ Successfully removed documents for ${library}${version ? `@${version}` : \" (unversioned)\"}.`,\n );\n } catch (error) {\n console.error(\n `❌ Failed to remove documents for ${library}${version ? `@${version}` : \" (unversioned)\"}:`,\n error instanceof Error ? error.message : String(error),\n );\n // Re-throw to trigger the main catch block for shutdown\n throw error;\n }\n });\n\n // Hook to set log level after parsing global options but before executing command action\n program.hook(\"preAction\", (thisCommand) => {\n // Global options are attached to the program (thisCommand)\n const options = thisCommand.opts();\n if (options.silent) {\n // If silent is true, it overrides verbose\n setLogLevel(LogLevel.ERROR);\n } else if (options.verbose) {\n setLogLevel(LogLevel.DEBUG);\n }\n // Otherwise, the default LogLevel.INFO remains set from logger.ts\n });\n\n await program.parseAsync();\n } catch (error) {\n console.error(\"Error:\", error instanceof Error ? error.message : String(error));\n if (pipelineManager) await pipelineManager.stop(); // Check before stopping\n if (docService) await docService.shutdown();\n process.exit(1);\n }\n\n // Clean shutdown after successful execution\n if (pipelineManager) await pipelineManager.stop(); // Check before stopping\n await docService.shutdown();\n process.exit(0);\n}\n\nmain().catch((error) => {\n console.error(\"Fatal error:\", error);\n process.exit(1);\n});\n","{\n \"name\": \"@arabold/docs-mcp-server\",\n \"version\": \"1.6.0\",\n \"description\": \"MCP server for fetching and searching documentation\",\n \"type\": \"module\",\n \"bin\": {\n \"docs-server\": \"dist/server.js\",\n \"docs-cli\": \"dist/cli.js\"\n },\n \"license\": \"MIT\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/arabold/docs-mcp-server.git\"\n },\n \"files\": [\n \"dist\",\n \"README.md\",\n \"LICENSE\",\n \"package.json\"\n ],\n \"scripts\": {\n \"prepare\": \"husky || true\",\n \"build\": \"tsup\",\n \"cli\": \"node --enable-source-maps dist/cli.js\",\n \"start\": \"node --enable-source-maps dist/server.js\",\n \"dev:cli\": \"npm run build && node --enable-source-maps dist/cli.js\",\n \"server\": \"node --enable-source-maps --watch dist/server.js\",\n \"dev:server\": \"run-p \\\"build -- --watch\\\" \\\"server\\\"\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"test:coverage\": \"vitest run --coverage\",\n \"lint\": \"biome check .\",\n \"format\": \"biome format . --write\",\n \"db:generate\": \"drizzle-kit generate\",\n \"db:push\": \"drizzle-kit push\"\n },\n \"dependencies\": {\n \"@langchain/aws\": \"^0.1.8\",\n \"@langchain/community\": \"^0.3.34\",\n \"@langchain/google-genai\": \"^0.2.3\",\n \"@langchain/google-vertexai\": \"^0.2.4\",\n \"@langchain/openai\": \"^0.5.0\",\n \"@modelcontextprotocol/sdk\": \"^1.6.1\",\n \"axios\": \"^1.8.3\",\n \"axios-retry\": \"^4.5.0\",\n \"better-sqlite3\": \"^11.9.1\",\n \"commander\": \"^13.1.0\",\n \"dompurify\": \"^3.2.4\",\n \"dotenv\": \"^16.4.7\",\n \"drizzle-orm\": \"^0.41.0\",\n \"env-paths\": \"^3.0.0\",\n \"fuse.js\": \"^7.1.0\",\n \"jsdom\": \"^26.0.0\",\n \"langchain\": \"0.3.19\",\n \"pg\": \"^8.14.0\",\n \"psl\": \"^1.15.0\",\n \"remark\": \"^15.0.1\",\n \"remark-gfm\": \"^4.0.1\",\n \"remark-html\": \"^16.0.1\",\n \"semver\": \"^7.7.1\",\n \"sqlite-vec\": \"^0.1.7-alpha.2\",\n \"turndown\": \"^7.2.0\",\n \"zod\": \"^3.24.2\"\n },\n \"devDependencies\": {\n \"@biomejs/biome\": \"1.9.4\",\n \"@commitlint/cli\": \"^19.8.0\",\n \"@commitlint/config-conventional\": \"^19.8.0\",\n \"@semantic-release/changelog\": \"^6.0.3\",\n \"@semantic-release/git\": \"^10.0.1\",\n \"@semantic-release/github\": \"^11.0.1\",\n \"@semantic-release/npm\": \"^12.0.1\",\n \"@types/better-sqlite3\": \"^7.6.12\",\n \"@types/jsdom\": \"~21.1.7\",\n \"@types/lint-staged\": \"~13.3.0\",\n \"@types/node\": \"^20.17.23\",\n \"@types/node-fetch\": \"^2.6.12\",\n \"@types/pg\": \"~8.11.11\",\n \"@types/psl\": \"^1.1.3\",\n \"@types/semver\": \"^7.5.8\",\n \"@types/turndown\": \"^5.0.5\",\n \"drizzle-kit\": \"^0.30.5\",\n \"husky\": \"^9.1.7\",\n \"lint-staged\": \"^15.5.0\",\n \"memfs\": \"^4.17.0\",\n \"npm-run-all\": \"^4.1.5\",\n \"semantic-release\": \"^24.2.3\",\n \"tsup\": \"^8.4.0\",\n \"typescript\": \"^5.8.2\",\n \"vite\": \"^6.2.1\",\n \"vitest\": \"^3.0.8\"\n },\n \"engines\": {\n \"node\": \">=20.0.0\"\n },\n \"lint-staged\": {\n \"*.{js,ts,jsx,tsx,json,md}\": [\n \"biome check --apply --no-errors-on-unmatched\",\n \"biome format --write --no-errors-on-unmatched\"\n ]\n }\n}\n"],"mappings":"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","names":[]}
package/dist/server.js CHANGED
@@ -14,7 +14,8 @@ import {
14
14
  VersionNotFoundError,
15
15
  logger,
16
16
  setLogLevel
17
- } from "./chunk-S7C2LRQA.js";
17
+ } from "./chunk-FAZDXJQN.js";
18
+ import "./chunk-YCXNASA6.js";
18
19
 
19
20
  // src/mcp/index.ts
20
21
  import "dotenv/config";
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/mcp/index.ts","../src/mcp/utils.ts","../src/server.ts"],"sourcesContent":["#!/usr/bin/env node\nimport \"dotenv/config\";\nimport { McpServer, ResourceTemplate } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { z } from \"zod\";\nimport { PipelineManager } from \"../pipeline/PipelineManager\";\nimport { PipelineJobStatus } from \"../pipeline/types\";\nimport { DocumentManagementService } from \"../store/DocumentManagementService\";\nimport {\n CancelJobTool,\n FindVersionTool,\n GetJobInfoTool,\n ListJobsTool,\n ListLibrariesTool,\n RemoveTool,\n ScrapeTool,\n SearchTool,\n VersionNotFoundError,\n} from \"../tools\";\nimport { LogLevel, logger, setLogLevel } from \"../utils/logger\"; // Import LogLevel and setLogLevel\nimport { createError, createResponse } from \"./utils\";\n\nexport async function startServer() {\n // Set the default log level for the server to ERROR\n setLogLevel(LogLevel.ERROR);\n\n const docService = new DocumentManagementService();\n\n try {\n await docService.initialize();\n\n // Instantiate PipelineManager\n // TODO: Check if concurrency needs to be configurable\n const pipelineManager = new PipelineManager(docService);\n // Start the pipeline manager to process jobs\n await pipelineManager.start(); // Assuming start is async and needed\n\n // Instantiate tools, passing dependencies\n const tools = {\n listLibraries: new ListLibrariesTool(docService),\n findVersion: new FindVersionTool(docService),\n // TODO: Update ScrapeTool constructor if needed to accept PipelineManager\n // ScrapeTool currently uses docService.getPipelineManager() which doesn't exist.\n // Pass both docService and pipelineManager to ScrapeTool constructor\n scrape: new ScrapeTool(docService, pipelineManager),\n search: new SearchTool(docService),\n listJobs: new ListJobsTool(pipelineManager),\n getJobInfo: new GetJobInfoTool(pipelineManager),\n cancelJob: new CancelJobTool(pipelineManager),\n remove: new RemoveTool(docService), // Instantiate RemoveTool\n };\n\n const server = new McpServer(\n {\n name: \"docs-mcp-server\",\n version: \"0.1.0\",\n },\n {\n capabilities: {\n tools: {},\n prompts: {},\n resources: {},\n },\n },\n );\n\n // --- Tool Definitions ---\n\n // Scrape docs tool\n server.tool(\n \"scrape_docs\",\n \"Scrape and index documentation from a URL\",\n {\n url: z.string().url().describe(\"URL of the documentation to scrape\"),\n library: z.string().describe(\"Name of the library\"),\n version: z.string().optional().describe(\"Version of the library\"),\n maxPages: z\n .number()\n .optional()\n .default(100)\n .describe(\"Maximum number of pages to scrape\"),\n maxDepth: z.number().optional().default(3).describe(\"Maximum navigation depth\"),\n scope: z\n .enum([\"subpages\", \"hostname\", \"domain\"])\n .optional()\n .default(\"subpages\")\n .describe(\"Defines the crawling boundary: 'subpages', 'hostname', or 'domain'\"),\n followRedirects: z\n .boolean()\n .optional()\n .default(true)\n .describe(\"Whether to follow HTTP redirects (3xx responses)\"),\n },\n\n async ({ url, library, version, maxPages, maxDepth, scope, followRedirects }) => {\n try {\n // Execute scrape tool without waiting and without progress callback\n const result = await tools.scrape.execute({\n url,\n library,\n version,\n waitForCompletion: false, // Don't wait for completion\n // onProgress: undefined, // Explicitly undefined or omitted\n options: {\n maxPages,\n maxDepth,\n scope,\n followRedirects,\n },\n });\n\n // Check the type of result\n if (\"jobId\" in result) {\n // If we got a jobId back, report that\n return createResponse(`🚀 Scraping job started with ID: ${result.jobId}.`);\n }\n // This case shouldn't happen if waitForCompletion is false, but handle defensively\n return createResponse(\n `Scraping finished immediately (unexpectedly) with ${result.pagesScraped} pages.`,\n );\n } catch (error) {\n // Handle errors during job *enqueueing* or initial setup\n return createError(\n `Failed to scrape documentation: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n },\n );\n\n // Search docs tool (Keep as is)\n server.tool(\n \"search_docs\",\n \"Search indexed documentation. Examples:\\n\" +\n '- {library: \"react\", query: \"how do hooks work\"} -> matches latest version of React\\n' +\n '- {library: \"react\", version: \"18.0.0\", query: \"how do hooks work\"} -> matches React 18.0.0 or earlier\\n' +\n '- {library: \"react\", version: \"18.0.0\", query: \"how do hooks work\", exactMatch: true} -> only React 18.0.0\\n' +\n '- {library: \"typescript\", version: \"5.x\", query: \"ReturnType example\"} -> any TypeScript 5.x.x version\\n' +\n '- {library: \"typescript\", version: \"5.2.x\", query: \"ReturnType example\"} -> any TypeScript 5.2.x version',\n {\n library: z.string().describe(\"Name of the library\"),\n version: z\n .string()\n .optional()\n .describe(\n \"Version of the library (supports exact versions like '18.0.0' or X-Range patterns like '5.x', '5.2.x')\",\n ),\n query: z.string().describe(\"Search query\"),\n limit: z.number().optional().default(5).describe(\"Maximum number of results\"),\n exactMatch: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"Only use exact version match\"),\n },\n async ({ library, version, query, limit, exactMatch }) => {\n try {\n const result = await tools.search.execute({\n library,\n version,\n query,\n limit,\n exactMatch,\n });\n\n const formattedResults = result.results.map(\n (r, i) => `\n------------------------------------------------------------\nResult ${i + 1}: ${r.url}\n\n${r.content}\\n`,\n );\n\n return createResponse(\n `Search results for '${query}' in ${library} v${version}:\n${formattedResults.join(\"\")}`,\n );\n } catch (error) {\n if (error instanceof VersionNotFoundError) {\n const indexedVersions = error.availableVersions\n .filter((v): v is { version: string; indexed: true } => v.indexed)\n .map((v) => v.version);\n return createError(\n indexedVersions.length > 0\n ? `Version not found. Available indexed versions for ${library}: ${indexedVersions.join(\", \")}`\n : `Version not found. No indexed versions available for ${library}.`,\n );\n }\n return createError(\n `Failed to search documentation: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n },\n );\n\n // List libraries tool (Keep as is)\n server.tool(\"list_libraries\", \"List all indexed libraries\", {}, async () => {\n try {\n const result = await tools.listLibraries.execute();\n\n return createResponse(\n `Indexed libraries:\\n${result.libraries.map((lib) => `- ${lib.name}`).join(\"\\n\")}`,\n );\n } catch (error) {\n return createError(\n `Failed to list libraries: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n });\n\n // Find version tool (Keep as is)\n server.tool(\n \"find_version\",\n \"Find best matching version for a library\",\n {\n library: z.string().describe(\"Name of the library\"),\n targetVersion: z\n .string()\n .optional()\n .describe(\n \"Target version to match (supports exact versions like '18.0.0' or X-Range patterns like '5.x', '5.2.x')\",\n ),\n },\n async ({ library, targetVersion }) => {\n try {\n const version = await tools.findVersion.execute({\n library,\n targetVersion,\n });\n\n if (!version) {\n return createError(\"No matching version found\");\n }\n\n return createResponse(`Found matching version: ${version}`);\n } catch (error) {\n return createError(\n `Failed to find version: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n },\n );\n\n // List jobs tool\n server.tool(\n \"list_jobs\",\n \"List pipeline jobs, optionally filtering by status.\",\n {\n status: z\n .nativeEnum(PipelineJobStatus)\n .optional()\n .describe(\"Optional status to filter jobs by.\"),\n },\n async ({ status }) => {\n try {\n const result = await tools.listJobs.execute({ status });\n // Format the simplified job list for display\n const formattedJobs = result.jobs\n .map(\n (\n job, // Use 'any' or define a local type for the simplified structure\n ) =>\n `- ID: ${job.id}\\n Status: ${job.status}\\n Library: ${job.library}\\n Version: ${job.version}\\n Created: ${job.createdAt}${job.startedAt ? `\\n Started: ${job.startedAt}` : \"\"}${job.finishedAt ? `\\n Finished: ${job.finishedAt}` : \"\"}${job.error ? `\\n Error: ${job.error}` : \"\"}`,\n )\n .join(\"\\n\\n\");\n return createResponse(\n result.jobs.length > 0\n ? `Current Jobs:\\n\\n${formattedJobs}`\n : \"No jobs found matching criteria.\",\n );\n } catch (error) {\n return createError(\n `Failed to list jobs: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n },\n );\n\n // Get job info tool\n server.tool(\n \"get_job_info\",\n \"Get the simplified info for a specific pipeline job.\",\n {\n jobId: z.string().uuid().describe(\"The ID of the job to query.\"),\n },\n async ({ jobId }) => {\n try {\n const result = await tools.getJobInfo.execute({ jobId });\n if (!result.job) {\n return createError(`Job with ID ${jobId} not found.`);\n }\n const job = result.job;\n const formattedJob = `- ID: ${job.id}\\n Status: ${job.status}\\n Library: ${job.library}@${job.version}\\n Created: ${job.createdAt}${job.startedAt ? `\\n Started: ${job.startedAt}` : \"\"}${job.finishedAt ? `\\n Finished: ${job.finishedAt}` : \"\"}${job.error ? `\\n Error: ${job.error}` : \"\"}`;\n return createResponse(`Job Info:\\n\\n${formattedJob}`);\n } catch (error) {\n return createError(\n `Failed to get job info for ${jobId}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n },\n );\n\n // Cancel job tool\n server.tool(\n \"cancel_job\",\n \"Attempt to cancel a queued or running pipeline job.\",\n {\n jobId: z.string().uuid().describe(\"The ID of the job to cancel.\"),\n },\n async ({ jobId }) => {\n try {\n const result = await tools.cancelJob.execute({ jobId });\n // Use the message and success status from the tool's result\n if (result.success) {\n return createResponse(result.message);\n }\n // If not successful according to the tool, treat it as an error in MCP\n return createError(result.message);\n } catch (error) {\n // Catch any unexpected errors during the tool execution itself\n return createError(\n `Failed to cancel job ${jobId}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n },\n );\n\n // Remove docs tool\n server.tool(\n \"remove_docs\",\n \"Remove indexed documentation for a library version.\",\n {\n library: z.string().describe(\"Name of the library\"),\n version: z\n .string()\n .optional()\n .describe(\"Version of the library (optional, removes unversioned if omitted)\"),\n },\n async ({ library, version }) => {\n try {\n // Execute the remove tool logic\n const result = await tools.remove.execute({ library, version });\n // Use the message from the tool's successful execution\n return createResponse(result.message);\n } catch (error) {\n // Catch errors thrown by the RemoveTool's execute method\n return createError(\n `Failed to remove documents: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n },\n );\n\n server.prompt(\n \"docs\",\n \"Search indexed documentation\",\n {\n library: z.string().describe(\"Name of the library\"),\n version: z.string().optional().describe(\"Version of the library\"),\n query: z.string().describe(\"Search query\"),\n },\n async ({ library, version, query }) => {\n return {\n messages: [\n {\n role: \"user\",\n content: {\n type: \"text\",\n text: `Please search ${library} ${version || \"\"} documentation for this query: ${query}`,\n },\n },\n ],\n };\n },\n );\n\n server.resource(\n \"libraries\",\n \"docs://libraries\",\n {\n description: \"List all indexed libraries\",\n },\n async (uri: URL) => {\n const result = await tools.listLibraries.execute();\n\n return {\n contents: result.libraries.map((lib) => ({\n uri: new URL(lib.name, uri).href,\n text: lib.name,\n })),\n };\n },\n );\n\n server.resource(\n \"versions\",\n new ResourceTemplate(\"docs://libraries/{library}/versions\", {\n list: undefined,\n }),\n {\n description: \"List all indexed versions for a library\",\n },\n async (uri: URL, { library }) => {\n const result = await tools.listLibraries.execute();\n\n const lib = result.libraries.find((l) => l.name === library);\n if (!lib) {\n return { contents: [] };\n }\n\n return {\n contents: lib.versions.map((v) => ({\n uri: new URL(v.version, uri).href,\n text: v.version,\n })),\n };\n },\n );\n\n /**\n * Resource handler for listing pipeline jobs.\n * Supports filtering by status via a query parameter (e.g., ?status=running).\n * URI: docs://jobs[?status=<status>]\n */\n server.resource(\n \"jobs\",\n \"docs://jobs\",\n {\n description: \"List pipeline jobs, optionally filtering by status.\",\n mimeType: \"application/json\",\n },\n async (uri: URL) => {\n const statusParam = uri.searchParams.get(\"status\");\n let statusFilter: PipelineJobStatus | undefined;\n\n // Validate status parameter if provided\n if (statusParam) {\n const validation = z.nativeEnum(PipelineJobStatus).safeParse(statusParam);\n if (validation.success) {\n statusFilter = validation.data;\n } else {\n // Handle invalid status - perhaps return an error or ignore?\n // For simplicity, let's ignore invalid status for now and return all jobs.\n // Alternatively, could throw an McpError or return specific error content.\n logger.warn(`Invalid status parameter received: ${statusParam}`);\n }\n }\n\n // Fetch simplified jobs using the ListJobsTool\n const result = await tools.listJobs.execute({ status: statusFilter });\n\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: \"application/json\",\n text: JSON.stringify(result.jobs, null, 2), // Stringify the simplified jobs array\n },\n ],\n };\n },\n );\n\n /**\n * Resource handler for retrieving a specific pipeline job by its ID.\n * URI Template: docs://jobs/{jobId}\n */\n server.resource(\n \"job\", // A distinct name for this specific resource type\n new ResourceTemplate(\"docs://jobs/{jobId}\", { list: undefined }),\n {\n description: \"Get details for a specific pipeline job by ID.\",\n mimeType: \"application/json\",\n },\n async (uri: URL, { jobId }) => {\n // Validate jobId format if necessary (basic check)\n if (typeof jobId !== \"string\" || jobId.length === 0) {\n // Handle invalid jobId format - return empty or error\n logger.warn(`Invalid jobId received in URI: ${jobId}`);\n return { contents: [] }; // Return empty content for invalid ID format\n }\n\n // Fetch the simplified job info using GetJobInfoTool\n const result = await tools.getJobInfo.execute({ jobId });\n\n // result.job is either the simplified job object or null\n if (!result.job) {\n // Job not found, return empty content\n return { contents: [] };\n }\n\n // Job found, return its simplified details as JSON\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: \"application/json\",\n text: JSON.stringify(result.job, null, 2), // Stringify the simplified job object\n },\n ],\n };\n },\n );\n\n // Start server\n const transport = new StdioServerTransport();\n await server.connect(transport);\n logger.info(\"Documentation MCP server running on stdio\");\n\n // Handle cleanup\n process.on(\"SIGINT\", async () => {\n await pipelineManager.stop(); // Stop the pipeline manager\n await docService.shutdown();\n await server.close();\n process.exit(0);\n });\n } catch (error) {\n await docService.shutdown(); // Ensure docService shutdown on error too\n logger.error(`❌ Fatal Error: ${error}`);\n process.exit(1);\n }\n}\n","import type { CallToolResult } from \"@modelcontextprotocol/sdk/types.js\";\n\n/**\n * Creates a success response object in the format expected by the MCP server.\n * @param text The text content of the response.\n * @returns The response object.\n */\nexport function createResponse(text: string): CallToolResult {\n return {\n content: [\n {\n type: \"text\",\n text,\n },\n ],\n isError: false,\n };\n}\n\n/**\n * Creates an error response object in the format expected by the MCP server.\n * @param text The error message.\n * @returns The response object.\n */\nexport function createError(text: string): CallToolResult {\n return {\n content: [\n {\n type: \"text\",\n text,\n },\n ],\n isError: true,\n };\n}\n","#!/usr/bin/env node\nimport { startServer } from \"./mcp\";\nimport { logger } from \"./utils/logger\";\n\nstartServer().catch((error) => {\n logger.error(`❌ Fatal Error: ${error}`);\n process.exit(1);\n});\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/mcp/index.ts","../src/mcp/utils.ts","../src/server.ts"],"sourcesContent":["#!/usr/bin/env node\nimport \"dotenv/config\";\nimport { McpServer, ResourceTemplate } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { z } from \"zod\";\nimport { PipelineManager } from \"../pipeline/PipelineManager\";\nimport { PipelineJobStatus } from \"../pipeline/types\";\nimport { DocumentManagementService } from \"../store/DocumentManagementService\";\nimport {\n CancelJobTool,\n FindVersionTool,\n GetJobInfoTool,\n ListJobsTool,\n ListLibrariesTool,\n RemoveTool,\n ScrapeTool,\n SearchTool,\n VersionNotFoundError,\n} from \"../tools\";\nimport { LogLevel, logger, setLogLevel } from \"../utils/logger\"; // Import LogLevel and setLogLevel\nimport { createError, createResponse } from \"./utils\";\n\nexport async function startServer() {\n // Set the default log level for the server to ERROR\n setLogLevel(LogLevel.ERROR);\n\n const docService = new DocumentManagementService();\n\n try {\n await docService.initialize();\n\n // Instantiate PipelineManager\n // TODO: Check if concurrency needs to be configurable\n const pipelineManager = new PipelineManager(docService);\n // Start the pipeline manager to process jobs\n await pipelineManager.start(); // Assuming start is async and needed\n\n // Instantiate tools, passing dependencies\n const tools = {\n listLibraries: new ListLibrariesTool(docService),\n findVersion: new FindVersionTool(docService),\n // TODO: Update ScrapeTool constructor if needed to accept PipelineManager\n // ScrapeTool currently uses docService.getPipelineManager() which doesn't exist.\n // Pass both docService and pipelineManager to ScrapeTool constructor\n scrape: new ScrapeTool(docService, pipelineManager),\n search: new SearchTool(docService),\n listJobs: new ListJobsTool(pipelineManager),\n getJobInfo: new GetJobInfoTool(pipelineManager),\n cancelJob: new CancelJobTool(pipelineManager),\n remove: new RemoveTool(docService), // Instantiate RemoveTool\n };\n\n const server = new McpServer(\n {\n name: \"docs-mcp-server\",\n version: \"0.1.0\",\n },\n {\n capabilities: {\n tools: {},\n prompts: {},\n resources: {},\n },\n },\n );\n\n // --- Tool Definitions ---\n\n // Scrape docs tool\n server.tool(\n \"scrape_docs\",\n \"Scrape and index documentation from a URL\",\n {\n url: z.string().url().describe(\"URL of the documentation to scrape\"),\n library: z.string().describe(\"Name of the library\"),\n version: z.string().optional().describe(\"Version of the library\"),\n maxPages: z\n .number()\n .optional()\n .default(100)\n .describe(\"Maximum number of pages to scrape\"),\n maxDepth: z.number().optional().default(3).describe(\"Maximum navigation depth\"),\n scope: z\n .enum([\"subpages\", \"hostname\", \"domain\"])\n .optional()\n .default(\"subpages\")\n .describe(\"Defines the crawling boundary: 'subpages', 'hostname', or 'domain'\"),\n followRedirects: z\n .boolean()\n .optional()\n .default(true)\n .describe(\"Whether to follow HTTP redirects (3xx responses)\"),\n },\n\n async ({ url, library, version, maxPages, maxDepth, scope, followRedirects }) => {\n try {\n // Execute scrape tool without waiting and without progress callback\n const result = await tools.scrape.execute({\n url,\n library,\n version,\n waitForCompletion: false, // Don't wait for completion\n // onProgress: undefined, // Explicitly undefined or omitted\n options: {\n maxPages,\n maxDepth,\n scope,\n followRedirects,\n },\n });\n\n // Check the type of result\n if (\"jobId\" in result) {\n // If we got a jobId back, report that\n return createResponse(`🚀 Scraping job started with ID: ${result.jobId}.`);\n }\n // This case shouldn't happen if waitForCompletion is false, but handle defensively\n return createResponse(\n `Scraping finished immediately (unexpectedly) with ${result.pagesScraped} pages.`,\n );\n } catch (error) {\n // Handle errors during job *enqueueing* or initial setup\n return createError(\n `Failed to scrape documentation: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n },\n );\n\n // Search docs tool (Keep as is)\n server.tool(\n \"search_docs\",\n \"Search indexed documentation. Examples:\\n\" +\n '- {library: \"react\", query: \"how do hooks work\"} -> matches latest version of React\\n' +\n '- {library: \"react\", version: \"18.0.0\", query: \"how do hooks work\"} -> matches React 18.0.0 or earlier\\n' +\n '- {library: \"react\", version: \"18.0.0\", query: \"how do hooks work\", exactMatch: true} -> only React 18.0.0\\n' +\n '- {library: \"typescript\", version: \"5.x\", query: \"ReturnType example\"} -> any TypeScript 5.x.x version\\n' +\n '- {library: \"typescript\", version: \"5.2.x\", query: \"ReturnType example\"} -> any TypeScript 5.2.x version',\n {\n library: z.string().describe(\"Name of the library\"),\n version: z\n .string()\n .optional()\n .describe(\n \"Version of the library (supports exact versions like '18.0.0' or X-Range patterns like '5.x', '5.2.x')\",\n ),\n query: z.string().describe(\"Search query\"),\n limit: z.number().optional().default(5).describe(\"Maximum number of results\"),\n exactMatch: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"Only use exact version match\"),\n },\n async ({ library, version, query, limit, exactMatch }) => {\n try {\n const result = await tools.search.execute({\n library,\n version,\n query,\n limit,\n exactMatch,\n });\n\n const formattedResults = result.results.map(\n (r, i) => `\n------------------------------------------------------------\nResult ${i + 1}: ${r.url}\n\n${r.content}\\n`,\n );\n\n return createResponse(\n `Search results for '${query}' in ${library} v${version}:\n${formattedResults.join(\"\")}`,\n );\n } catch (error) {\n if (error instanceof VersionNotFoundError) {\n const indexedVersions = error.availableVersions\n .filter((v): v is { version: string; indexed: true } => v.indexed)\n .map((v) => v.version);\n return createError(\n indexedVersions.length > 0\n ? `Version not found. Available indexed versions for ${library}: ${indexedVersions.join(\", \")}`\n : `Version not found. No indexed versions available for ${library}.`,\n );\n }\n return createError(\n `Failed to search documentation: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n },\n );\n\n // List libraries tool (Keep as is)\n server.tool(\"list_libraries\", \"List all indexed libraries\", {}, async () => {\n try {\n const result = await tools.listLibraries.execute();\n\n return createResponse(\n `Indexed libraries:\\n${result.libraries.map((lib) => `- ${lib.name}`).join(\"\\n\")}`,\n );\n } catch (error) {\n return createError(\n `Failed to list libraries: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n });\n\n // Find version tool (Keep as is)\n server.tool(\n \"find_version\",\n \"Find best matching version for a library\",\n {\n library: z.string().describe(\"Name of the library\"),\n targetVersion: z\n .string()\n .optional()\n .describe(\n \"Target version to match (supports exact versions like '18.0.0' or X-Range patterns like '5.x', '5.2.x')\",\n ),\n },\n async ({ library, targetVersion }) => {\n try {\n const version = await tools.findVersion.execute({\n library,\n targetVersion,\n });\n\n if (!version) {\n return createError(\"No matching version found\");\n }\n\n return createResponse(`Found matching version: ${version}`);\n } catch (error) {\n return createError(\n `Failed to find version: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n },\n );\n\n // List jobs tool\n server.tool(\n \"list_jobs\",\n \"List pipeline jobs, optionally filtering by status.\",\n {\n status: z\n .nativeEnum(PipelineJobStatus)\n .optional()\n .describe(\"Optional status to filter jobs by.\"),\n },\n async ({ status }) => {\n try {\n const result = await tools.listJobs.execute({ status });\n // Format the simplified job list for display\n const formattedJobs = result.jobs\n .map(\n (\n job, // Use 'any' or define a local type for the simplified structure\n ) =>\n `- ID: ${job.id}\\n Status: ${job.status}\\n Library: ${job.library}\\n Version: ${job.version}\\n Created: ${job.createdAt}${job.startedAt ? `\\n Started: ${job.startedAt}` : \"\"}${job.finishedAt ? `\\n Finished: ${job.finishedAt}` : \"\"}${job.error ? `\\n Error: ${job.error}` : \"\"}`,\n )\n .join(\"\\n\\n\");\n return createResponse(\n result.jobs.length > 0\n ? `Current Jobs:\\n\\n${formattedJobs}`\n : \"No jobs found matching criteria.\",\n );\n } catch (error) {\n return createError(\n `Failed to list jobs: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n },\n );\n\n // Get job info tool\n server.tool(\n \"get_job_info\",\n \"Get the simplified info for a specific pipeline job.\",\n {\n jobId: z.string().uuid().describe(\"The ID of the job to query.\"),\n },\n async ({ jobId }) => {\n try {\n const result = await tools.getJobInfo.execute({ jobId });\n if (!result.job) {\n return createError(`Job with ID ${jobId} not found.`);\n }\n const job = result.job;\n const formattedJob = `- ID: ${job.id}\\n Status: ${job.status}\\n Library: ${job.library}@${job.version}\\n Created: ${job.createdAt}${job.startedAt ? `\\n Started: ${job.startedAt}` : \"\"}${job.finishedAt ? `\\n Finished: ${job.finishedAt}` : \"\"}${job.error ? `\\n Error: ${job.error}` : \"\"}`;\n return createResponse(`Job Info:\\n\\n${formattedJob}`);\n } catch (error) {\n return createError(\n `Failed to get job info for ${jobId}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n },\n );\n\n // Cancel job tool\n server.tool(\n \"cancel_job\",\n \"Attempt to cancel a queued or running pipeline job.\",\n {\n jobId: z.string().uuid().describe(\"The ID of the job to cancel.\"),\n },\n async ({ jobId }) => {\n try {\n const result = await tools.cancelJob.execute({ jobId });\n // Use the message and success status from the tool's result\n if (result.success) {\n return createResponse(result.message);\n }\n // If not successful according to the tool, treat it as an error in MCP\n return createError(result.message);\n } catch (error) {\n // Catch any unexpected errors during the tool execution itself\n return createError(\n `Failed to cancel job ${jobId}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n },\n );\n\n // Remove docs tool\n server.tool(\n \"remove_docs\",\n \"Remove indexed documentation for a library version.\",\n {\n library: z.string().describe(\"Name of the library\"),\n version: z\n .string()\n .optional()\n .describe(\"Version of the library (optional, removes unversioned if omitted)\"),\n },\n async ({ library, version }) => {\n try {\n // Execute the remove tool logic\n const result = await tools.remove.execute({ library, version });\n // Use the message from the tool's successful execution\n return createResponse(result.message);\n } catch (error) {\n // Catch errors thrown by the RemoveTool's execute method\n return createError(\n `Failed to remove documents: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n },\n );\n\n server.prompt(\n \"docs\",\n \"Search indexed documentation\",\n {\n library: z.string().describe(\"Name of the library\"),\n version: z.string().optional().describe(\"Version of the library\"),\n query: z.string().describe(\"Search query\"),\n },\n async ({ library, version, query }) => {\n return {\n messages: [\n {\n role: \"user\",\n content: {\n type: \"text\",\n text: `Please search ${library} ${version || \"\"} documentation for this query: ${query}`,\n },\n },\n ],\n };\n },\n );\n\n server.resource(\n \"libraries\",\n \"docs://libraries\",\n {\n description: \"List all indexed libraries\",\n },\n async (uri: URL) => {\n const result = await tools.listLibraries.execute();\n\n return {\n contents: result.libraries.map((lib) => ({\n uri: new URL(lib.name, uri).href,\n text: lib.name,\n })),\n };\n },\n );\n\n server.resource(\n \"versions\",\n new ResourceTemplate(\"docs://libraries/{library}/versions\", {\n list: undefined,\n }),\n {\n description: \"List all indexed versions for a library\",\n },\n async (uri: URL, { library }) => {\n const result = await tools.listLibraries.execute();\n\n const lib = result.libraries.find((l) => l.name === library);\n if (!lib) {\n return { contents: [] };\n }\n\n return {\n contents: lib.versions.map((v) => ({\n uri: new URL(v.version, uri).href,\n text: v.version,\n })),\n };\n },\n );\n\n /**\n * Resource handler for listing pipeline jobs.\n * Supports filtering by status via a query parameter (e.g., ?status=running).\n * URI: docs://jobs[?status=<status>]\n */\n server.resource(\n \"jobs\",\n \"docs://jobs\",\n {\n description: \"List pipeline jobs, optionally filtering by status.\",\n mimeType: \"application/json\",\n },\n async (uri: URL) => {\n const statusParam = uri.searchParams.get(\"status\");\n let statusFilter: PipelineJobStatus | undefined;\n\n // Validate status parameter if provided\n if (statusParam) {\n const validation = z.nativeEnum(PipelineJobStatus).safeParse(statusParam);\n if (validation.success) {\n statusFilter = validation.data;\n } else {\n // Handle invalid status - perhaps return an error or ignore?\n // For simplicity, let's ignore invalid status for now and return all jobs.\n // Alternatively, could throw an McpError or return specific error content.\n logger.warn(`Invalid status parameter received: ${statusParam}`);\n }\n }\n\n // Fetch simplified jobs using the ListJobsTool\n const result = await tools.listJobs.execute({ status: statusFilter });\n\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: \"application/json\",\n text: JSON.stringify(result.jobs, null, 2), // Stringify the simplified jobs array\n },\n ],\n };\n },\n );\n\n /**\n * Resource handler for retrieving a specific pipeline job by its ID.\n * URI Template: docs://jobs/{jobId}\n */\n server.resource(\n \"job\", // A distinct name for this specific resource type\n new ResourceTemplate(\"docs://jobs/{jobId}\", { list: undefined }),\n {\n description: \"Get details for a specific pipeline job by ID.\",\n mimeType: \"application/json\",\n },\n async (uri: URL, { jobId }) => {\n // Validate jobId format if necessary (basic check)\n if (typeof jobId !== \"string\" || jobId.length === 0) {\n // Handle invalid jobId format - return empty or error\n logger.warn(`Invalid jobId received in URI: ${jobId}`);\n return { contents: [] }; // Return empty content for invalid ID format\n }\n\n // Fetch the simplified job info using GetJobInfoTool\n const result = await tools.getJobInfo.execute({ jobId });\n\n // result.job is either the simplified job object or null\n if (!result.job) {\n // Job not found, return empty content\n return { contents: [] };\n }\n\n // Job found, return its simplified details as JSON\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: \"application/json\",\n text: JSON.stringify(result.job, null, 2), // Stringify the simplified job object\n },\n ],\n };\n },\n );\n\n // Start server\n const transport = new StdioServerTransport();\n await server.connect(transport);\n logger.info(\"Documentation MCP server running on stdio\");\n\n // Handle cleanup\n process.on(\"SIGINT\", async () => {\n await pipelineManager.stop(); // Stop the pipeline manager\n await docService.shutdown();\n await server.close();\n process.exit(0);\n });\n } catch (error) {\n await docService.shutdown(); // Ensure docService shutdown on error too\n logger.error(`❌ Fatal Error: ${error}`);\n process.exit(1);\n }\n}\n","import type { CallToolResult } from \"@modelcontextprotocol/sdk/types.js\";\n\n/**\n * Creates a success response object in the format expected by the MCP server.\n * @param text The text content of the response.\n * @returns The response object.\n */\nexport function createResponse(text: string): CallToolResult {\n return {\n content: [\n {\n type: \"text\",\n text,\n },\n ],\n isError: false,\n };\n}\n\n/**\n * Creates an error response object in the format expected by the MCP server.\n * @param text The error message.\n * @returns The response object.\n */\nexport function createError(text: string): CallToolResult {\n return {\n content: [\n {\n type: \"text\",\n text,\n },\n ],\n isError: true,\n };\n}\n","#!/usr/bin/env node\nimport { startServer } from \"./mcp\";\nimport { logger } from \"./utils/logger\";\n\nstartServer().catch((error) => {\n logger.error(`❌ Fatal Error: ${error}`);\n process.exit(1);\n});\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arabold/docs-mcp-server",
3
- "version": "1.6.0",
3
+ "version": "1.7.0",
4
4
  "description": "MCP server for fetching and searching documentation",
5
5
  "type": "module",
6
6
  "bin": {
@@ -35,7 +35,10 @@
35
35
  "db:push": "drizzle-kit push"
36
36
  },
37
37
  "dependencies": {
38
+ "@langchain/aws": "^0.1.8",
38
39
  "@langchain/community": "^0.3.34",
40
+ "@langchain/google-genai": "^0.2.3",
41
+ "@langchain/google-vertexai": "^0.2.4",
39
42
  "@langchain/openai": "^0.5.0",
40
43
  "@modelcontextprotocol/sdk": "^1.6.1",
41
44
  "axios": "^1.8.3",