mcp-dap
Allows debugging C/C++ code via the Debug Adapter Protocol using CodeLLDB.
Allows debugging JavaScript code via the Debug Adapter Protocol using js-debug, enabling breakpoints, stepping, variable inspection, and expression evaluation.
Allows debugging Python code via the Debug Adapter Protocol using debugpy, enabling breakpoints, stepping, variable inspection, and expression evaluation.
Allows debugging Rust code via the Debug Adapter Protocol using CodeLLDB, with support for evaluating Rust expressions when prefixed with '?'.
Allows debugging TypeScript code via the Debug Adapter Protocol using js-debug, enabling breakpoints, stepping, variable inspection, and expression evaluation.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mcp-dapstart debug session for app.py and set breakpoint at line 20"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
mcp-dap
MCP-DAP bridge for enabling code agents to debug processes via the Debug Adapter Protocol (DAP).
Overview
This package provides an MCP (Model Context Protocol) server that exposes debugging capabilities through DAP. It allows AI coding agents to:
Launch and attach to debug sessions
Set breakpoints and step through code
Inspect variables and evaluate expressions
Control execution flow (continue, step over, step into, step out)
Related MCP server: Debug-MCP
Installation
pip install mcp-dapRun with uvx
Run directly from this repo:
uvx --from . mcp-dapRun directly from GitHub:
uvx --from git+https://github.com/ztripez/mcp-dap mcp-dapFor MCP client config, point the server command at uvx:
{
"mcpServers": {
"dap": {
"command": "uvx",
"args": ["--from", "git+https://github.com/ztripez/mcp-dap", "mcp-dap"]
}
}
}Debug adapters
mcp-dap is the MCP bridge; language DAP servers are separate runtime tools.
Python (
debugpy): included as a Python dependency.Rust/C/C++ (
codelldb): install CodeLLDB (vadimcn.vscode-lldb) orcodelldbon PATH.JavaScript/TypeScript (
jsdebug): install Node.js andjs-debug-dap(or have VS Code js-debug).Java (
javadebug): install JDK + VS Code Java Debug extension (vscjava.vscode-java-debug).Go (
godlv): install Delve (go install github.com/go-delve/delve/cmd/dlv@latest).
You can configure adapter paths with environment variables or mcp-dap.toml.
Rust evaluate tip (CodeLLDB)
When using the Rust adapter (rust/codelldb), expression evaluation in repl context is handled by LLDB's command console.
Prefix expressions with
?to evaluate as Rust expressions.Example:
? cli.stepsExample:
? cli
Without the ? prefix, LLDB may interpret input as a debugger command and return errors like 'cli' is not a valid command.
If local variables appear empty at a breakpoint, set the breakpoint one or two lines after variable initialization and try again.
Example:
[adapters.codelldb]
enabled = true
codelldb_path = "/path/to/codelldb"
[adapters.jsdebug]
enabled = true
node_path = "/usr/bin/node"
jsdebug_path = "/home/user/.local/share/mcp-dap/js-debug/src/dapDebugServer.js"Development
# Install with dev dependencies
pip install -e ".[dev]"
# Run tests
pytest
# Run linting
ruff check .
ruff format --check .
# Run type checking
mypy srcUsage
Configure in your MCP client:
{
"mcpServers": {
"dap": {
"command": "mcp-dap"
}
}
}License
MIT
Available Tools
17 toolsdebug_attachA
Attach to a running debug server or process. Returns session_id for subsequent operations. For Python: provide host/port. For Rust: provide pid or program name.
| Name | Required | Description | Default |
|---|---|---|---|
| pid | No | Process ID to attach to (local attach) | |
| host | No | Host to connect to (remote attach) | |
| port | No | Port to connect to (remote attach) | |
| adapter | No | Debug adapter to use | debugpy |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the full burden of behavioral disclosure. It discloses that the tool returns a session_id and that it attaches to a running target, but it does not mention side effects (e.g., pausing the target), error behavior, or the effect of calling with no parameters.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences front-load the core action and return value, then add targeting guidance. No filler words; every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with four optional parameters and no output schema, the description explains the return value and two common attach modes. But it omits the adapter parameter, leaves the no-parameters case ambiguous, and contains the unsupported program-name reference, so an agent still lacks full context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds a useful mapping (Python→host/port, Rust→pid), but it also references a 'program name' for Rust that is not present in the input schema, which is misleading and partially invalidates the added guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete action ('Attach to a running debug server or process') and the resource. The verb 'attach' clearly distinguishes it from sibling tools like debug_launch and debug_disconnect. The return-value note reinforces purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives language-specific usage context ('For Python: provide host/port. For Rust: provide pid or program name.'), which helps an agent choose parameter modes. However, it never explicitly contrasts with debug_launch or says when not to use it; the 'running' qualifier only implies the tool is for existing targets.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
debug_clear_breakpointsA
Clear all breakpoints in a source file.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | Path to source file | |
| session_id | Yes | Debug session ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states the core action but does not mention potential side effects, whether the operation is idempotent, whether an active debug session is required, or what happens if no breakpoints exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence that front-loads the action and scope. There is no redundant filler, and every word contributes to understanding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is minimally sufficient for a simple clear-breakpoints operation, and the schema documents both required parameters. However, with no annotations and no output schema, it lacks guidance on edge cases, side effects, or whether the operation is scoped to a specific debug session.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the parameters are already documented in the input schema. The description adds no extra meaning about session_id or file beyond what the schema provides, warranting the baseline score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Clear') with a precise resource ('all breakpoints in a source file'), immediately distinguishing it from sibling tools like debug_set_breakpoints. It is unambiguous about the scope of the operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies the tool is used when all breakpoints in a file need to be removed, but it does not explicitly state when to prefer it over alternatives such as debug_set_breakpoints for selective manipulation. Usage context is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
debug_continueA
Continue execution. Blocks until execution stops (breakpoint, exception, etc.).
| Name | Required | Description | Default |
|---|---|---|---|
| thread_id | No | Thread ID (uses stopped thread if not specified) | |
| session_id | Yes | Debug session ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the burden of behavioral disclosure. It clearly states that the tool blocks until execution stops and lists breakpoints and exceptions as stop conditions, which is essential for an agent to set expectations. It does not mention side effects or error scenarios, but the blocking behavior is well conveyed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no wasted words. The primary action is front-loaded, and the second sentence adds crucial behavioral context about blocking and termination conditions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is adequate for a simple control tool with two self-explanatory parameters, and the blocking behavior is disclosed. However, it lacks relative guidance for an agent choosing among many debug control siblings, and no output behavior is described. Overall, it is minimally viable but not rich in context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the parameters are already fully described in the schema. The description adds no additional semantic detail about session_id or thread_id, which is acceptable given the baseline. The thread_id default behavior is captured in the schema, not the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Continue execution') and distinguishes it from step-level controls by mentioning blocking behavior and stop conditions. It does not explicitly name alternatives, but the verb and resource are specific enough for an agent to understand the core purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is used when paused, but provides no explicit guidance on when to choose it over step_over, step_into, step_out, or pause. No exclusions or alternative conditions are mentioned, leaving selection largely to the agent's inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
debug_disconnectA
Disconnect from a debug session and optionally terminate the debuggee.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | Debug session ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the burden. It does disclose the important side effect that the debuggee may be terminated, which adds essential safety context. However, it remains vague about when termination happens, whether it is reversible, or what cleanup or permissions are required.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence with no wasted words. The core action is stated first, and the optional termination behavior is included without tangential detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple, but with no output schema and no annotations, the description should clarify side effects more concretely. The phrase 'optionally terminate' leaves open whether termination is a parameter, a default behavior, or dependent on debugger state. Overall adequate for basic invocation but not fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter, session_id, is already documented in the schema as 'Debug session ID' with 100% coverage. The description adds no extra meaning about how to obtain or format the session ID, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Disconnect'), a resource ('debug session'), and an optional side effect ('terminate the debuggee'). It is clearly distinct from siblings like debug_pause or debug_continue, so an agent can identify what this tool does without confusion.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides no explicit guidance on when to use this tool versus alternatives, such as debug_pause for temporary suspension or debug_continue for resuming. The intended use is only inferable from the name and description rather than stated directly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
debug_evaluateC
Evaluate an expression in the debuggee context.
| Name | Required | Description | Default |
|---|---|---|---|
| context | No | Context: repl, watch, hover | repl |
| frame_id | No | Stack frame context | |
| expression | Yes | Expression to evaluate | |
| session_id | Yes | Debug session ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description bears the full burden of disclosing behavior. It states that evaluation happens in the debuggee context but does not disclose whether evaluation can have side effects, how errors are surfaced, or what the result looks like. For a potentially mutating operation, this is a significant gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no filler or redundant wording. Every word carries meaning, and it is appropriately sized for a tool whose parameters are already well documented in the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has no output schema and no annotations, so the description should explain return behavior or side effects, but it does neither. It also fails to indicate when to use this versus nearby debug tools. The schema covers parameters, but an agent still lacks critical operational context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents context, frame_id, expression, and session_id. The description adds minimal semantic value beyond the schema, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Evaluate') and names the resource ('an expression in the debuggee context'), making the core action clear. It does not explicitly differentiate from siblings like debug_get_variables or debug_get_scopes, but the evaluation concept is distinct enough that an agent can infer its role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to use this tool versus alternatives such as debug_get_variables, debug_get_scopes, or debug_step_over. There is no mention of conditions, exclusions, or related tools, leaving the selection entirely to the agent's inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
debug_get_outputA
Get debuggee output (stdout/stderr) since last call.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | Debug session ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the key delta behavior ('since last call') and specifies the content (stdout/stderr), which is meaningful beyond the basic name. However, with no annotations provided, it leaves out other behavioral traits such as whether the output buffer is consumed/cleared, whether the call blocks or returns immediately, and what happens when there is no new output. Some transparency, but not complete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short sentence that front-loads the verb, target resource, and the crucial 'since last call' qualifier. Every word earns its place; there is no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter tool with no output schema, the description captures the essential semantics: what is retrieved and the stateful delta condition. It doesn't describe the return format or handling of empty output, but those are minor for this straightforward getter. The lack of annotations is partially compensated by the clearly stated behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents session_id with a clear description ('Debug session ID') and 100% coverage. The tool description does not add any additional meaning or constraints to the parameter, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description is a specific verb+resource combination: 'Get debuggee output (stdout/stderr) since last call.' It clearly distinguishes this tool from the many other debug_get_* siblings by naming the exact resource (stdout/stderr) and the temporal qualifier. No ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the usage pattern: call this after launching or continuing the debuggee to retrieve new output since the last invocation. While it doesn't explicitly name alternatives, no sibling serves the same purpose, so the context is clear enough. The 'since last call' qualifier provides an important condition that shapes when to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
debug_get_pending_eventsB
Get pending debug events (stopped, output, etc.) since last call.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | Debug session ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral disclosure burden. It adds meaningful context with 'since last call', implying a stateful, incremental retrieval. However, it does not clarify whether events are consumed/drained, whether repeated calls return the same events, or whether there are side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with no filler. It front-loads the action and object, then adds the key temporal constraint, which is ideal for a simple tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter tool, the description is serviceable: it indicates what is returned and the polling semantics. But with no output schema and no sibling differentiation, an agent may not know how this differs from debug_get_output or whether calling it has side effects on the event queue.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the single session_id parameter is already fully documented in the schema. The description adds no additional parameter-level meaning, making the baseline score of 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Get'), a clear resource ('pending debug events'), and a defining scope ('since last call'). It conveys what the tool does and is more than a restatement of the name, though it does not explicitly differentiate itself from siblings like debug_get_output.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given about when to prefer this tool over sibling tools such as debug_get_output or debug_get_threads. The phrase 'since last call' implies a polling pattern, but there is no explicit when-to-use or when-not-to-use context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
debug_get_scopesB
Get variable scopes for a stack frame (locals, globals, etc.).
| Name | Required | Description | Default |
|---|---|---|---|
| frame_id | Yes | Stack frame ID | |
| session_id | Yes | Debug session ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It communicates that the operation is read-only ('Get'), but it does not disclose whether the debug session must be paused, whether the returned scopes include variable values, or what happens for invalid frame/session IDs. This is minimal but not misleading.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no wasted words. It states the action, target resource, and examples in a concise and scannable way.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple and the two parameters are fully schema-covered, but there is no output schema and no annotations, so the description should clarify enough of the result shape and workflow. It partially does by listing 'locals, globals, etc.,' but it omits the relationship to sibling tools and session-state requirements. Adequate for a minimal invocation, with clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents frame_id and session_id. The description adds only that the target is a stack frame, which is already implied by the parameter names. No additional parameter-specific meaning or format details are provided beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Get variable scopes for a stack frame,' with examples like 'locals, globals, etc.' It is clearly distinct from sibling tools such as debug_get_variables because it concerns scopes rather than variables, but it does not explicitly differentiate itself from that sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not explain when to use this tool versus debug_get_variables, debug_get_stack_trace, or other siblings. It implies a stack-frame context but provides no workflow guidance, such as 'call after debug_get_stack_trace' or 'use debug_get_variables to inspect values within a scope.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
debug_get_stack_traceC
Get the call stack for a thread.
| Name | Required | Description | Default |
|---|---|---|---|
| levels | No | Number of frames to retrieve | |
| thread_id | No | Thread ID | |
| session_id | Yes | Debug session ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of disclosing behavior. It only states what the tool does, not what it returns, whether it requires a running session, how thread_id defaulting works, or any side effects. This is insufficient for a debug operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, tightly worded sentence with no wasted words. It front-loads the core purpose and is appropriately concise for the tool's simplicity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite a straightforward purpose, the description omits essential context: there is no output schema, so return format is unexplained; the meaning of a null thread_id is not addressed; and no guidance is given on when the stack trace is available. An agent would likely need to guess or inspect other tools to use this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so each parameter already has a description. The tool description adds no additional parameter-specific meaning, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Get the call stack for a thread' states a clear verb and resource, making the tool's function immediately understandable. It is distinct enough from siblings like debug_get_threads or debug_get_variables, though it does not explicitly differentiate itself from them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to use this tool versus alternatives, no mention of prerequisites (e.g., active debug session), and no exclusions. An agent must infer usage purely from the tool name and sibling list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
debug_get_threadsA
Get all threads in the debuggee.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | Debug session ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the full burden. 'Get' suggests a read-only operation and the description is not misleading, but it does not disclose details such as whether an active session is required, return behavior, or failure conditions. For a simple getter, this is acceptable but minimal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single focused sentence that states the operation and object directly. There is no filler, and the key information is immediately accessible.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given only one required parameter that is fully documented, the description is nearly complete for an agent to invoke the tool correctly. The lack of output schema is not critical for a simple 'get all' verb, though a note about the returned thread data shape could have made it fully self-contained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description coverage is 100%: session_id is described as 'Debug session ID' and marked required. The tool description adds no additional parameter semantics, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Get all threads in the debuggee.' This clearly distinguishes it from sibling tools like debug_get_stack_trace, debug_get_variables, and debug_get_output, which target different aspects of the debugging session.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given about when to use this tool versus alternatives, nor any exclusions or prerequisites. The agent must infer from the name alone that this is for enumerating threads, but nothing explicitly states when this is the right choice over other debug introspection tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
debug_get_variablesC
Get variables for a scope or expandable variable.
| Name | Required | Description | Default |
|---|---|---|---|
| filter | No | Filter: 'indexed' or 'named' | |
| session_id | Yes | Debug session ID | |
| variables_reference | Yes | Variables reference from scope or variable |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full responsibility for behavioral disclosure. It only states what the tool returns conceptually and does not describe read-only behavior, response shape, error behavior, or how 'filter' affects results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no filler or repetition. However, it is so terse that it forfeits opportunities to add useful context, so it is not a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is minimally adequate: it states the tool's purpose and the schema covers all parameters, including the filter options. However, with no output schema and no annotations, it leaves out the response format and the typical flow for obtaining variables_reference, which would make the tool easier to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with all parameters already documented in the input schema. The description adds little beyond hinting that variables_reference refers to a scope or expandable variable, so a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific action ('Get variables') and a specific resource ('variables for a scope or expandable variable'), which clearly distinguishes it from debug_get_scopes. It does not explicitly contrast with debug_evaluate or other siblings, so it is clear but not maximally differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to use this tool versus alternatives, such as debug_get_scopes or debug_evaluate. It also does not mention that variables_reference is typically obtained from a prior scope or variable lookup, or when to use the 'filter' option.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
debug_launchA
Launch a program for debugging. Returns session_id for subsequent operations. For Rust: use adapter='rust' with either 'program' (pre-built binary) or 'cargo_args' (e.g., ['build', '--bin', 'myapp']) to build and debug.
| Name | Required | Description | Default |
|---|---|---|---|
| cwd | No | Working directory | |
| env | No | Environment variables | |
| args | No | Command line arguments | |
| adapter | No | Debug adapter to use | debugpy |
| program | No | Path to the program to debug. Required unless cargo_args is provided. | |
| cargo_args | No | Cargo build arguments (e.g., ['build', '--bin', 'myapp']). If provided, builds with cargo and debugs the result. | |
| stop_on_entry | No | Stop on entry point |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral disclosure burden. It discloses the key return behavior ('Returns session_id'), implies the side effect of launching/building a program, and explains the Rust-specific build-and-debug flow. It does not cover error cases or permission implications, but the core execution behavior is clear and not misleading.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The main action and return value are front-loaded, and the Rust-specific guidance earns its place by resolving a real ambiguity. The structure is compact and scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter tool with nested objects and no output schema, the description is nearly complete: it explains the purpose, return value, and the most complex parameter interaction. The remaining details (env, args, stop_on_entry) are fully documented in the schema, so an agent can invoke the tool correctly with the provided information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds meaningful parameter semantics beyond the schema by explaining how to combine adapter='rust' with either program or cargo_args, and by giving a concrete cargo_args example. This helps an agent choose between two mutually relevant parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Launch') and resource ('a program for debugging'), and clearly distinguishes this from sibling tools like debug_attach and debug_disconnect by framing it as the entry point that produces a session_id. The purpose is unambiguous and immediately actionable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for when to use the tool: to start a debugging session and obtain a session_id for subsequent operations. It also provides concrete guidance for Rust usage with adapter='rust' and the program/cargo_args choice. It does not explicitly mention alternatives like debug_attach, but the launch-vs-attach distinction is implicit and strong enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
debug_pauseC
Pause execution.
| Name | Required | Description | Default |
|---|---|---|---|
| thread_id | No | Thread ID (uses stopped thread if not specified) | |
| session_id | Yes | Debug session ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure, but it reveals nothing about side effects, reversibility, whether the operation is synchronous or asynchronous, or the resulting debugger state. The schema hints at thread-targeted pausing, yet the description adds no behavioral context beyond the bare act of pausing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two words is under-specification rather than conciseness; the single clause is trivially front-loaded but carries almost no information. Consistent with the 'Process' calibration, brevity that omits essential content earns a low score because the sentence does not meaningfully earn its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a control-flow mutation tool with no output schema and no annotations, the description should state the post-condition (execution suspended, where the program stops), how to resume via debug_continue, and what state the session must be in before calling. None of this is present; the agent must reconstruct the entire debug workflow from sibling tool names alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so session_id and thread_id are already documented in the schema and the baseline is 3. The description itself contributes no parameter semantics — it does not mention that pausing can target a stopped thread or that a session_id is required, so it neither compensates nor adds value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Pause execution" states a specific verb and resource, so the basic action is identifiable. However, it is nearly a restatement of the tool name, does not clarify whether pausing targets the whole session or a specific thread, and provides no differentiation from the 16 sibling debug tools. The schema exposes a thread_id parameter that implies thread-scoped pausing, but the description is silent on this.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to use pause versus alternatives like debug_continue, debug_step_over, or debug_get_pending_events. No prerequisites (e.g., an active or running session), timing conditions, or exclusions are mentioned. An agent receives zero routing information from the text.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
debug_set_breakpointsA
Set breakpoints in a source file. Replaces all existing breakpoints in that file.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | Path to source file | |
| session_id | Yes | Debug session ID | |
| breakpoints | Yes | List of breakpoints: [{line: int, condition?: str}] |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It clearly discloses the destructive/overwrite side effect: 'Replaces all existing breakpoints in that file.' This is the most important non-obvious behavior and is explicitly stated. It does not cover all potential behaviors such as error handling or session requirements, but the core side effect is transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two tightly written sentences. The first delivers the core action, and the second adds the crucial replacement behavior without any filler. It is appropriately front-loaded and easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a fairly simple 3-parameter tool with full schema coverage, this description covers the essential behavior. The lack of an output schema is acceptable here since the operation's success is not usually the focus. The main missing piece is an explicit pointer to when this should be used instead of clear/attach, but the description is otherwise sufficient for an agent to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents the file, session_id, and breakpoints parameters well. The description does not add additional parameter-level detail, such as the format of session_id or the exact structure of the breakpoints array beyond what the schema already shows. Baseline 3 is appropriate; the description adds no parameter semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Set breakpoints') and the resource ('a source file'). It also adds the key detail that all existing breakpoints in that file are replaced, which helps distinguish it from other operations. However, it does not explicitly name a sibling tool or contrast itself with debug_clear_breakpoints, so it misses a small opportunity for even clearer differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the usage context: calling this sets a fresh set of breakpoints because prior ones are replaced. Yet it gives no explicit guidance about when to prefer this over debug_clear_breakpoints, debug_attach, or other debug commands. The replacement note indirectly implies when not to use it (e.g., if you want to preserve existing breakpoints), but this is not spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
debug_step_intoA
Step into function call. Blocks until step completes.
| Name | Required | Description | Default |
|---|---|---|---|
| thread_id | No | Thread ID (uses stopped thread if not specified) | |
| session_id | Yes | Debug session ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It does disclose that the call 'blocks until step completes,' which is useful, but it does not mention that execution is resumed, that the debugger must be in a stopped state, or what state the session will be in after the step.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short, focused sentences with no filler. The core operation is front-loaded, and the blocking behavior is communicated efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is adequate for a simple execution-control tool, but with no output schema and no annotations, it leaves some ambiguity about the expected result after completion and any prerequisites such as a paused debug session. It is not fully self-contained, though the schema covers the parameters and the sibling context clarifies the operation type.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already fully documents both session_id and thread_id. The description adds no additional parameter semantics, which is acceptable given the complete schema coverage, but it also does not provide any extra guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb and resource: 'Step into function call.' This distinguishes it from sibling tools like debug_step_over and debug_step_out, since 'step into' is the standard debugger concept for entering a function call.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool via the phrase 'step into function call,' but it does not explicitly state when to choose this over debug_step_over or debug_step_out. There are no when-not-to-use instructions or alternative routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
debug_step_outA
Step out of current function. Blocks until step completes.
| Name | Required | Description | Default |
|---|---|---|---|
| thread_id | No | Thread ID (uses stopped thread if not specified) | |
| session_id | Yes | Debug session ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral disclosure burden. It adds one useful trait—the call blocks until step completes—but says nothing about prerequisites such as active session or paused thread, error behavior, or side effects. This is adequate but minimal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no filler. Every word either defines the operation or communicates an important behavioral characteristic.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple and its parameters are fully documented, making the description plus schema mostly workable. However, with no output schema and no explicit guidance about when to choose step-out over step-over or step-into, the agent is left to infer some context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents session_id and thread_id clearly, including the 'uses stopped thread if not specified' behavior. The description adds no parameter-specific meaning beyond the schema, matching the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Step out') and resource ('current function'), which clearly identifies what the tool does. This is sufficient to distinguish it from siblings such as debug_step_over and debug_step_into.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The usage context is implied by the operation name: use it when the debugger is stopped in a function and you want to resume at the caller. However, it does not explicitly name alternatives or state when not to use this tool, so selection guidance is only implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
debug_step_overA
Step over to the next line. Blocks until step completes.
| Name | Required | Description | Default |
|---|---|---|---|
| thread_id | No | Thread ID (uses stopped thread if not specified) | |
| session_id | Yes | Debug session ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral disclosure burden. It adds the important fact that the tool 'Blocks until step completes,' signaling synchronous behavior. It doesn't discuss error cases or the need for a paused thread, but the core behavioral characteristic is usefully disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences with no redundant content. The primary action is stated first, followed by the key behavioral note. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter tool with no output schema or annotations, the description is nearly complete. It explains the action and blocking behavior. It could be slightly richer by noting when to choose this over step_into/step_out, but that gap is relatively minor given the conventional semantics and sibling names.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides full descriptions for both parameters (session_id and thread_id), so schema coverage is 100%. The description adds no additional parameter-level meaning; it receives the baseline score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Step over to the next line.' It clearly identifies what the tool does and differentiates it from siblings like debug_step_into and debug_step_out by naming the precise stepping action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool by its conventional debugging meaning, but it does not explicitly discuss when to prefer this over debug_step_into or debug_step_out, nor does it mention any exclusions or prerequisites beyond requiring a debug session.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
17 tool updates
v0.1.0- First observed
debug_attach - First observed
debug_clear_breakpoints - First observed
debug_continue - First observed
debug_disconnect - First observed
debug_evaluate - First observed
debug_get_output - First observed
debug_get_pending_events - First observed
debug_get_scopes - First observed
debug_get_stack_trace - First observed
debug_get_threads - First observed
debug_get_variables - First observed
debug_launch - First observed
debug_pause - First observed
debug_set_breakpoints - First observed
debug_step_into - First observed
debug_step_out - First observed
debug_step_over
TDQS
Scored across 17 tools
Each tool maps to a distinct debugger action: session lifecycle, breakpoint control, stepping, and inspection. The only mild ambiguity is between debug_get_pending_events (which includes output events) and debug_get_output (raw stdout/stderr), but the descriptions mostly clarify the separation.
All tools use the same debug_ prefix followed by a clear verb_noun pattern (e.g., debug_set_breakpoints, debug_step_over, debug_get_threads). The naming is highly predictable and makes the purpose of each tool easy to infer.
17 tools is slightly above the typical well-scoped range, but each tool corresponds to a necessary DAP operation. The set is not bloated; it covers a reasonable breadth of debugging functionality without obvious redundancy.
The set covers session launch/attach/disconnect, breakpoint management, execution control, stack/scope/variable inspection, evaluation, and output retrieval. Minor gaps exist, such as listing existing breakpoints or setting variable values, but core debugging workflows are adequately supported.
Maintenance
Related MCP Connectors
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
A Model Context Protocol server for Wix AI tools
The Mercado Pago MCP Server implements the Model Context Protocol to provide AI agents and LLMs with access to Mercado Pago's APIs and tools within compatible development environments. It acts as an intermediary that translates Mercado Pago resources into executable functions (tools) that AI applications can invoke to perform actions and automate flows. The server simplifies integration, enables using documentation to implement or improve code, and optimizes operations through natural language interactions without manual implementations.
Model Context Protocol server for the Apideck Unified API. Connect any MCP-compatible agent framework to 100+ accounting systems, HRIS platforms, file storage providers, and more through one integration. More information https://www.apideck.com/mcp-server
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceAn implementation of the Model Context Protocol (MCP) that enables interaction with debug adapters, allowing language models to control debuggers, set breakpoints, evaluate expressions, and navigate source code during debugging sessions.40AGPL 3.0
- AlicenseAqualityDmaintenanceEnables AI assistants to perform interactive Python debugging with breakpoints, step execution, and variable inspection using the Debug Adapter Protocol (DAP) through an MCP server interface.81MIT
- FlicenseNot gradedqualityAmaintenanceAn MCP server and VS Code extension that enables AI clients to interactively debug code using breakpoints, execution control, and state inspection. It is language-agnostic and works with any debugger that supports VS Code's launch.json configurations.-
- AlicenseNot gradedqualityAmaintenanceMCP server that lets AI coding tools control and observe a running Node.js process through the chrome devtools protocol (CDP), via a lightweight Debug Adapter Protocol (DAP) bridge.14 npm2MIT