@rushstack/mcp-server
Advanced tools
+12
-0
@@ -5,2 +5,14 @@ { | ||
| { | ||
| "version": "0.2.1", | ||
| "tag": "@rushstack/mcp-server_v0.2.1", | ||
| "date": "Fri, 06 Jun 2025 08:20:18 GMT", | ||
| "comments": { | ||
| "patch": [ | ||
| { | ||
| "comment": "Fix some errors when loading plugins" | ||
| } | ||
| ] | ||
| } | ||
| }, | ||
| { | ||
| "version": "0.2.0", | ||
@@ -7,0 +19,0 @@ "tag": "@rushstack/mcp-server_v0.2.0", |
+8
-1
| # Change Log - @rushstack/mcp-server | ||
| This log was last generated on Fri, 06 Jun 2025 00:11:09 GMT and should not be manually modified. | ||
| This log was last generated on Fri, 06 Jun 2025 08:20:18 GMT and should not be manually modified. | ||
| ## 0.2.1 | ||
| Fri, 06 Jun 2025 08:20:18 GMT | ||
| ### Patches | ||
| - Fix some errors when loading plugins | ||
| ## 0.2.0 | ||
@@ -6,0 +13,0 @@ Fri, 06 Jun 2025 00:11:09 GMT |
@@ -25,6 +25,2 @@ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp'; | ||
| autoinstaller: string; | ||
| /** | ||
| * The name of the plugin. This is used to identify the plugin in the MCP server. | ||
| */ | ||
| pluginName: string; | ||
| } | ||
@@ -59,4 +55,5 @@ /** | ||
| constructor(rushWorkspacePath: string, mcpServer: McpServer); | ||
| private static _formatError; | ||
| loadAsync(): Promise<void>; | ||
| } | ||
| //# sourceMappingURL=RushMcpPluginLoader.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"RushMcpPluginLoader.d.ts","sourceRoot":"","sources":["../../src/pluginFramework/RushMcpPluginLoader.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAC;AAQtE;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,UAAU,EAAE,kBAAkB,EAAE,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,aAAa,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,MAAM,WAAW,0BAA0B;IACzC;;;OAGG;IACH,UAAU,EAAE,MAAM,CAAC;IAEnB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;;OAGG;IACH,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CACa;IACvD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,0BAA0B,CACO;IAEzD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;IAC5C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAY;gBAEpB,iBAAiB,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS;IAKrD,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;CAyGxC"} | ||
| {"version":3,"file":"RushMcpPluginLoader.d.ts","sourceRoot":"","sources":["../../src/pluginFramework/RushMcpPluginLoader.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAC;AAQtE;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,UAAU,EAAE,kBAAkB,EAAE,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,MAAM,WAAW,0BAA0B;IACzC;;;OAGG;IACH,UAAU,EAAE,MAAM,CAAC;IAEnB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;;OAGG;IACH,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CACa;IACvD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,0BAA0B,CACO;IAEzD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;IAC5C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAY;gBAEpB,iBAAiB,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS;IAKlE,OAAO,CAAC,MAAM,CAAC,YAAY;IAId,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;CAgHxC"} |
@@ -55,2 +55,6 @@ "use strict"; | ||
| } | ||
| static _formatError(e) { | ||
| var _a; | ||
| return (_a = e.stack) !== null && _a !== void 0 ? _a : RushMcpPluginLoader._formatError(e); | ||
| } | ||
| async loadAsync() { | ||
@@ -95,3 +99,3 @@ const rushMcpFilePath = path.join(this._rushWorkspacePath, 'common/config/rush-mcp/rush-mcp.json'); | ||
| const mcpPluginSchema = await node_core_library_1.JsonSchema.fromFile(mcpPluginSchemaFilePath); | ||
| const rushMcpPluginOptionsFilePath = path.resolve(this._rushWorkspacePath, `common/config/rush-mcp/${jsonMcpPlugin.pluginName}.json`); | ||
| const rushMcpPluginOptionsFilePath = path.resolve(this._rushWorkspacePath, `common/config/rush-mcp/${jsonManifest.pluginName}.json`); | ||
| // Example: /path/to/my-repo/common/config/rush-mcp/rush-mcp-example-plugin.json | ||
@@ -110,3 +114,4 @@ rushMcpPluginOptions = await node_core_library_1.JsonFile.loadAndValidateAsync(rushMcpPluginOptionsFilePath, mcpPluginSchema); | ||
| catch (e) { | ||
| throw new Error(`Unable to load plugin entry point at ${fullEntryPointPath}: ` + e.toString()); | ||
| throw new Error(`Unable to load plugin entry point at ${fullEntryPointPath}:\n` + | ||
| RushMcpPluginLoader._formatError(e)); | ||
| } | ||
@@ -119,3 +124,4 @@ const session = new RushMcpPluginSession_1.RushMcpPluginSessionInternal(this._mcpServer); | ||
| catch (e) { | ||
| throw new Error(`Error invoking entry point for plugin ${jsonManifest.pluginName}:` + e.toString()); | ||
| throw new Error(`Error invoking entry point for plugin ${jsonManifest.pluginName}:\n` + | ||
| RushMcpPluginLoader._formatError(e)); | ||
| } | ||
@@ -126,3 +132,4 @@ try { | ||
| catch (e) { | ||
| throw new Error(`Error occurred in onInitializeAsync() for plugin ${jsonManifest.pluginName}:` + e.toString()); | ||
| throw new Error(`Error occurred in onInitializeAsync() for plugin ${jsonManifest.pluginName}:\n` + | ||
| RushMcpPluginLoader._formatError(e)); | ||
| } | ||
@@ -129,0 +136,0 @@ } |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"RushMcpPluginLoader.js","sourceRoot":"","sources":["../../src/pluginFramework/RushMcpPluginLoader.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport * as path from 'path';\nimport { FileSystem, Import, JsonFile, type JsonObject, JsonSchema } from '@rushstack/node-core-library';\nimport { Autoinstaller } from '@rushstack/rush-sdk/lib/logic/Autoinstaller';\nimport { RushGlobalFolder } from '@rushstack/rush-sdk/lib/api/RushGlobalFolder';\nimport { RushConfiguration } from '@rushstack/rush-sdk/lib/api/RushConfiguration';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp';\n\nimport type { IRushMcpPlugin, RushMcpPluginFactory } from './IRushMcpPlugin';\nimport { RushMcpPluginSessionInternal } from './RushMcpPluginSession';\n\nimport rushMcpJsonSchemaObject from '../schemas/rush-mcp.schema.json';\nimport rushMcpPluginSchemaObject from '../schemas/rush-mcp-plugin.schema.json';\n\n/**\n * Configuration for @rushstack/mcp-server in a monorepo.\n * Corresponds to the contents of common/config/rush-mcp/rush-mcp.json\n */\nexport interface IJsonRushMcpConfig {\n /**\n * The list of plugins that @rushstack/mcp-server should load when processing this monorepo.\n */\n mcpPlugins: IJsonRushMcpPlugin[];\n}\n\n/**\n * Describes a single MCP plugin entry.\n */\nexport interface IJsonRushMcpPlugin {\n /**\n * The name of an NPM package that appears in the package.json \"dependencies\" for the autoinstaller.\n */\n packageName: string;\n\n /**\n * The name of a Rush autoinstaller with this package as its dependency.\n * @rushstack/mcp-server will ensure this folder is installed before loading the plugin.\n */\n autoinstaller: string;\n\n /**\n * The name of the plugin. This is used to identify the plugin in the MCP server.\n */\n pluginName: string;\n}\n\n/**\n * Manifest file for a Rush MCP plugin.\n * Every plugin package must contain a \"rush-mcp-plugin.json\" manifest in the top-level folder.\n */\nexport interface IJsonRushMcpPluginManifest {\n /**\n * A name that uniquely identifies your plugin.\n * Generally this should match the NPM package name; two plugins with the same pluginName cannot be loaded together.\n */\n pluginName: string;\n\n /**\n * Optional. Indicates that your plugin accepts a config file.\n * The MCP server will load this schema file and provide it to the plugin.\n * Path is typically `<rush-repo>/common/config/rush-mcp/<plugin-name>.json`.\n */\n configFileSchema?: string;\n\n /**\n * The module path to the plugin's entry point.\n * Its default export must be a class implementing the MCP plugin interface.\n */\n entryPoint: string;\n}\n\nexport class RushMcpPluginLoader {\n private static readonly _rushMcpJsonSchema: JsonSchema =\n JsonSchema.fromLoadedObject(rushMcpJsonSchemaObject);\n private static readonly _rushMcpPluginSchemaObject: JsonSchema =\n JsonSchema.fromLoadedObject(rushMcpPluginSchemaObject);\n\n private readonly _rushWorkspacePath: string;\n private readonly _mcpServer: McpServer;\n\n public constructor(rushWorkspacePath: string, mcpServer: McpServer) {\n this._rushWorkspacePath = rushWorkspacePath;\n this._mcpServer = mcpServer;\n }\n\n public async loadAsync(): Promise<void> {\n const rushMcpFilePath: string = path.join(\n this._rushWorkspacePath,\n 'common/config/rush-mcp/rush-mcp.json'\n );\n\n if (!(await FileSystem.existsAsync(rushMcpFilePath))) {\n return;\n }\n\n const rushConfiguration: RushConfiguration = RushConfiguration.loadFromDefaultLocation({\n startingFolder: this._rushWorkspacePath\n });\n\n const jsonRushMcpConfig: IJsonRushMcpConfig = await JsonFile.loadAndValidateAsync(\n rushMcpFilePath,\n RushMcpPluginLoader._rushMcpJsonSchema\n );\n\n if (jsonRushMcpConfig.mcpPlugins.length === 0) {\n return;\n }\n\n const rushGlobalFolder: RushGlobalFolder = new RushGlobalFolder();\n\n for (const jsonMcpPlugin of jsonRushMcpConfig.mcpPlugins) {\n // Ensure the autoinstaller is installed\n const autoinstaller: Autoinstaller = new Autoinstaller({\n autoinstallerName: jsonMcpPlugin.autoinstaller,\n rushConfiguration,\n rushGlobalFolder,\n restrictConsoleOutput: false\n });\n await autoinstaller.prepareAsync();\n\n // Load the manifest\n\n // Suppose the autoinstaller is \"my-autoinstaller\" and the package is \"rush-mcp-example-plugin\".\n // Then the folder will be:\n // \"/path/to/my-repo/common/autoinstallers/my-autoinstaller/node_modules/rush-mcp-example-plugin\"\n const installedPluginPackageFolder: string = await Import.resolvePackageAsync({\n baseFolderPath: autoinstaller.folderFullPath,\n packageName: jsonMcpPlugin.packageName\n });\n\n const manifestFilePath: string = path.join(installedPluginPackageFolder, 'rush-mcp-plugin.json');\n if (!(await FileSystem.existsAsync(manifestFilePath))) {\n throw new Error(\n 'The \"rush-mcp-plugin.json\" manifest file was not found under ' + installedPluginPackageFolder\n );\n }\n\n const jsonManifest: IJsonRushMcpPluginManifest = await JsonFile.loadAndValidateAsync(\n manifestFilePath,\n RushMcpPluginLoader._rushMcpPluginSchemaObject\n );\n\n let rushMcpPluginOptions: JsonObject = {};\n if (jsonManifest.configFileSchema) {\n const mcpPluginSchemaFilePath: string = path.resolve(\n installedPluginPackageFolder,\n jsonManifest.configFileSchema\n );\n const mcpPluginSchema: JsonSchema = await JsonSchema.fromFile(mcpPluginSchemaFilePath);\n const rushMcpPluginOptionsFilePath: string = path.resolve(\n this._rushWorkspacePath,\n `common/config/rush-mcp/${jsonMcpPlugin.pluginName}.json`\n );\n // Example: /path/to/my-repo/common/config/rush-mcp/rush-mcp-example-plugin.json\n rushMcpPluginOptions = await JsonFile.loadAndValidateAsync(\n rushMcpPluginOptionsFilePath,\n mcpPluginSchema\n );\n }\n\n const fullEntryPointPath: string = path.join(installedPluginPackageFolder, jsonManifest.entryPoint);\n let pluginFactory: RushMcpPluginFactory;\n try {\n const entryPointModule: { default?: RushMcpPluginFactory } = require(fullEntryPointPath);\n if (entryPointModule.default === undefined) {\n throw new Error('The commonJS \"default\" export is missing');\n }\n pluginFactory = entryPointModule.default;\n } catch (e) {\n throw new Error(`Unable to load plugin entry point at ${fullEntryPointPath}: ` + e.toString());\n }\n\n const session: RushMcpPluginSessionInternal = new RushMcpPluginSessionInternal(this._mcpServer);\n\n let plugin: IRushMcpPlugin;\n try {\n plugin = pluginFactory(session, rushMcpPluginOptions);\n } catch (e) {\n throw new Error(`Error invoking entry point for plugin ${jsonManifest.pluginName}:` + e.toString());\n }\n\n try {\n await plugin.onInitializeAsync();\n } catch (e) {\n throw new Error(\n `Error occurred in onInitializeAsync() for plugin ${jsonManifest.pluginName}:` + e.toString()\n );\n }\n }\n }\n}\n"]} | ||
| {"version":3,"file":"RushMcpPluginLoader.js","sourceRoot":"","sources":["../../src/pluginFramework/RushMcpPluginLoader.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport * as path from 'path';\nimport { FileSystem, Import, JsonFile, type JsonObject, JsonSchema } from '@rushstack/node-core-library';\nimport { Autoinstaller } from '@rushstack/rush-sdk/lib/logic/Autoinstaller';\nimport { RushGlobalFolder } from '@rushstack/rush-sdk/lib/api/RushGlobalFolder';\nimport { RushConfiguration } from '@rushstack/rush-sdk/lib/api/RushConfiguration';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp';\n\nimport type { IRushMcpPlugin, RushMcpPluginFactory } from './IRushMcpPlugin';\nimport { RushMcpPluginSessionInternal } from './RushMcpPluginSession';\n\nimport rushMcpJsonSchemaObject from '../schemas/rush-mcp.schema.json';\nimport rushMcpPluginSchemaObject from '../schemas/rush-mcp-plugin.schema.json';\n\n/**\n * Configuration for @rushstack/mcp-server in a monorepo.\n * Corresponds to the contents of common/config/rush-mcp/rush-mcp.json\n */\nexport interface IJsonRushMcpConfig {\n /**\n * The list of plugins that @rushstack/mcp-server should load when processing this monorepo.\n */\n mcpPlugins: IJsonRushMcpPlugin[];\n}\n\n/**\n * Describes a single MCP plugin entry.\n */\nexport interface IJsonRushMcpPlugin {\n /**\n * The name of an NPM package that appears in the package.json \"dependencies\" for the autoinstaller.\n */\n packageName: string;\n\n /**\n * The name of a Rush autoinstaller with this package as its dependency.\n * @rushstack/mcp-server will ensure this folder is installed before loading the plugin.\n */\n autoinstaller: string;\n}\n\n/**\n * Manifest file for a Rush MCP plugin.\n * Every plugin package must contain a \"rush-mcp-plugin.json\" manifest in the top-level folder.\n */\nexport interface IJsonRushMcpPluginManifest {\n /**\n * A name that uniquely identifies your plugin.\n * Generally this should match the NPM package name; two plugins with the same pluginName cannot be loaded together.\n */\n pluginName: string;\n\n /**\n * Optional. Indicates that your plugin accepts a config file.\n * The MCP server will load this schema file and provide it to the plugin.\n * Path is typically `<rush-repo>/common/config/rush-mcp/<plugin-name>.json`.\n */\n configFileSchema?: string;\n\n /**\n * The module path to the plugin's entry point.\n * Its default export must be a class implementing the MCP plugin interface.\n */\n entryPoint: string;\n}\n\nexport class RushMcpPluginLoader {\n private static readonly _rushMcpJsonSchema: JsonSchema =\n JsonSchema.fromLoadedObject(rushMcpJsonSchemaObject);\n private static readonly _rushMcpPluginSchemaObject: JsonSchema =\n JsonSchema.fromLoadedObject(rushMcpPluginSchemaObject);\n\n private readonly _rushWorkspacePath: string;\n private readonly _mcpServer: McpServer;\n\n public constructor(rushWorkspacePath: string, mcpServer: McpServer) {\n this._rushWorkspacePath = rushWorkspacePath;\n this._mcpServer = mcpServer;\n }\n\n private static _formatError(e: Error): string {\n return e.stack ?? RushMcpPluginLoader._formatError(e);\n }\n\n public async loadAsync(): Promise<void> {\n const rushMcpFilePath: string = path.join(\n this._rushWorkspacePath,\n 'common/config/rush-mcp/rush-mcp.json'\n );\n\n if (!(await FileSystem.existsAsync(rushMcpFilePath))) {\n return;\n }\n\n const rushConfiguration: RushConfiguration = RushConfiguration.loadFromDefaultLocation({\n startingFolder: this._rushWorkspacePath\n });\n\n const jsonRushMcpConfig: IJsonRushMcpConfig = await JsonFile.loadAndValidateAsync(\n rushMcpFilePath,\n RushMcpPluginLoader._rushMcpJsonSchema\n );\n\n if (jsonRushMcpConfig.mcpPlugins.length === 0) {\n return;\n }\n\n const rushGlobalFolder: RushGlobalFolder = new RushGlobalFolder();\n\n for (const jsonMcpPlugin of jsonRushMcpConfig.mcpPlugins) {\n // Ensure the autoinstaller is installed\n const autoinstaller: Autoinstaller = new Autoinstaller({\n autoinstallerName: jsonMcpPlugin.autoinstaller,\n rushConfiguration,\n rushGlobalFolder,\n restrictConsoleOutput: false\n });\n await autoinstaller.prepareAsync();\n\n // Load the manifest\n\n // Suppose the autoinstaller is \"my-autoinstaller\" and the package is \"rush-mcp-example-plugin\".\n // Then the folder will be:\n // \"/path/to/my-repo/common/autoinstallers/my-autoinstaller/node_modules/rush-mcp-example-plugin\"\n const installedPluginPackageFolder: string = await Import.resolvePackageAsync({\n baseFolderPath: autoinstaller.folderFullPath,\n packageName: jsonMcpPlugin.packageName\n });\n\n const manifestFilePath: string = path.join(installedPluginPackageFolder, 'rush-mcp-plugin.json');\n if (!(await FileSystem.existsAsync(manifestFilePath))) {\n throw new Error(\n 'The \"rush-mcp-plugin.json\" manifest file was not found under ' + installedPluginPackageFolder\n );\n }\n\n const jsonManifest: IJsonRushMcpPluginManifest = await JsonFile.loadAndValidateAsync(\n manifestFilePath,\n RushMcpPluginLoader._rushMcpPluginSchemaObject\n );\n\n let rushMcpPluginOptions: JsonObject = {};\n if (jsonManifest.configFileSchema) {\n const mcpPluginSchemaFilePath: string = path.resolve(\n installedPluginPackageFolder,\n jsonManifest.configFileSchema\n );\n const mcpPluginSchema: JsonSchema = await JsonSchema.fromFile(mcpPluginSchemaFilePath);\n const rushMcpPluginOptionsFilePath: string = path.resolve(\n this._rushWorkspacePath,\n `common/config/rush-mcp/${jsonManifest.pluginName}.json`\n );\n // Example: /path/to/my-repo/common/config/rush-mcp/rush-mcp-example-plugin.json\n rushMcpPluginOptions = await JsonFile.loadAndValidateAsync(\n rushMcpPluginOptionsFilePath,\n mcpPluginSchema\n );\n }\n\n const fullEntryPointPath: string = path.join(installedPluginPackageFolder, jsonManifest.entryPoint);\n let pluginFactory: RushMcpPluginFactory;\n try {\n const entryPointModule: { default?: RushMcpPluginFactory } = require(fullEntryPointPath);\n if (entryPointModule.default === undefined) {\n throw new Error('The commonJS \"default\" export is missing');\n }\n pluginFactory = entryPointModule.default;\n } catch (e) {\n throw new Error(\n `Unable to load plugin entry point at ${fullEntryPointPath}:\\n` +\n RushMcpPluginLoader._formatError(e)\n );\n }\n\n const session: RushMcpPluginSessionInternal = new RushMcpPluginSessionInternal(this._mcpServer);\n\n let plugin: IRushMcpPlugin;\n try {\n plugin = pluginFactory(session, rushMcpPluginOptions);\n } catch (e) {\n throw new Error(\n `Error invoking entry point for plugin ${jsonManifest.pluginName}:\\n` +\n RushMcpPluginLoader._formatError(e)\n );\n }\n\n try {\n await plugin.onInitializeAsync();\n } catch (e) {\n throw new Error(\n `Error occurred in onInitializeAsync() for plugin ${jsonManifest.pluginName}:\\n` +\n RushMcpPluginLoader._formatError(e)\n );\n }\n }\n }\n}\n"]} |
@@ -19,6 +19,2 @@ { | ||
| "description": "The name of a Rush autoinstaller with this package as its dependency." | ||
| }, | ||
| "pluginName": { | ||
| "type": "string", | ||
| "description": "The name of the plugin. This is used to identify the plugin in the MCP server." | ||
| } | ||
@@ -25,0 +21,0 @@ }, |
+47
-2
| "use strict"; | ||
| // Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license. | ||
| // See LICENSE in the project root for license information. | ||
| var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { | ||
| if (k2 === undefined) k2 = k; | ||
| var desc = Object.getOwnPropertyDescriptor(m, k); | ||
| if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { | ||
| desc = { enumerable: true, get: function() { return m[k]; } }; | ||
| } | ||
| Object.defineProperty(o, k2, desc); | ||
| }) : (function(o, m, k, k2) { | ||
| if (k2 === undefined) k2 = k; | ||
| o[k2] = m[k]; | ||
| })); | ||
| var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { | ||
| Object.defineProperty(o, "default", { enumerable: true, value: v }); | ||
| }) : function(o, v) { | ||
| o["default"] = v; | ||
| }); | ||
| var __importStar = (this && this.__importStar) || (function () { | ||
| var ownKeys = function(o) { | ||
| ownKeys = Object.getOwnPropertyNames || function (o) { | ||
| var ar = []; | ||
| for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; | ||
| return ar; | ||
| }; | ||
| return ownKeys(o); | ||
| }; | ||
| return function (mod) { | ||
| if (mod && mod.__esModule) return mod; | ||
| var result = {}; | ||
| if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); | ||
| __setModuleDefault(result, mod); | ||
| return result; | ||
| }; | ||
| })(); | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| const path = __importStar(require("path")); | ||
| const process = __importStar(require("process")); | ||
| const node_core_library_1 = require("@rushstack/node-core-library"); | ||
| const loader_1 = require("@rushstack/rush-sdk/loader"); | ||
| const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js"); | ||
| const log_1 = require("./utilities/log"); | ||
| const server_1 = require("./server"); | ||
| const main = async () => { | ||
@@ -13,3 +49,12 @@ const rushWorkspacePath = process.argv[2]; | ||
| } | ||
| const server = new server_1.RushMCPServer(rushWorkspacePath); | ||
| const rushWorkspaceFullPath = path.resolve(rushWorkspacePath); | ||
| if (!(await node_core_library_1.FileSystem.existsAsync(rushWorkspaceFullPath))) { | ||
| throw new Error('The specified workspace root path does not exist:\n ' + JSON.stringify(rushWorkspacePath)); | ||
| } | ||
| // Load rush-sdk from the specified repository | ||
| await loader_1.RushSdkLoader.loadAsync({ | ||
| rushJsonSearchFolder: rushWorkspaceFullPath | ||
| }); | ||
| const RushMCPServerClass = (await Promise.resolve().then(() => __importStar(require('./server')))).RushMCPServer; | ||
| const server = new RushMCPServerClass(rushWorkspaceFullPath); | ||
| await server.startAsync(); | ||
@@ -16,0 +61,0 @@ const transport = new stdio_js_1.StdioServerTransport(); |
+1
-1
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"start.js","sourceRoot":"","sources":["../src/start.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;AAE3D,wEAAiF;AAEjF,yCAAsC;AACtC,qCAAyC;AAEzC,MAAM,IAAI,GAAG,KAAK,IAAmB,EAAE;IACrC,MAAM,iBAAiB,GAAuB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9D,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;IAC9E,CAAC;IAED,MAAM,MAAM,GAAkB,IAAI,sBAAa,CAAC,iBAAiB,CAAC,CAAC;IACnE,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;IAC1B,MAAM,SAAS,GAAyB,IAAI,+BAAoB,EAAE,CAAC;IACnE,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,IAAA,SAAG,EAAC,kCAAkC,CAAC,CAAC;AAC1C,CAAC,CAAC;AAEF,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,IAAA,SAAG,EAAC,6BAA6B,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACnF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\n\nimport { log } from './utilities/log';\nimport { RushMCPServer } from './server';\n\nconst main = async (): Promise<void> => {\n const rushWorkspacePath: string | undefined = process.argv[2];\n if (!rushWorkspacePath) {\n throw new Error('Please provide workspace root path as the first argument');\n }\n\n const server: RushMCPServer = new RushMCPServer(rushWorkspacePath);\n await server.startAsync();\n const transport: StdioServerTransport = new StdioServerTransport();\n await server.connect(transport);\n\n log('Rush MCP Server running on stdio');\n};\n\nmain().catch((error) => {\n log('Fatal error running server:', error instanceof Error ? error.message : error);\n process.exit(1);\n});\n"]} | ||
| {"version":3,"file":"start.js","sourceRoot":"","sources":["../src/start.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAE3D,2CAA6B;AAC7B,iDAAmC;AACnC,oEAA0D;AAC1D,uDAA2D;AAC3D,wEAAiF;AAEjF,yCAAsC;AAGtC,MAAM,IAAI,GAAG,KAAK,IAAmB,EAAE;IACrC,MAAM,iBAAiB,GAAuB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9D,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;IAC9E,CAAC;IAED,MAAM,qBAAqB,GAAW,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAEtE,IAAI,CAAC,CAAC,MAAM,8BAAU,CAAC,WAAW,CAAC,qBAAqB,CAAC,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CACb,uDAAuD,GAAG,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAC5F,CAAC;IACJ,CAAC;IAED,8CAA8C;IAC9C,MAAM,sBAAa,CAAC,SAAS,CAAC;QAC5B,oBAAoB,EAAE,qBAAqB;KAC5C,CAAC,CAAC;IAEH,MAAM,kBAAkB,GAAyB,CAAC,wDAAa,UAAU,GAAC,CAAC,CAAC,aAAa,CAAC;IAE1F,MAAM,MAAM,GAAkB,IAAI,kBAAkB,CAAC,qBAAqB,CAAC,CAAC;IAC5E,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;IAC1B,MAAM,SAAS,GAAyB,IAAI,+BAAoB,EAAE,CAAC;IACnE,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,IAAA,SAAG,EAAC,kCAAkC,CAAC,CAAC;AAC1C,CAAC,CAAC;AAEF,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,IAAA,SAAG,EAAC,6BAA6B,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACnF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport * as path from 'path';\nimport * as process from 'process';\nimport { FileSystem } from '@rushstack/node-core-library';\nimport { RushSdkLoader } from '@rushstack/rush-sdk/loader';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\n\nimport { log } from './utilities/log';\nimport type { RushMCPServer } from './server';\n\nconst main = async (): Promise<void> => {\n const rushWorkspacePath: string | undefined = process.argv[2];\n if (!rushWorkspacePath) {\n throw new Error('Please provide workspace root path as the first argument');\n }\n\n const rushWorkspaceFullPath: string = path.resolve(rushWorkspacePath);\n\n if (!(await FileSystem.existsAsync(rushWorkspaceFullPath))) {\n throw new Error(\n 'The specified workspace root path does not exist:\\n ' + JSON.stringify(rushWorkspacePath)\n );\n }\n\n // Load rush-sdk from the specified repository\n await RushSdkLoader.loadAsync({\n rushJsonSearchFolder: rushWorkspaceFullPath\n });\n\n const RushMCPServerClass: typeof RushMCPServer = (await import('./server')).RushMCPServer;\n\n const server: RushMCPServer = new RushMCPServerClass(rushWorkspaceFullPath);\n await server.startAsync();\n const transport: StdioServerTransport = new StdioServerTransport();\n await server.connect(transport);\n\n log('Rush MCP Server running on stdio');\n};\n\nmain().catch((error) => {\n log('Fatal error running server:', error instanceof Error ? error.message : error);\n process.exit(1);\n});\n"]} |
+5
-5
| { | ||
| "name": "@rushstack/mcp-server", | ||
| "version": "0.2.0", | ||
| "version": "0.2.1", | ||
| "description": "A Model Context Protocol server implementation for Rush", | ||
@@ -33,4 +33,4 @@ "keywords": [ | ||
| "@rushstack/terminal": "0.15.3", | ||
| "@rushstack/ts-command-line": "5.0.1", | ||
| "@rushstack/rush-sdk": "5.153.2" | ||
| "@rushstack/rush-sdk": "5.153.2", | ||
| "@rushstack/ts-command-line": "5.0.1" | ||
| }, | ||
@@ -40,4 +40,4 @@ "devDependencies": { | ||
| "@types/node": "20.17.19", | ||
| "local-node-rig": "1.0.0", | ||
| "@rushstack/heft": "0.73.6" | ||
| "@rushstack/heft": "0.73.6", | ||
| "local-node-rig": "1.0.0" | ||
| }, | ||
@@ -44,0 +44,0 @@ "scripts": { |
146193
2.77%1493
3.97%