nodejs_inspect
Execute JavaScript code directly inside the debugged Node.js process to inspect variables and test live changes during debugging sessions.
Instructions
Executes JavaScript code in the debugged process
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| js_code | Yes | JavaScript code to execute |
Implementation Reference
- src/mcp-server.js:332-337 (registration)Registration of the 'nodejs_inspect' tool with the MCP server, including the schema definition for the 'js_code' input parameter.
server.tool( "nodejs_inspect", "Executes JavaScript code in the debugged process", { js_code: z.string().describe("JavaScript code to execute") }, - src/mcp-server.js:338-471 (handler)Handler function for the 'nodejs_inspect' tool. It executes JavaScript code in the debugged Node.js process via the Inspector protocol's Runtime.evaluate method, captures console output, handles complex object serialization via getProperties, and returns results as text content.
async ({ js_code }) => { try { // Ensure debugger is enabled if (!inspector.debuggerEnabled) { await inspector.enableDebugger(); } // Capture the current console output length to know where to start capturing new output const consoleStartIndex = inspector.consoleOutput.length; // Wrap the code in a try-catch with explicit console logging for errors let codeToExecute = ` try { ${js_code} } catch (e) { e; // Return the error } `; const response = await inspector.send('Runtime.evaluate', { expression: codeToExecute, contextId: 1, objectGroup: 'console', includeCommandLineAPI: true, silent: false, returnByValue: true, generatePreview: true, awaitPromise: true // This will wait for promises to resolve }); // Give some time for console logs to be processed await new Promise(resolve => setTimeout(resolve, 200)); // Get any console output that was generated during execution const consoleOutputs = inspector.consoleOutput.slice(consoleStartIndex); const consoleText = consoleOutputs.map(output => `[${output.type}] ${output.message}` ).join('\n'); // Process the return value let result; if (response.result) { if (response.result.type === 'object') { if (response.result.value) { // If we have a value, use it result = response.result.value; } else if (response.result.objectId) { // If we have an objectId but no value, the object was too complex to serialize directly // Get more details about the object try { const objectProps = await inspector.getProperties(response.result.objectId); const formattedObject = {}; for (const prop of objectProps.result) { if (prop.value) { if (prop.value.type === 'object' && prop.value.subtype !== 'null') { // For nested objects, try to get their details too if (prop.value.objectId) { try { const nestedProps = await inspector.getProperties(prop.value.objectId); const nestedObj = {}; for (const nestedProp of nestedProps.result) { if (nestedProp.value) { if (nestedProp.value.value !== undefined) { nestedObj[nestedProp.name] = nestedProp.value.value; } else { nestedObj[nestedProp.name] = nestedProp.value.description || `[${nestedProp.value.subtype || nestedProp.value.type}]`; } } } formattedObject[prop.name] = nestedObj; } catch (nestedErr) { formattedObject[prop.name] = prop.value.description || `[${prop.value.subtype || prop.value.type}]`; } } else { formattedObject[prop.name] = prop.value.description || `[${prop.value.subtype || prop.value.type}]`; } } else if (prop.value.type === 'function') { formattedObject[prop.name] = '[function]'; } else if (prop.value.value !== undefined) { formattedObject[prop.name] = prop.value.value; } else { formattedObject[prop.name] = `[${prop.value.type}]`; } } } result = formattedObject; } catch (propErr) { // If we can't get properties, at least show the object description result = response.result.description || `[${response.result.subtype || response.result.type}]`; } } else { // Fallback for objects without value or objectId result = response.result.description || `[${response.result.subtype || response.result.type}]`; } } else if (response.result.type === 'undefined') { result = undefined; } else if (response.result.value !== undefined) { result = response.result.value; } else { result = `[${response.result.type}]`; } } let responseContent = []; // Add console output if there was any if (consoleText.length > 0) { responseContent.push({ type: "text", text: `Console output:\n${consoleText}` }); } // Add the result responseContent.push({ type: "text", text: `Code executed successfully. Result: ${JSON.stringify(result, null, 2)}` }); return { content: responseContent }; } catch (err) { return { content: [{ type: "text", text: `Error executing code: ${err.message}` }] }; } } - src/mcp-server.js:335-337 (schema)Input schema for nodejs_inspect: requires a 'js_code' string parameter describing JavaScript code to execute.
{ js_code: z.string().describe("JavaScript code to execute") },