⚠️ DRAFT DOCUMENTATION
This API reference is based on mcp-debugger v0.10.0 and will be updated as the architecture evolves.
- IDebugAdapter Interface
- SessionManager API
- ProxyManager API
- AdapterRegistry API
- Event System
- Type Definitions
The core interface that all language adapters must implement.
Source: src/adapters/debug-adapter-interface.ts
readonly language: DebugLanguage; // Language identifier
readonly name: string; // Human-readable adapter nameInitializes the adapter and prepares it for use.
When called: After adapter creation, before any operations
Expected behavior: Validate environment, set up internal state
Emits: 'initialized' event on success
Cleans up resources and connections.
When called: When session ends or adapter is no longer needed
Expected behavior: Close connections, clean up resources
Emits: 'disposed' event
Returns the current adapter state.
Returns: One of: UNINITIALIZED, INITIALIZING, READY, CONNECTED, DEBUGGING, DISCONNECTED, ERROR
Quick check if adapter is ready for debugging.
Returns: true if adapter can accept debug operations
Gets the currently active thread ID during debugging.
Returns: Thread ID or null if not debugging
Comprehensive environment check for debugging readiness.
Returns:
{
valid: boolean;
errors: ValidationError[];
warnings: ValidationWarning[];
}Example:
const result = await adapter.validateEnvironment();
if (!result.valid) {
console.error('Environment issues:', result.errors);
}Lists all dependencies needed for debugging.
Returns: Array of dependency information with install commands
Finds or validates the language runtime executable.
Parameters:
preferredPath- User-specified path (optional)
Returns: Resolved executable path
Throws: AdapterError if executable not found
Platform-aware default executable name.
Returns: e.g., 'python', 'node', 'go'
Paths to search for the executable.
Returns: Array of paths (usually from PATH environment variable)
Constructs the command to launch the debug adapter process.
Parameters:
{
sessionId: string;
executablePath: string;
adapterHost: string;
adapterPort: number;
logDir: string;
scriptPath: string;
scriptArgs?: string[];
launchConfig: GenericLaunchConfig;
}Returns:
{
command: string; // Executable to run
args: string[]; // Command line arguments
env?: Record<string, string>; // Environment variables
}Debug adapter module identifier.
Returns: e.g., 'debugpy.adapter', 'js-debug'
Command to install the debug adapter.
Returns: e.g., 'pip install debugpy', 'bundled with @debugmcp/adapter-javascript'
Converts generic config to language-specific format (async since v2.1.0).
Parameters: Generic launch configuration Returns: Promise resolving to language-specific configuration with additional fields
Default configuration values for the language.
Returns: Common default settings
Handles language-specific path requirements.
Parameters:
{
isContainer: boolean;
workspaceRoot: string;
platform: NodeJS.Platform;
}Returns: Translated path suitable for the debug adapter
Translates paths for breakpoint locations.
Parameters: Same as translateScriptPath
Returns: Translated breakpoint file path
Sends a DAP request (usually delegated to ProxyManager).
Parameters:
command- DAP command nameargs- Command arguments
Returns: DAP response
Processes incoming DAP events.
Critical: Must update internal state based on events!
Example:
handleDapEvent(event: DebugProtocol.Event): void {
if (event.event === 'stopped') {
this.currentThreadId = event.body?.threadId;
this.transitionTo(AdapterState.DEBUGGING);
}
this.emit(event.event, event.body);
}Processes DAP responses if special handling needed.
Establishes connection to debug adapter.
Parameters: Host and port for connection
Emits: 'connected' event on success
Closes debug adapter connection.
Emits: 'disconnected' event
Connection status check.
Returns: true if connected to debug adapter
User-friendly installation guide for the debugger.
Returns: Multi-line instructions with platform-specific commands
Error message when runtime is not found.
Returns: Helpful error with installation hints
Converts generic errors to language-specific messages.
Parameters: Original error
Returns: User-friendly error message
Checks if a DAP feature is supported.
Parameters: Feature from DebugFeature enum
Returns: true if supported
Requirements for enabling a feature.
Returns: Array of requirements (dependencies, versions, etc.)
Full DAP capabilities declaration.
Returns: Object matching DAP Capabilities specification
Manages debug sessions and coordinates adapters with ProxyManager.
Source: src/session/session-manager.ts
Creates a new debug session.
Parameters:
{
language: DebugLanguage;
name?: string;
config?: Partial<LaunchConfig>;
}Returns: Session information with unique ID
Starts debugging for a session.
Parameters:
{
sessionId: string;
script: string;
launchConfig?: Partial<LaunchConfig>;
executablePath?: string;
args?: string[];
env?: Record<string, string>;
cwd?: string;
}Returns: Debug result with success status
setBreakpoints(sessionId: string, file: string, breakpoints: SourceBreakpoint[]): Promise<Breakpoint[]>
Sets breakpoints in a file.
Returns: Array of verified breakpoints with actual locations
Resumes execution from a breakpoint.
Steps over the current line.
Steps into a function call.
Steps out of the current function.
Pauses execution.
Terminates the debug session.
Gets the current call stack.
Gets variable scopes for a stack frame.
Gets variables in a scope.
Evaluates an expression in the current context.
Retrieves session information.
Lists all active sessions.
Removes a session and cleans up resources.
Manages debug adapter process lifecycle and DAP communication.
Source: src/proxy/proxy-manager.ts
Creates a new ProxyManager with an adapter.
Starts the debug adapter process and establishes connection.
Sends a DAP request and waits for response.
Stops the debug adapter process and cleans up.
ProxyManager forwards all DAP events from the adapter:
stopped,continued,terminated,exitedthread,output,breakpoint,module- Plus adapter lifecycle events
Manages available debug adapters.
Source: src/adapters/adapter-registry.ts
Registers a new adapter factory.
Example:
registry.register('python', new PythonAdapterFactory());Creates an adapter instance.
Throws: AdapterNotFoundError if language not supported
Checks if a language has a registered adapter.
Lists all registered languages.
All adapters emit these events:
interface AdapterEvents {
// DAP events
'stopped': (event: DebugProtocol.StoppedEvent) => void;
'continued': (event: DebugProtocol.ContinuedEvent) => void;
'terminated': (event: DebugProtocol.TerminatedEvent) => void;
'exited': (event: DebugProtocol.ExitedEvent) => void;
'thread': (event: DebugProtocol.ThreadEvent) => void;
'output': (event: DebugProtocol.OutputEvent) => void;
'breakpoint': (event: DebugProtocol.BreakpointEvent) => void;
'module': (event: DebugProtocol.ModuleEvent) => void;
// Lifecycle events
'initialized': () => void;
'connected': () => void;
'disconnected': () => void;
'error': (error: AdapterError) => void;
// State events
'stateChanged': (oldState: AdapterState, newState: AdapterState) => void;
}Critical: Understanding event order is crucial! See DAP Sequence Reference
Common sequences:
- Breakpoint hit:
stopped(reason: 'breakpoint') - Continue: Request → (no event if explicit) → Running
- Program end:
exited→terminated - User stop:
terminated(may haveexitedif killed)
enum DebugLanguage {
PYTHON = 'python',
MOCK = 'mock',
// Future: NODE = 'node', GO = 'go', etc.
}
enum AdapterState {
UNINITIALIZED = 'uninitialized',
INITIALIZING = 'initializing',
READY = 'ready',
CONNECTED = 'connected',
DEBUGGING = 'debugging',
DISCONNECTED = 'disconnected',
ERROR = 'error'
}
interface ValidationResult {
valid: boolean;
errors: ValidationError[];
warnings: ValidationWarning[];
}
interface AdapterCommand {
command: string;
args: string[];
env?: Record<string, string>;
}class AdapterError extends Error {
constructor(
message: string,
public code: AdapterErrorCode,
public recoverable: boolean = false
);
}
enum AdapterErrorCode {
ENVIRONMENT_INVALID = 'ENVIRONMENT_INVALID',
EXECUTABLE_NOT_FOUND = 'EXECUTABLE_NOT_FOUND',
ADAPTER_NOT_INSTALLED = 'ADAPTER_NOT_INSTALLED',
CONNECTION_FAILED = 'CONNECTION_FAILED',
// ... more codes
}// 1. Create session
const sessionInfo = await sessionManager.createSession({
language: 'python',
name: 'My Debug Session'
});
// 2. Set breakpoints
await sessionManager.setBreakpoints(
sessionInfo.sessionId,
'app.py',
[{ line: 10 }, { line: 20 }]
);
// 3. Start debugging
await sessionManager.startDebugging({
sessionId: sessionInfo.sessionId,
script: 'app.py',
launchConfig: { stopOnEntry: true }
});
// 4. Listen for events
sessionManager.on('stopped', (event) => {
console.log('Paused at:', event.body.reason);
});
// 5. Continue execution
await sessionManager.continue(sessionInfo.sessionId);class MyAdapter extends EventEmitter implements IDebugAdapter {
// Implement all required methods
// See MockDebugAdapter for complete example
}
// Register it
const registry = new AdapterRegistry(dependencies);
registry.register('mylang', new MyAdapterFactory());
// Use it
const adapter = registry.create('mylang', config);- Always handle events - Update adapter state based on DAP events
- Emit events - Notify listeners of state changes
- Provide context in errors - Include helpful messages and recovery hints
- Log important operations - Use the provided logger for debugging
- Test thoroughly - Use mock adapter for integration tests