/SKILL.md
Drive live debug sessions for Python, Node.js, TypeScript, C, C++, Rust, Java, Scala, and WebAssembly using the Debugium MCP tools. Use when asked to debug code, set breakpoints, inspect variables, step through execution, trace bugs, or find why something crashes.
npx skillsauth add algiras/debugium Debugium DAP DebuggerInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Debugium is a DAP (Debug Adapter Protocol) client with an MCP interface and a real-time web UI. You can control any active debug session — set breakpoints, step through code, inspect live values, record findings, and annotate the source editor.
cargo install --path crates/debugium-server
Add to .mcp.json (project root) or ~/.claude.json:
{
"mcpServers": {
"debugium": { "command": "debugium", "args": ["mcp"] }
}
}
| Language | Install |
|----------|---------|
| Python | pip install debugpy |
| Node.js / TypeScript | js-debug (build from microsoft/vscode-js-debug) + npm i -g tsx for TS |
| C / C++ / Rust | lldb-dap (ships with LLVM: brew install llvm) |
| Java | microsoft/java-debug adapter JAR |
| Scala | Running Metals language server with DAP |
Preferred: use a dap.json config from examples/. All paths must be absolute.
# Python — multiple breakpoints with -b
debugium launch /abs/path/script.py --config examples/python.dap.json \
-b /abs/path/script.py:42 -b /abs/path/script.py:67
# Comma-separated lines in one file
debugium launch /abs/path/script.py --adapter python \
--breakpoint /abs/path/script.py:10,15,20
# Node.js
debugium launch /abs/path/app.js --config examples/node.dap.json \
-b /abs/path/app.js:15 -b /abs/path/app.js:30
# TypeScript
debugium launch /abs/path/app.ts --config examples/typescript.dap.json \
-b /abs/path/app.ts:10
# C / C++ (compile with debug symbols first: cc -g -O0)
debugium launch /tmp/a.out --config examples/c-cpp.dap.json \
-b /abs/path/main.c:20
# Rust (cargo build first)
debugium launch ./target/debug/myapp --config examples/c-cpp.dap.json \
-b /abs/path/src/main.rs:10
# Remote attach (debugpy already listening on 127.0.0.1:5678)
python3 -m debugpy --listen 127.0.0.1:5678 --wait-for-client app.py &
debugium launch app.py --config examples/remote-python.dap.json \
-b /abs/path/app.py:42
Shorthand (Python only): debugium launch script.py --adapter python -b ...
Auto-discovery: place dap.json in project root, then just debugium launch program -b ...
Call get_sessions — if empty, the server isn't running. Launch a session first.
The debugger launches a web UI automatically (unless --no-open-browser). Features:
1. launch_session – start a debug session (or get_sessions if one is already running)
2. get_debug_context – orient: paused_at + locals + call_stack + source_window + breakpoints in ONE call
3. evaluate / get_variables – inspect specific values
4. step_over / step_in – advance (blocking: waits for pause, safe to chain)
5. get_debug_context – re-orient after stepping
6. annotate / add_finding – record conclusions in the UI
7. Repeat 3–6 as needed
8. stop_session – clean up when done
Key insight: get_debug_context replaces the old 7-call chain of
get_threads → get_stack_trace → get_scopes → get_variables. Use it first.
launch_sessionLaunch a new debug session autonomously — no human intervention needed. Spawns the adapter, sets breakpoints, waits until paused.
{ "program": "/abs/path/script.py", "adapter": "python", "breakpoints": ["/abs/path/script.py:42"] }
Returns { "session_id": "...", "status": "paused" | "running" }. Use the returned session_id for all subsequent tool calls.
stop_sessionStop and clean up a debug session. Sends disconnect, kills adapter, removes from registry.
{ "session_id": "session-123" }
get_sessions / list_sessionsList active sessions. Empty = server not started.
{}
get_sourceRead a source file with optional line zoom.
{ "path": "/abs/path/to/file.py", "around_line": 42, "context_lines": 10 }
set_breakpointsSet breakpoints in a file (replaces all existing in that file).
{ "file": "/abs/path/to/script.py", "lines": [42, 67, 103] }
set_breakpointSet or update a single breakpoint with an optional condition.
{ "file": "/abs/path/to/script.py", "line": 42, "condition": "x > 10" }
list_breakpoints / clear_breakpoints{}
set_function_breakpointsBreak on a function name.
{ "names": ["my_function", "ClassName.method"] }
set_exception_breakpoints{ "filter": "raised" } // or "uncaught"
continue_executionResume until the next breakpoint. Returns console_line_count — pass it to
wait_for_output as from_line to avoid matching stale output.
{ "thread_id": 1 }
Returns: { "status": "running", "console_line_count": 42, "hint": "..." }
step_over / step_in / step_outBlocking — waits for the adapter to pause before returning. Safe to chain back-to-back without sleeps. Returns confirmation + "Call get_debug_context for location."
{ "thread_id": 1 }
pause / restart / terminate / disconnect{ "thread_id": 1 }
get_debug_context ★ START HERESingle call returning: paused_at, locals, call_stack, source_window (±5 lines),
breakpoints, frame_id, thread_id. Replaces the old get_threads→stack→scopes→vars chain.
{}
get_threads{}
get_stack_trace{ "thread_id": 1, "depth": 20 }
Returns frames with id (frame_id), name, line, source.
get_scopes{ "frame_id": 2 }
Returns scopes (Locals, Globals) each with variablesReference.
get_variables{ "variables_reference": 6 }
Nested objects have their own variablesReference — call recursively to drill in.
evaluateEvaluate any expression in the current frame.
{ "expression": "len(my_list)", "frame_id": 2, "context": "repl" }
set_variableMutate a variable in the current scope.
{ "variables_reference": 6, "name": "counter", "value": "0" }
get_exception_infoDetails about the current exception (when stopped on exception).
{}
get_capabilitiesWhat the adapter supports.
{}
get_console_outputLast N lines of stdout/stderr.
{ "lines": 50 }
wait_for_outputPoll until stdout matches a regex (or timeout). Use from_line from
continue_execution to only match new output — not output from earlier in the session.
{ "pattern": "Error.*line", "from_line": 42, "timeout_secs": 10 }
get_timelineEvery stop in this session: file, line, changed variables, stack summary.
{ "limit": 50 }
get_variable_historyHow one variable's value changed across all stops. Answers "when did X go wrong?"
{ "name": "counter" }
annotatePin a colored marker on a source line, visible to the human in the editor.
{ "file": "/abs/path/to/file.py", "line": 42, "message": "off-by-one here", "color": "red" }
get_annotationsRead back all annotations you've already placed — do this at session start to avoid re-investigating known lines.
{}
add_findingRecord a structured conclusion in the Findings panel.
{ "message": "counter overflows at iteration 256", "level": "error" }
Levels: info, warning, error.
get_findingsRead back all findings — do this at session start to avoid restating known conclusions.
{}
add_watch / remove_watchExpressions evaluated automatically at every stop.
{ "expression": "len(queue)" }
get_watchesCurrent expressions + their last evaluated values.
{}
step_untilStep until an expression becomes true (up to max_steps).
{ "condition": "i == 10", "max_steps": 50 }
run_until_exceptionContinue until any exception is raised.
{}
compare_snapshotsDiff variable snapshots between two timeline stops.
{ "stop_a": 3, "stop_b": 7 }
find_first_changeFind the first timeline stop where a variable changed (optionally from an expected value).
{ "variable_name": "counter", "expected_value": "0" }
get_call_treeStack + locals for each frame in one call.
{ "max_depth": 5 }
step_until_changeStep until a variable's value changes.
{ "variable_name": "status", "max_steps": 20 }
explain_exceptionWhen stopped on an exception, gather all relevant context in one call.
{}
restart_frameRe-run execution from a specific stack frame (requires supportsRestartFrame).
{ "frame_id": 2 }
goto_targetsGet valid jump targets for a given source location (requires supportsGotoTargetsRequest).
{ "file": "/abs/path/to/file.py", "line": 43 }
gotoJump execution to a target without running intermediate code.
{ "thread_id": 1, "target_id": 0 }
breakpoint_locationsGet valid breakpoint positions in a line range (requires supportsBreakpointLocationsRequest).
{ "file": "/abs/path/to/file.js", "line": 30, "end_line": 40 }
step_in_targetsList possible step-in targets when a line has multiple calls (requires supportsStepInTargetsRequest).
{ "frame_id": 0 }
loaded_sourcesList all source files currently loaded by the adapter (requires supportsLoadedSourcesRequest).
{}
source_by_referenceFetch source code for generated/internal code by sourceReference ID.
{ "source_reference": 2017626721 }
set_expressionSet the value of an expression (requires supportsSetExpression).
{ "expression": "obj.field", "value": "42", "frame_id": 0 }
read_memoryRead raw bytes from debuggee memory (requires supportsReadMemoryRequest).
{ "memory_reference": "0x7fff5000", "count": 128 }
write_memoryWrite raw bytes to debuggee memory (requires supportsWriteMemoryRequest).
{ "memory_reference": "0x7fff5000", "data": "AQIDBA==" }
disassembleDisassemble machine instructions (requires supportsDisassembleRequest).
{ "memory_reference": "0x100003f00", "instruction_count": 20 }
cancel_requestCancel an in-flight request (requires supportsCancelRequest).
{ "request_id": 42 }
set_data_breakpointBreak when a variable is written/read.
{ "name": "counter", "access_type": "write" }
list_data_breakpoints / clear_data_breakpoints{}
export_sessionExport breakpoints, annotations, findings, and watches as a JSON bundle.
{}
import_sessionRestore exported state into the current session.
{ "data": { "..." } }
| Language | --adapter flag | Prerequisite | Verified |
|-------------|-------------------------------|---------------------------------------|----------|
| Python | python / debugpy | pip install debugpy | ✅ |
| Node.js | node / js | js-debug (bundled) | ✅ |
| TypeScript | typescript / ts / tsx | js-debug + tsx or ts-node | ✅ |
| C / C++ | lldb / codelldb | lldb-dap | ✅ |
| Rust | lldb / rust | lldb-dap + cargo build | ✅ |
| Java | java / jvm | microsoft/java-debug adapter JAR | ✅ |
| Scala | --config scala-jvm.dap.json | scalac + Scala library JAR | ✅ |
| WebAssembly | --config wasm.dap.json | wasmtime + lldb-dap (LLVM ≥16) | ✅ |
| Any adapter | --config dap.json | See dap.json.example | ✅ |
Remote attach is supported via dap.json with host + port fields (no local adapter needed).
# Repeated -b flags (short for --breakpoint)
debugium launch app.py --adapter python -b app.py:10 -b app.py:20 -b other.py:5
# Comma-separated lines in one file
debugium launch app.py --adapter python --breakpoint app.py:10,15,20
# Mix both
debugium launch app.py --adapter python -b app.py:10,20 -b other.py:5
get_debug_context — not get_source. Live runtime values beat static reading.step_over calls freely; each confirms the pause before returning.console_line_count — pass it from continue_execution into wait_for_output as from_line to avoid false positives on old output.get_annotations and get_findings at the start of each session to see what you already know.evaluate before stepping — cheaper than advancing line-by-line. Narrow the bug first.step_until — instead of manually looping, let the tool advance until your condition fires.variablesReference > 0 has children; call get_variables recursively.set_breakpoints call beats many individual ones.tools
Drive live debug sessions for Python, Node.js, TypeScript, C, C++, Rust, Java, Scala, and WebAssembly using the Debugium MCP tools. Use when asked to debug code, set breakpoints, inspect variables, step through execution, trace bugs, or find why something crashes.
tools
Use when work should span one or more detached tasks but still behave like one job with a single owner context. TaskFlow is the durable flow substrate under authoring layers like Lobster, ACPX, plugins, or plain code. Keep conditional logic in the caller; use TaskFlow for flow identity, child-task linkage, waiting state, revision-checked mutations, and user-facing emergence.
tools
# Lobster Lobster executes multi-step workflows with approval checkpoints. Use it when: - User wants a repeatable automation (triage, monitor, sync) - Actions need human approval before executing (send, post, delete) - Multiple tool calls should run as one deterministic operation ## When to use Lobster | User intent | Use Lobster? | | ------------------------------------------------------ | --------------------------
tools
# Lobster Lobster executes multi-step workflows with approval checkpoints. Use it when: - User wants a repeatable automation (triage, monitor, sync) - Actions need human approval before executing (send, post, delete) - Multiple tool calls should run as one deterministic operation ## When to use Lobster | User intent | Use Lobster? | | ------------------------------------------------------ | --------------------------