@ai-capabilities-suite/mcp-debugger-server
Version:
Enterprise-grade MCP server providing advanced debugging capabilities for Node.js and TypeScript applications. Features 25+ debugging tools including breakpoints, variable inspection, execution control, CPU/memory profiling, hang detection, source map sup
722 lines (573 loc) • 16.4 kB
Markdown
# VS Code Extension Integration Guide
This guide provides instructions for integrating the MCP Debugger Server with VS Code and GitHub Copilot.
## Table of Contents
- [Overview](#overview)
- [Installation](#installation)
- [Configuration](#configuration)
- [Debugging Workflows](#debugging-workflows)
- [GitHub Copilot Integration](#github-copilot-integration)
- [Configuration Examples](#configuration-examples)
## Overview
The MCP Debugger Server can be integrated with VS Code in two ways:
1. **Direct MCP Integration**: Use VS Code's MCP support (if available)
2. **Custom Extension**: Create a VS Code extension that wraps the MCP server
This guide covers both approaches and provides examples for common project types.
## Installation
### Prerequisites
- VS Code 1.80 or higher
- Node.js 16 or higher
- MCP Debugger Server built and ready
### Option 1: Direct MCP Integration
If VS Code supports MCP directly:
1. Install the MCP extension for VS Code (if available)
2. Configure the MCP server in VS Code settings
### Option 2: Custom Extension
To create a custom VS Code extension:
```bash
# Install Yeoman and VS Code extension generator
npm install -g yo generator-code
# Generate a new extension
yo code
# Select "New Extension (TypeScript)"
# Name: mcp-debugger-vscode
# Description: MCP Debugger integration for VS Code
```
## Configuration
### VS Code Settings
Add the MCP Debugger Server to your VS Code settings (`.vscode/settings.json`):
```json
{
"mcp.servers": {
"debugger": {
"command": "node",
"args": ["${workspaceFolder}/packages/mcp-server/dist/src/index.js"],
"transport": "stdio"
}
}
}
```
### Workspace Configuration
For multi-root workspaces, configure in the workspace file:
```json
{
"folders": [
{ "path": "." }
],
"settings": {
"mcp.servers": {
"debugger": {
"command": "node",
"args": ["${workspaceFolder}/packages/mcp-server/dist/src/index.js"]
}
}
}
}
```
## Debugging Workflows
### Workflow 1: Debug Current File
**Steps:**
1. Open a JavaScript or TypeScript file
2. Open the Command Palette (Ctrl+Shift+P / Cmd+Shift+P)
3. Run: "MCP Debugger: Debug Current File"
4. The debugger starts and pauses at the first line
**VS Code Extension Command:**
```typescript
vscode.commands.registerCommand('mcp-debugger.debugCurrentFile', async () => {
const editor = vscode.window.activeTextEditor;
if (!editor) {
vscode.window.showErrorMessage('No active editor');
return;
}
const filePath = editor.document.uri.fsPath;
// Call MCP tool: debugger_start
const session = await mcpClient.callTool('debugger_start', {
command: 'node',
args: [filePath]
});
vscode.window.showInformationMessage(`Debug session started: ${session.sessionId}`);
});
```
### Workflow 2: Debug with Breakpoints
**Steps:**
1. Set breakpoints in your code (click in the gutter)
2. Open Command Palette
3. Run: "MCP Debugger: Start Debugging"
4. The debugger starts and stops at your breakpoints
**VS Code Extension Command:**
```typescript
vscode.commands.registerCommand('mcp-debugger.startDebugging', async () => {
const editor = vscode.window.activeTextEditor;
if (!editor) return;
const filePath = editor.document.uri.fsPath;
// Start session
const session = await mcpClient.callTool('debugger_start', {
command: 'node',
args: [filePath]
});
// Set breakpoints from VS Code
const breakpoints = vscode.debug.breakpoints;
for (const bp of breakpoints) {
if (bp instanceof vscode.SourceBreakpoint) {
await mcpClient.callTool('debugger_set_breakpoint', {
sessionId: session.sessionId,
file: bp.location.uri.fsPath,
line: bp.location.range.start.line + 1
});
}
}
// Continue execution
await mcpClient.callTool('debugger_continue', {
sessionId: session.sessionId
});
});
```
### Workflow 3: Debug Tests
**Steps:**
1. Open a test file
2. Open Command Palette
3. Run: "MCP Debugger: Debug Test File"
4. Select test framework (Jest/Mocha/Vitest)
5. The debugger runs your tests with debugging enabled
**VS Code Extension Command:**
```typescript
vscode.commands.registerCommand('mcp-debugger.debugTestFile', async () => {
const editor = vscode.window.activeTextEditor;
if (!editor) return;
const filePath = editor.document.uri.fsPath;
// Detect test framework
const framework = await detectTestFramework();
let command, args;
if (framework === 'jest') {
command = 'node';
args = ['node_modules/.bin/jest', filePath, '--runInBand'];
} else if (framework === 'mocha') {
command = 'node';
args = ['node_modules/.bin/mocha', filePath];
} else if (framework === 'vitest') {
command = 'node';
args = ['node_modules/.bin/vitest', 'run', filePath];
}
// Start debug session
const session = await mcpClient.callTool('debugger_start', {
command,
args,
timeout: 60000
});
vscode.window.showInformationMessage(`Debugging tests: ${filePath}`);
});
```
### Workflow 4: Inspect Variables
**Steps:**
1. While paused at a breakpoint
2. Hover over a variable to see its value
3. Or use the Debug Console to evaluate expressions
**VS Code Extension Implementation:**
```typescript
// Hover provider for variable inspection
vscode.languages.registerHoverProvider(['javascript', 'typescript'], {
async provideHover(document, position, token) {
const session = getCurrentDebugSession();
if (!session || !session.isPaused) return;
const wordRange = document.getWordRangeAtPosition(position);
if (!wordRange) return;
const word = document.getText(wordRange);
// Evaluate expression
const result = await mcpClient.callTool('debugger_inspect', {
sessionId: session.sessionId,
expression: word
});
return new vscode.Hover(`**${word}**: ${result.value} (${result.type})`);
}
});
```
### Workflow 5: Step Through Code
**Steps:**
1. While paused at a breakpoint
2. Use the debug toolbar or keyboard shortcuts:
- F10: Step Over
- F11: Step Into
- Shift+F11: Step Out
- F5: Continue
**VS Code Extension Commands:**
```typescript
// Step Over
vscode.commands.registerCommand('mcp-debugger.stepOver', async () => {
const session = getCurrentDebugSession();
if (!session) return;
await mcpClient.callTool('debugger_step_over', {
sessionId: session.sessionId
});
updateDebugView();
});
// Step Into
vscode.commands.registerCommand('mcp-debugger.stepInto', async () => {
const session = getCurrentDebugSession();
if (!session) return;
await mcpClient.callTool('debugger_step_into', {
sessionId: session.sessionId
});
updateDebugView();
});
// Step Out
vscode.commands.registerCommand('mcp-debugger.stepOut', async () => {
const session = getCurrentDebugSession();
if (!session) return;
await mcpClient.callTool('debugger_step_out', {
sessionId: session.sessionId
});
updateDebugView();
});
// Continue
vscode.commands.registerCommand('mcp-debugger.continue', async () => {
const session = getCurrentDebugSession();
if (!session) return;
await mcpClient.callTool('debugger_continue', {
sessionId: session.sessionId
});
});
```
## GitHub Copilot Integration
### Overview
GitHub Copilot can use the MCP Debugger Server to assist with debugging tasks.
### Configuration
Enable Copilot to access the MCP server:
```json
{
"github.copilot.advanced": {
"mcp": {
"enabled": true,
"servers": ["debugger"]
}
}
}
```
### Copilot Debugging Patterns
#### Pattern 1: Ask Copilot to Debug
**User:** "Debug this function and tell me why it's not working"
**Copilot:**
```
I'll debug the function for you.
[Copilot uses debugger_start to start a session]
[Copilot uses debugger_set_breakpoint to set a breakpoint]
[Copilot uses debugger_continue to run to the breakpoint]
[Copilot uses debugger_get_local_variables to inspect state]
The issue is that the 'user' variable is undefined at line 25.
You need to initialize it before this point.
```
#### Pattern 2: Ask Copilot to Find a Bug
**User:** "Find the bug in this code"
**Copilot:**
```
I'll analyze the code with the debugger.
[Copilot uses debugger_detect_hang to check for infinite loops]
[If no hang, uses debugger_start and steps through the code]
[Copilot uses debugger_inspect to evaluate expressions]
Found the bug: The loop condition on line 42 should be 'i < array.length'
not 'i <= array.length'. This causes an array index out of bounds error.
```
#### Pattern 3: Ask Copilot to Explain Execution
**User:** "Explain how this function executes"
**Copilot:**
```
I'll step through the function and explain each step.
[Copilot uses debugger_start]
[Copilot uses debugger_set_breakpoint at key locations]
[Copilot uses debugger_step_over to step through]
[Copilot uses debugger_get_local_variables at each step]
Here's how the function executes:
1. Line 10: Initializes count = 0
2. Line 11: Loops through items array
3. Line 12: For each item, checks if item.active is true
4. Line 13: If true, increments count
5. Line 15: Returns the final count
The function counts the number of active items in the array.
```
### Copilot Agent Mode
In agent mode, Copilot can autonomously use debugging tools:
```typescript
// Copilot agent configuration
{
"agent": {
"name": "debugger-assistant",
"description": "Helps debug Node.js and TypeScript code",
"tools": [
"debugger_start",
"debugger_set_breakpoint",
"debugger_continue",
"debugger_step_over",
"debugger_step_into",
"debugger_step_out",
"debugger_inspect",
"debugger_get_local_variables",
"debugger_get_stack",
"debugger_detect_hang",
"debugger_stop_session"
],
"instructions": [
"When asked to debug code, start a debug session",
"Set breakpoints at key locations",
"Step through the code to understand execution",
"Inspect variables to find issues",
"Explain findings clearly to the user",
"Always cleanup sessions when done"
]
}
}
```
## Configuration Examples
### Example 1: Node.js Application
**Project Structure:**
```
my-app/
├── src/
│ ├── index.js
│ └── utils.js
├── package.json
└── .vscode/
└── settings.json
```
**VS Code Settings:**
```json
{
"mcp.servers": {
"debugger": {
"command": "node",
"args": ["${workspaceFolder}/node_modules/@ai-capabilities-suite/mcp-server/dist/src/index.js"]
}
},
"mcp-debugger.defaultCommand": "node",
"mcp-debugger.defaultArgs": ["${file}"]
}
```
### Example 2: TypeScript Application
**Project Structure:**
```
my-ts-app/
├── src/
│ ├── index.ts
│ └── utils.ts
├── dist/
│ ├── index.js
│ └── utils.js
├── tsconfig.json
└── .vscode/
└── settings.json
```
**VS Code Settings:**
```json
{
"mcp.servers": {
"debugger": {
"command": "node",
"args": ["${workspaceFolder}/node_modules/@ai-capabilities-suite/mcp-server/dist/src/index.js"]
}
},
"mcp-debugger.defaultCommand": "node",
"mcp-debugger.defaultArgs": [
"--enable-source-maps",
"${workspaceFolder}/dist/${fileBasenameNoExtension}.js"
],
"mcp-debugger.sourceMapSupport": true
}
```
**tsconfig.json:**
```json
{
"compilerOptions": {
"sourceMap": true,
"outDir": "./dist"
}
}
```
### Example 3: Jest Tests
**Project Structure:**
```
my-app/
├── src/
│ └── utils.js
├── tests/
│ └── utils.test.js
├── package.json
└── .vscode/
└── settings.json
```
**VS Code Settings:**
```json
{
"mcp.servers": {
"debugger": {
"command": "node",
"args": ["${workspaceFolder}/node_modules/@ai-capabilities-suite/mcp-server/dist/src/index.js"]
}
},
"mcp-debugger.testFramework": "jest",
"mcp-debugger.testCommand": "node",
"mcp-debugger.testArgs": [
"${workspaceFolder}/node_modules/.bin/jest",
"${file}",
"--runInBand"
],
"mcp-debugger.testTimeout": 60000
}
```
### Example 4: Monorepo
**Project Structure:**
```
monorepo/
├── packages/
│ ├── app/
│ │ └── src/
│ └── lib/
│ └── src/
├── package.json
└── .vscode/
└── settings.json
```
**VS Code Settings:**
```json
{
"mcp.servers": {
"debugger": {
"command": "node",
"args": ["${workspaceFolder}/node_modules/@ai-capabilities-suite/mcp-server/dist/src/index.js"]
}
},
"mcp-debugger.workspaceAware": true,
"mcp-debugger.packageManager": "yarn"
}
```
### Example 5: Docker Development
**Project Structure:**
```
my-app/
├── src/
├── Dockerfile
├── docker-compose.yml
└── .vscode/
└── settings.json
```
**VS Code Settings:**
```json
{
"mcp.servers": {
"debugger": {
"command": "docker",
"args": [
"exec",
"-i",
"my-app-container",
"node",
"/app/node_modules/@ai-capabilities-suite/mcp-server/dist/src/index.js"
]
}
}
}
```
## Keyboard Shortcuts
Add these to your `keybindings.json`:
```json
[
{
"key": "f9",
"command": "mcp-debugger.toggleBreakpoint",
"when": "editorTextFocus"
},
{
"key": "f5",
"command": "mcp-debugger.continue",
"when": "inDebugMode"
},
{
"key": "f10",
"command": "mcp-debugger.stepOver",
"when": "inDebugMode"
},
{
"key": "f11",
"command": "mcp-debugger.stepInto",
"when": "inDebugMode"
},
{
"key": "shift+f11",
"command": "mcp-debugger.stepOut",
"when": "inDebugMode"
},
{
"key": "shift+f5",
"command": "mcp-debugger.stop",
"when": "inDebugMode"
},
{
"key": "ctrl+shift+d",
"command": "mcp-debugger.debugCurrentFile",
"when": "editorTextFocus"
}
]
```
## Troubleshooting
### Issue: MCP server not starting
**Cause:** The server path is incorrect or Node.js is not found.
**Solution:**
1. Verify the path in settings.json
2. Check that the server is built: `npx nx build -capabilities-suite/mcp-server`
3. Test the server manually: `node packages/mcp-server/dist/src/index.js`
### Issue: Breakpoints not hitting
**Cause:** Source maps not configured or file paths don't match.
**Solution:**
1. For TypeScript, ensure `"sourceMap": true` in tsconfig.json
2. Use `--enable-source-maps` flag when starting Node.js
3. Verify file paths are absolute
### Issue: Variables not showing
**Cause:** Process is not paused or scope is incorrect.
**Solution:**
1. Ensure the process is paused at a breakpoint
2. Check that you're in the correct stack frame
3. Use the Debug Console to manually evaluate expressions
### Issue: Copilot not using debugger
**Cause:** MCP integration not enabled or configured.
**Solution:**
1. Enable MCP in Copilot settings
2. Verify the debugger server is in the allowed servers list
3. Restart VS Code
## Best Practices
1. **Use workspace settings** for project-specific configuration
2. **Enable source maps** for TypeScript projects
3. **Set appropriate timeouts** for long-running tests
4. **Use conditional breakpoints** to reduce noise
5. **Leverage Copilot** for automated debugging assistance
6. **Clean up sessions** to prevent resource leaks
7. **Use keyboard shortcuts** for efficient debugging
## Extension Development
To create a full VS Code extension:
1. **Generate extension:**
```bash
yo code
```
2. **Add MCP client:**
```bash
npm install /sdk
```
3. **Implement commands:**
- See workflow examples above
4. **Add debug adapter:**
```typescript
vscode.debug.registerDebugAdapterDescriptorFactory('mcp-debugger', {
createDebugAdapterDescriptor(session) {
return new vscode.DebugAdapterInlineImplementation(new McpDebugAdapter());
}
});
```
5. **Package extension:**
```bash
vsce package
```
6. **Publish to marketplace:**
```bash
vsce publish
```
## See Also
- [README.md](./README.md) - User documentation
- [AI-AGENT-INTEGRATION.md](./AI-AGENT-INTEGRATION.md) - AI agent integration
- [API.md](./API.md) - API documentation
- [VS Code Extension API](https://code.visualstudio.com/api) - VS Code extension development
- [GitHub Copilot Documentation](https://docs.github.com/en/copilot) - Copilot integration