From 04ebe6b86c62b5ffefa4a0b0423008493b6d0ba5 Mon Sep 17 00:00:00 2001 From: Rohit Ghumare <48523873+rohitg00@users.noreply.github.com> Date: Tue, 10 Feb 2026 11:05:22 +0000 Subject: [PATCH 1/2] =?UTF-8?q?fix:=20MCP=20server=20fails=20to=20start=20?= =?UTF-8?q?via=20npx=20=E2=80=94=20symlink=20+=20skills.json=20issues?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. isMain guard: process.argv[1] (symlink path) never matched import.meta.url (real path). Fixed with realpathSync comparison. 2. skills.json not in npm package: prebuild copies marketplace/skills.json to data/ dir, included in package files. 3. Version string bumped from 1.12.0 to 1.16.0. Closes #58 --- packages/mcp/.gitignore | 2 ++ packages/mcp/package.json | 4 +++- packages/mcp/src/index.ts | 14 +++++++++----- 3 files changed, 14 insertions(+), 6 deletions(-) create mode 100644 packages/mcp/.gitignore diff --git a/packages/mcp/.gitignore b/packages/mcp/.gitignore new file mode 100644 index 00000000..3196db7d --- /dev/null +++ b/packages/mcp/.gitignore @@ -0,0 +1,2 @@ +dist/ +data/ diff --git a/packages/mcp/package.json b/packages/mcp/package.json index 15e1e162..bddd7678 100644 --- a/packages/mcp/package.json +++ b/packages/mcp/package.json @@ -15,9 +15,11 @@ } }, "files": [ - "dist" + "dist", + "data" ], "scripts": { + "prebuild": "mkdir -p data && cp ../../marketplace/skills.json data/skills.json", "build": "tsup", "dev": "tsup --watch", "typecheck": "tsc --noEmit", diff --git a/packages/mcp/src/index.ts b/packages/mcp/src/index.ts index 7b335309..08af0ed6 100644 --- a/packages/mcp/src/index.ts +++ b/packages/mcp/src/index.ts @@ -1,6 +1,7 @@ import { Server } from '@modelcontextprotocol/sdk/server/index.js'; import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'; import { fileURLToPath } from 'node:url'; +import { realpathSync } from 'node:fs'; import { CallToolRequestSchema, ListToolsRequestSchema, @@ -22,10 +23,12 @@ async function loadSkills(): Promise { const { readFileSync } = await import('node:fs'); const { join, dirname } = await import('node:path'); + const pkgDir = dirname(fileURLToPath(import.meta.url)); const possiblePaths = [ + join(pkgDir, '..', 'data', 'skills.json'), + join(pkgDir, '..', '..', '..', 'marketplace', 'skills.json'), + join(pkgDir, '..', '..', 'marketplace', 'skills.json'), join(process.cwd(), 'marketplace', 'skills.json'), - join(dirname(fileURLToPath(import.meta.url)), '..', '..', '..', 'marketplace', 'skills.json'), - join(dirname(fileURLToPath(import.meta.url)), '..', '..', 'marketplace', 'skills.json'), ]; for (const path of possiblePaths) { @@ -52,7 +55,7 @@ async function loadSkills(): Promise { const server = new Server( { name: 'skillkit-discovery', - version: '1.12.0', + version: '1.16.0', }, { capabilities: { @@ -212,8 +215,9 @@ async function main() { console.error('SkillKit Discovery MCP Server running on stdio'); } -const isMain = process.argv[1] === fileURLToPath(import.meta.url); -if (isMain) { +const resolvedArgv = realpathSync(process.argv[1]); +const resolvedModule = fileURLToPath(import.meta.url); +if (resolvedArgv === resolvedModule) { main().catch((error) => { console.error('Fatal error:', error); process.exit(1); From fe4765660ae66148fd7d158bbf7adcab370de660 Mon Sep 17 00:00:00 2001 From: Rohit Ghumare <48523873+rohitg00@users.noreply.github.com> Date: Tue, 10 Feb 2026 11:09:27 +0000 Subject: [PATCH 2/2] fix: guard realpathSync against undefined argv and resolve both paths - Wrap in try/catch so library imports don't crash - Check process.argv[1] exists before calling realpathSync - Also resolve import.meta.url with realpathSync for pnpm/hoisted setups --- packages/mcp/src/index.ts | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/mcp/src/index.ts b/packages/mcp/src/index.ts index 08af0ed6..063fbd02 100644 --- a/packages/mcp/src/index.ts +++ b/packages/mcp/src/index.ts @@ -215,9 +215,13 @@ async function main() { console.error('SkillKit Discovery MCP Server running on stdio'); } -const resolvedArgv = realpathSync(process.argv[1]); -const resolvedModule = fileURLToPath(import.meta.url); -if (resolvedArgv === resolvedModule) { +let isMain = false; +try { + const resolvedArgv = process.argv[1] ? realpathSync(process.argv[1]) : ''; + const resolvedModule = realpathSync(fileURLToPath(import.meta.url)); + isMain = resolvedArgv === resolvedModule; +} catch {} +if (isMain) { main().catch((error) => { console.error('Fatal error:', error); process.exit(1);