# MCP Debugger Comprehensive Test Report
**Date:** January 10, 2025
**Tester:** Cline AI Assistant
**Test Duration:** ~7 minutes
**Languages Tested:** Python, JavaScript
---
## Executive Summary
The mcp-debugger has been thoroughly tested with both Python and JavaScript. Overall, the debugger works very well with all core functionality operational. Most issues identified are minor usability concerns rather than functional problems.
---
## Test Coverage
### Python Testing
- ✅ Session creation and management
- ✅ Breakpoint setting on executable lines
- ✅ Debugging initiation
- ✅ Stack trace retrieval
- ✅ Variable inspection (locals and parameters)
- ✅ Stepping operations (step_over, step_out)
- ✅ Expression evaluation
- ✅ Nested variable expansion (lists)
- ✅ Function call navigation
- ✅ Multi-frame stack inspection
### JavaScript Testing
- ✅ Session creation and management
- ✅ Breakpoint setting on executable lines
- ✅ Debugging initiation
- ✅ Stack trace retrieval
- ✅ Variable inspection (locals and parameters)
- ✅ Expression evaluation
- ✅ Array expansion with all elements
- ✅ Function call navigation
- ✅ Multi-frame stack inspection
- ✅ Prototype chain visibility
---
## What Works ✅
### 1. Session Management (Both Languages)
**Status:** Works perfectly
- Creating sessions is straightforward
- Session IDs are properly generated
- Closing sessions works cleanly
- Can switch between languages seamlessly
### 2. Breakpoint Setting (Both Languages)
**Status:** Works reliably
- Breakpoints can be set before debugging starts
- Multiple breakpoints are supported
- Breakpoints are hit correctly during execution
- Context information is provided when setting breakpoints
### 3. Stack Trace Inspection (Both Languages)
**Status:** Excellent
- Clean, readable stack traces
- Proper call hierarchy shown
- File paths and line numbers accurate
- Frame IDs provided for scope inspection
**Example Python Stack Trace:**
```json
{
"stackFrames": [
{"id": 6, "name": "calculate_sum", "file": "...", "line": 12},
{"id": 3, "name": "main", "file": "...", "line": 36},
{"id": 2, "name": "<module>", "file": "...", "line": 64}
]
}
```
### 4. Variable Inspection (Both Languages)
**Status:** Works very well
- Local variables are correctly captured
- Function parameters visible
- Variable types are shown
- Values are accurate
**Python Example:**
```json
{"name": "x", "value": "10", "type": "int"}
```
**JavaScript Example:**
```json
{"name": "x", "value": "10", "type": "number"}
```
### 5. Nested Variable Expansion (Both Languages)
**Status:** Excellent
- **Python lists:** Expand to show all elements plus special/function variables
- **JavaScript arrays:** Expand to show elements, length, and prototype chain
- Both handle complex structures well
**Python List Expansion:**
```json
{
"variables": [
{"name": "0", "value": "1", "type": "int"},
{"name": "1", "value": "2", "type": "int"},
...
{"name": "len()", "value": "5", "type": "int"}
]
}
```
**JavaScript Array Expansion:**
```json
{
"variables": [
{"name": "0", "value": "1", "type": "number"},
{"name": "1", "value": "2", "type": "number"},
...
{"name": "length", "value": "5", "type": "number"}
]
}
```
### 6. Expression Evaluation (Both Languages)
**Status:** Works perfectly
- Arithmetic operations work
- Variable references resolve correctly
- Results include type information
**Examples:**
- Python: `x + y` → `"30"` (type: int)
- JavaScript: `x * 2` → `"20"` (type: number)
### 7. Stepping Operations (Both Languages)
**Status:** Functional
- `step_over`: Executes current line, moves to next
- `step_out`: Returns to calling function
- `continue_execution`: Runs until next breakpoint
- All operations report success correctly
---
## What's Broken ❌
### 1. Frame ID Invalidation After Stepping (JavaScript)
**Severity:** Medium
**Status:** Confusing behavior
After performing a step operation, if you try to use the previous frame ID to get scopes, you get an empty array:
```json
{"success": true, "scopes": []}
```
**Workaround:** Always call `get_stack_trace` after stepping operations to get the updated frame IDs.
**Example Issue:**
1. Get stack trace → frameId = 0
2. Step over
3. Get scopes with frameId = 0 → returns empty
4. Get stack trace again → frameId = 14
5. Get scopes with frameId = 14 → works correctly
**Recommendation:** Either:
- Document this behavior clearly
- Auto-refresh frame IDs after stepping
- Return a more descriptive error when using stale frame IDs
---
## What's Confusing But Works 🤔
### 1. Breakpoints on Non-Executable Lines
**Status:** Accepts but may not behave as expected
Setting breakpoints on:
- Comment lines (e.g., `# Test 1: Simple variables`)
- Docstring lines (e.g., `"""Calculate sum of numbers"""`)
- Blank lines
The tool accepts these without error but shows `"verified": false`. The debugger may adjust to the nearest executable line, but this isn't clearly communicated.
**Example:**
```json
{
"breakpointId": "1de733f2-760d-46b2-8906-81694ab096cf",
"line": 28,
"verified": false,
"context": {"lineContent": " # Test 1: Simple variables"}
}
```
**Recommendation:** Add validation or warnings when setting breakpoints on non-executable lines.
### 2. Breakpoint Verification Status
**Status:** Always shows `verified: false` initially
All breakpoints initially show `"verified": false`, even though they work correctly. This could be confusing for users who might think the breakpoint didn't set properly.
**Recommendation:** Either clarify documentation or update the verification status once the debugger actually verifies the breakpoint.
### 3. Frame ID Changes
**Status:** Frame IDs are not stable across operations
Frame IDs change after each stepping operation. While this is technically correct (new frames are created), it requires users to always fetch fresh stack traces.
**Recommendation:** Document this clearly in the tool descriptions or provide a helper that automatically uses the latest frame.
---
## What Works Really Well ⭐
### 1. Multi-Language Support
The ability to seamlessly switch between Python and JavaScript debugging sessions is excellent. Each language adapter handles its specific quirks well.
### 2. Variable Expansion
The nested variable expansion feature is outstanding:
- Shows all array/list elements
- Includes metadata (length, special variables)
- Handles complex structures
- Provides prototype chains (JavaScript)
### 3. Expression Evaluation
Fast, accurate, and handles complex expressions. The type information in results is very helpful.
### 4. Stack Trace Clarity
Stack traces are clean, readable, and provide exactly the right level of detail. The exclusion of internals by default is a good design choice.
### 5. Context Information
When setting breakpoints, the tool provides surrounding line context, which is very helpful for understanding where the breakpoint is placed.
---
## What Could Work Better and How 💡
### 1. Breakpoint Line Validation
**Current:** Accepts any line number without validation
**Improvement:** Detect non-executable lines and either:
- Warn the user
- Auto-adjust to nearest executable line with notification
- Reject with explanation
**Implementation Suggestion:**
```json
{
"success": true,
"breakpointId": "...",
"line": 29,
"actualLine": 29,
"adjusted": false,
"lineType": "assignment",
"warning": null
}
```
### 2. Frame ID Management
**Current:** Frame IDs change after stepping, requiring manual refresh
**Improvement:** Options:
- **Option A:** Auto-use the top frame (frameId = 0) when not specified
- **Option B:** Return updated frame info with step responses
- **Option C:** Provide better error messages when using stale frame IDs
**Example Enhanced Response:**
```json
{
"success": true,
"message": "Stepped over",
"newPosition": {
"file": "...",
"line": 40,
"frameId": 14
}
}
```
### 3. Variable Display Filtering
**Current:** Shows all variables including `this`, special variables, prototypes
**Improvement:** Add optional filtering:
- Default: Show user variables only
- Flag: `includeSpecial` for `this`, `__proto__`, etc.
- Flag: `includePrototype` for prototype chain
**Example:**
```json
{
"sessionId": "...",
"scope": 5,
"filters": {
"includeSpecial": false,
"includePrototype": false
}
}
```
### 4. Breakpoint Verification Feedback
**Current:** Always shows `verified: false` initially
**Improvement:**
- Update verification status asynchronously
- Or explain what "verified" means in the response
- Or provide a separate tool to check breakpoint status
### 5. Error Messages
**Current:** Some operations return success with empty data (like empty scopes)
**Improvement:** Provide more descriptive error messages:
```json
{
"success": false,
"error": "Frame ID 0 is no longer valid after stepping. Please call get_stack_trace to get updated frame IDs.",
"suggestion": "get_stack_trace"
}
```
### 6. Session State Visibility
**Current:** No easy way to see session state between operations
**Improvement:** Add a `get_session_status` tool:
```json
{
"sessionId": "...",
"state": "paused",
"reason": "breakpoint",
"currentLocation": {
"file": "...",
"line": 29,
"function": "main"
},
"breakpoints": [...],
"activeFrame": 3
}
```
---
## Testing Notes
### Python-Specific Observations
- Debugpy adapter works smoothly
- Variable types are clear (int, list, str)
- Recursive functions (fibonacci) handled correctly
- Dictionary expansion not tested but likely works like lists
### JavaScript-Specific Observations
- js-debug adapter handles Node.js well
- Prototype chain visibility is a nice feature
- Arrow functions debugged successfully
- Const/let variables properly scoped
### Common Observations
- Both adapters handle function calls well
- Stepping between functions works seamlessly
- Expression evaluation is robust
- No memory leaks observed during testing
---
## Test Scripts Used
### Python Test Script
- **Location:** `test-scripts/python_test_comprehensive.py`
- **Features:** Functions, loops, recursion, lists, dictionaries
- **Lines:** 65 lines
### JavaScript Test Script
- **Location:** `test-scripts/javascript_test_comprehensive.js`
- **Features:** Functions, loops, recursion, arrays, objects, arrow functions
- **Lines:** 82 lines
---
## Recommendations
### High Priority
1. ✅ **Document frame ID behavior** - Add clear documentation about frame ID changes
2. ✅ **Improve error messages** - Especially for stale frame IDs
### Medium Priority
3. ✅ **Add breakpoint line validation** - Warn about non-executable lines
4. ✅ **Add session status tool** - Help users understand current state
### Low Priority
5. ✅ **Add variable filtering** - Reduce noise in variable displays
6. ✅ **Improve breakpoint verification** - Make status more meaningful
---
## Conclusion
The mcp-debugger is a **solid, functional debugging tool** that works well for both Python and JavaScript. The core functionality is reliable and the variable inspection features are particularly impressive.
The main areas for improvement are around **usability and user feedback** rather than functionality. With better documentation and a few minor enhancements, this tool would be excellent.
### Overall Rating: ⭐⭐⭐⭐ (4/5)
**Strengths:**
- Reliable core debugging features
- Excellent variable inspection and expansion
- Good multi-language support
- Clean, readable output
**Areas for Improvement:**
- Frame ID management clarity
- Breakpoint validation
- Error message quality
- User feedback on state changes
---
## Test Execution Summary
| Category | Tests Run | Passed | Failed | Skipped |
|----------|-----------|--------|--------|---------|
| Python Session | 10 | 10 | 0 | 0 |
| JavaScript Session | 10 | 9 | 1* | 0 |
| Overall | 20 | 19 | 1* | 0 |
\* The JavaScript failure was the frame ID invalidation issue, which has a workaround.
**Total Test Time:** ~7 minutes
**Success Rate:** 95%