Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
609 changes: 609 additions & 0 deletions RCA-npm-alias-resolution-failure.md

Large diffs are not rendered by default.

493 changes: 110 additions & 383 deletions package-lock.json

Large diffs are not rendered by default.

3 changes: 1 addition & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -58,10 +58,9 @@
"url": "https://github.com/cameroncooke/XcodeBuildMCP/issues"
},
"dependencies": {
"@modelcontextprotocol/sdk": "npm:@camsoft/mcp-sdk@^1.17.1",
"@camsoft/mcp-sdk": "^1.17.1",
"@sentry/cli": "^2.43.1",
"@sentry/node": "^9.15.0",
"reloaderoo": "^1.0.1",
"uuid": "^11.1.0",
"zod": "^3.24.2"
},
Expand Down
2 changes: 1 addition & 1 deletion src/core/__tests__/resources.test.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { describe, it, expect, beforeEach } from 'vitest';
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { McpServer } from '@camsoft/mcp-sdk/server/mcp.js';

import { registerResources, getAvailableResources, loadResources } from '../resources.js';

Expand Down
2 changes: 1 addition & 1 deletion src/core/dynamic-tools.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { getDefaultCommandExecutor, CommandExecutor } from '../utils/command.js'
import { WORKFLOW_LOADERS, WorkflowName, WORKFLOW_METADATA } from './generated-plugins.js';
import { ToolResponse } from '../types/common.js';
import { PluginMeta } from './plugin-types.js';
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { McpServer } from '@camsoft/mcp-sdk/server/mcp.js';
import {
registerAndTrackTools,
removeTrackedTools,
Expand Down
4 changes: 2 additions & 2 deletions src/core/resources.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@
* - Providing fallback compatibility for clients without resource support
*/

import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { ReadResourceResult } from '@modelcontextprotocol/sdk/types.js';
import { McpServer } from '@camsoft/mcp-sdk/server/mcp.js';
import { ReadResourceResult } from '@camsoft/mcp-sdk/types.js';
import { log, CommandExecutor } from '../utils/index.js';
import { RESOURCE_LOADERS } from './generated-resources.js';

Expand Down
2 changes: 1 addition & 1 deletion src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import './utils/sentry.js';

// Import server components
import { createServer, startServer } from './server/server.js';
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { McpServer } from '@camsoft/mcp-sdk/server/mcp.js';

// Import utilities
import { log } from './utils/logger.js';
Expand Down
2 changes: 1 addition & 1 deletion src/mcp/tools/discovery/discover_tools.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import {
} from '../../../core/dynamic-tools.js';
import { createTypedTool } from '../../../utils/typed-tool-factory.js';
import { getDefaultCommandExecutor } from '../../../utils/command.js';
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { McpServer } from '@camsoft/mcp-sdk/server/mcp.js';

// Using McpServer type from SDK instead of custom interface

Expand Down
4 changes: 2 additions & 2 deletions src/server/server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@
* - Handling transport configuration (stdio)
*/

import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import { McpServer } from '@camsoft/mcp-sdk/server/mcp.js';
import { StdioServerTransport } from '@camsoft/mcp-sdk/server/stdio.js';
Comment on lines +15 to +16
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

Import migration to @camsoft/mcp-sdk looks correct; add a fast-fail guard to detect wrong SDK at runtime

The switch aligns with the dependency strategy and should resolve alias ambiguity. To harden against future regressions (e.g., lockfile drift pulling the official SDK), add a startup assertion that validates the fork-only API is present.

Apply this diff to fail fast when the wrong SDK is installed:

 export async function startServer(server: McpServer): Promise<void> {
+  // Sanity check: ensure fork SDK with bulk registration is present
+  // Avoids subtle runtime failures if the official SDK is accidentally resolved.
+  if (typeof (server as any).registerTools !== 'function') {
+    throw new Error(
+      'registerTools method missing. Likely incorrect SDK resolved. Expected @camsoft/mcp-sdk.',
+    );
+  }
   const transport = new StdioServerTransport();
   await server.connect(transport);
   log('info', 'XcodeBuildMCP Server running on stdio');
 }

To ensure no residual imports remain and dependencies are clean, run:


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "Scanning for any remaining '@modelcontextprotocol/sdk' references..."
rg -n --hidden --glob '!.git' --glob '!node_modules' "@modelcontextprotocol/sdk"

echo "Confirming all imports reference '@camsoft/mcp-sdk'..."
rg -n --hidden --glob '!.git' --glob '!node_modules' "@camsoft/mcp-sdk"

echo "Checking package.json dependency declarations..."
if command -v jq >/dev/null 2>&1; then
  jq '{deps: .dependencies, devDeps: .devDependencies, peerDeps: .peerDependencies}' package.json
else
  cat package.json
fi | sed -n '1,200p'

echo "Verifying 'reloaderoo' is not present..."
rg -n --hidden --glob '!.git' --glob '!node_modules' "reloaderoo" || echo "OK: no reloaderoo found"

echo "Lockfile sanity (if present): ensure camsoft appears and official sdk does not override it unexpectedly..."
rg -n --hidden --glob '!.git' "camsoft/mcp-sdk" package-lock.json || true
rg -n --hidden --glob '!.git' "@modelcontextprotocol/sdk" package-lock.json || true

Length of output: 31463


Add startup assertion to fail fast if the official SDK is loaded

All code‐level imports now reference @camsoft/mcp-sdk, and both package.json and package-lock.json are free of @modelcontextprotocol/sdk aliases. To guard against any future alias drift or npm alias resolution bugs, please add a runtime check at the top of your startServer function in src/server/server.ts:

 export async function startServer(server: McpServer): Promise<void> {
+  // Sanity check: ensure fork SDK with bulk registration is present
+  if (typeof (server as any).registerTools !== 'function') {
+    throw new Error(
+      'registerTools method missing. Likely incorrect SDK resolved. Expected @camsoft/mcp-sdk.',
+    );
+  }
   const transport = new StdioServerTransport();
   await server.connect(transport);
   log('info', 'XcodeBuildMCP Server running on stdio');
 }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
import { McpServer } from '@camsoft/mcp-sdk/server/mcp.js';
import { StdioServerTransport } from '@camsoft/mcp-sdk/server/stdio.js';
export async function startServer(server: McpServer): Promise<void> {
// Sanity check: ensure fork SDK with bulk registration is present
if (typeof (server as any).registerTools !== 'function') {
throw new Error(
'registerTools method missing. Likely incorrect SDK resolved. Expected @camsoft/mcp-sdk.',
);
}
const transport = new StdioServerTransport();
await server.connect(transport);
log('info', 'XcodeBuildMCP Server running on stdio');
}
🤖 Prompt for AI Agents
In src/server/server.ts around lines 15 to 16, add a runtime assertion at the
start of the startServer function to verify that the official SDK package
'@camsoft/mcp-sdk' is loaded and not '@modelcontextprotocol/sdk'. Implement a
check that throws an error immediately if the wrong SDK is detected, ensuring
the server fails fast on startup to prevent alias drift or resolution bugs.

import { log } from '../utils/logger.js';
import { version } from '../version.js';

Expand Down
2 changes: 1 addition & 1 deletion src/utils/tool-registry.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { McpServer, RegisteredTool } from '@modelcontextprotocol/sdk/server/mcp.js';
import { McpServer, RegisteredTool } from '@camsoft/mcp-sdk/server/mcp.js';
import { loadPlugins } from '../core/plugin-registry.js';
import { ToolResponse } from '../types/common.js';
import { log } from './logger.js';
Expand Down