openmcp-client/test/patch-mcp-sdk.js

77 lines
2.6 KiB
JavaScript

/**
* source: https://gist.github.com/Laci21/9dd074f3a5a461ab04adb7db678534d3
* issue: https://github.com/modelcontextprotocol/typescript-sdk/issues/217
*
* This script fixes the MCP SDK issue with pkce-challenge ES Module
* It replaces the static require with a dynamic import in the auth.js file
*/
const fs = require('fs');
const path = require('path');
// Path to the file that needs patching
const authFilePath = path.resolve(
__dirname,
'node_modules',
'@modelcontextprotocol',
'sdk',
'dist',
'cjs',
'client',
'auth.js'
);
console.log('Checking if MCP SDK patch is needed...');
// Check if the file exists
if (!fs.existsSync(authFilePath)) {
console.error(`Error: File not found at ${authFilePath}`);
console.log('Make sure you have installed @modelcontextprotocol/sdk package');
process.exit(1);
}
// Read the file content
const fileContent = fs.readFileSync(authFilePath, 'utf8');
// Check if the file already contains our patch
if (fileContent.includes('loadPkceChallenge')) {
console.log('MCP SDK is already patched!');
process.exit(0);
}
// Check if the file contains the problematic require
if (!fileContent.includes("require(\"pkce-challenge\")")) {
console.log('The MCP SDK file does not contain the expected require statement.');
console.log('This patch may not be needed or the SDK has been updated.');
process.exit(0);
}
console.log('Applying patch to MCP SDK...');
// The code to replace the problematic require
const requireLine = "const pkce_challenge_1 = __importDefault(require(\"pkce-challenge\"));";
const replacementCode = `let pkce_challenge_1 = { default: null };
async function loadPkceChallenge() {
if (!pkce_challenge_1.default) {
const mod = await import("pkce-challenge");
pkce_challenge_1.default = mod.default;
}
}`;
// Replace the require line
let patchedContent = fileContent.replace(requireLine, replacementCode);
// Replace the function call to add the loading step
const challengeCall = "const challenge = await (0, pkce_challenge_1.default)();";
const replacementCall = "await loadPkceChallenge();\n const challenge = await pkce_challenge_1.default();";
patchedContent = patchedContent.replace(challengeCall, replacementCall);
// Write the patched content back to the file
fs.writeFileSync(authFilePath, patchedContent, 'utf8');
console.log('✅ MCP SDK patched successfully!');
console.log('The patch changes:');
console.log('1. Replaced static require with dynamic import for pkce-challenge');
console.log('2. Added async loading function to handle the import');
console.log('\nYou should now be able to run the application without ESM errors.');