pernosco-mcp
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., "@pernosco-mcpFind all calls to LoadURI and show the URI argument"
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.
pernosco-mcp
MCP server that connects AI coding agents (Claude Code, etc.) to Pernosco debugging sessions. Query execution traces, inspect variables, navigate call stacks, and trace value histories — all through natural language.
How It Works
Claude Code <--stdio--> pernosco-mcp daemon <--WebSocket--> Firefox extension <--window.client--> PernoscoA background daemon coordinates between any number of Claude Code instances and Pernosco browser tabs. The Firefox extension bridges into Pernosco's internal window.client API.
Related MCP server: gdb and rr Debugging
Installation
1. Install the npm package
npm install -g pernosco-mcpThis installs the MCP server and registers the native messaging host for Firefox.
2. Install the Firefox extension
Install from Firefox Add-ons.
3. Add to Claude Code
claude mcp add pernosco -- pernosco-mcpUsage
Open a Pernosco trace in Firefox
In Claude Code: "Connect to my Pernosco trace at https://pernos.co/debug/abc123/index.html"
Debug:
"Find all calls to nsDocShell::LoadURI and show me the URI argument"
"Go to result 3 and show me the call stack"
"What was written to this address throughout the trace?"
Tools
Tool | Description |
| Connect to a trace by URL or trace ID |
| List open Pernosco tabs |
| Current position (event, source, line) |
| Disconnect from session |
| Find all calls to a function, optionally print expressions at each |
| All hits of a source line |
| Call stack at current position |
| Evaluate a C++ expression |
| Navigate to a query result or focus position |
| Search for symbols, functions, types |
| Write history for a memory address |
| Trace writes to a C++ variable (evaluate + watchpoint) |
| stdout/stderr output with event IDs |
| Read source code from the trace |
| Which lines executed, with counts |
| Step forward to next hit of current line |
| Step backward to previous hit |
| Process/thread hierarchy |
| Active threads at current moment |
| Pernosco notebook annotations |
Development
Building from source
git clone https://github.com/jnjaeschke/pernosco-mcp.git
cd pernosco-mcp
npm install
npm run build:allLoad the extension manually via about:debugging > "This Firefox" > "Load Temporary Add-on" > select extension/manifest.json.
Scripts
npm run dev # Watch mode (TypeScript)
npm test # Run tests
npm run build # Build server
npm run build:extension # Package extension .xpi
npm run build:all # Build everythingArchitecture
Daemon (
src/daemon.ts) — WebSocket server on random localhost port. Spawned on-demand, exits after 10 min idle.Shim (
src/shim.ts) — stdio-to-WebSocket bridge, one per Claude Code instance.Extension (
extension/) — Content script injected into pernos.co pages, querieswindow.clientAPI.PML (
src/pml.ts) — Converts Pernosco's markup to text for LLM consumption.
License
MIT
Available Tools
20 toolscurrent_tasksB
Get active processes and threads at the current focus moment
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full burden of behavioral disclosure. It does not mention side effects, permissions, or whether the tool is read-only. The description adds minimal context beyond the basic purpose.
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 extraneous information. Every word contributes to the purpose, making it highly concise and efficient.
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 the tool's simplicity (zero parameters, no output schema), the description is functional but incomplete. It fails to explain what 'current focus moment' means, the format of the returned data, or any behavioral nuances. It meets minimal viability but has 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?
The input schema has no properties, so schema coverage is trivially 100%. The description adds the concept of 'current focus moment', which provides context that the returned tasks are context-dependent. This adds some value beyond the empty schema, meeting 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?
The description clearly states the tool returns active processes and threads at the current focus moment. It uses a specific verb ('Get') and resource ('active processes and threads'), and the scope is well-defined. Among sibling tools like 'step_to_next_hit' or 'watch_variable', this purpose is distinct.
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 provided on when to use this tool versus alternatives. There is no mention of prerequisites, context requirements, or scenarios where this tool is appropriate. The description only states what it does, not when to invoke it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dynamic_annotationsA
Show which lines of the current source file executed at the current focus, with execution counts for loops. Essential for understanding which code paths and branches ran.
| Name | Required | Description | Default |
|---|---|---|---|
| source_url | No | Source URL to annotate (defaults to current focus source from session_status) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavioral traits. It states the output (executed lines with counts) but does not mention whether the tool is read-only, performance implications, or any state changes.
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 informative sentences with no wasted words. The first sentence states the core function and the second provides the use case. Perfectly concise.
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 one optional parameter and no output schema, the description adequately covers functionality. It could be more explicit about what exactly is shown (all lines or only hit lines) but is sufficient for most use cases.
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% and the schema already describes the parameter well. The description adds minimal new meaning beyond saying 'current source file', which is already implied by the schema's default behavior.
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 tool shows executed lines of the current source file with execution counts, distinguishing it from siblings like 'find_executions' by focusing on annotation of source code rather than just locating executions.
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 explicitly states the tool is 'essential for understanding which code paths and branches ran', providing clear context for when to use it, though it does not address when not to use it or compare to alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
evaluateB
Evaluate a C++ expression at the current focus position
| Name | Required | Description | Default |
|---|---|---|---|
| expression | Yes | C++ expression to evaluate, e.g. "this->mCount" or "aURI->mSpec" |
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 doesn't state whether evaluation is read-only, requires a running process, or has side effects. The minimal description is insufficient for a potentially impactful action.
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?
Single sentence with 10 words, no filler. Efficient but could benefit from additional context without becoming verbose.
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 tool with one parameter and no output schema, the description is minimally complete. It conveys the core action but lacks usage context and behavioral details, which are needed for full completeness.
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 description adds no extra meaning beyond the schema's parameter description. The example helps but is baseline; score 3 as per guidelines.
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 verb 'Evaluate' and the resource 'a C++ expression' with context 'at the current focus position'. It distinguishes from siblings like 'watch_variable' by focusing on one-time evaluation rather than continuous watching.
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 explicit guidance on when to use this tool versus alternatives like 'watch_variable' or 'stack'. The description does not mention prerequisites or exclusions, leaving the agent without context for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_breakpoint_hitsB
Find all hits of a specific source line. Use when you have a file:line from a stack trace or crash report.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | Source file path or URL as it appears in Pernosco, e.g. "nsDocShell.cpp" | |
| line | Yes | Line number (1-based) | |
| print_exprs | No | Semicolon-delimited C++ expressions to evaluate at each hit | |
| limit | No | Max results per direction (default 50) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It only states the basic action without disclosing any behavioral traits like read-only, destructive potential, or output format. Minimal disclosure beyond the verb and resource.
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: first states purpose, second provides usage hint. No redundant information. Highly concise and efficient.
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?
No output schema and no annotations. Description fails to explain what 'hits' means, result ordering, or return format. Incomplete for a tool with 4 parameters and no structured output documentation.
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% with descriptions for all parameters. The description adds no additional meaning to parameters like print_exprs or limit. Baseline 3 is appropriate as schema does the heavy lifting.
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?
Clearly states it finds all hits of a specific source line and gives a concrete use case with stack traces. Does not explicitly differentiate from sibling tools like step_to_next_hit or search, but the purpose is unambiguous.
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?
Explicitly advises when to use: 'Use when you have a file:line from a stack trace or crash report.' No exclusions or alternatives provided, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_executionsA
Find all calls to a function across the trace. Optionally evaluate C++ expressions at each call site using print_exprs (semicolon-delimited).
| Name | Required | Description | Default |
|---|---|---|---|
| symbol | Yes | Fully qualified C++ function name, e.g. "nsDocShell::LoadURI" | |
| print_exprs | No | Semicolon-delimited C++ expressions to evaluate at each call, e.g. "this->mURI.mRawPtr->mSpec; aLoadState->URI()->mSpec" | |
| limit | No | Max results per direction (default 50) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full transparency burden. It mentions the tool finds calls and evaluates expressions, but does not disclose whether it is read-only, side effects, or any constraints like scope or state requirements. It provides basic behavior but lacks depth.
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 extremely concise: two sentences that front-load the core purpose and logically introduce optional functionality. Every word is necessary, and no extraneous information is present.
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 the complexity of a debugging tool and the absence of an output schema, the description adequately covers the primary functionality. However, it could be improved by hinting at the return format (e.g., call site locations) to fully compensate for the missing output schema.
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 rephrases parameter details (e.g., print_exprs as semicolon-delimited) but adds no significant new information beyond the schema. It does not clarify defaults or usage nuances beyond what is already in 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 tool's purpose: finding all calls to a function across a trace. It uses a specific verb ('Find') and resource ('calls to a function'), uniquely distinguishing it from siblings like 'find_breakpoint_hits' or 'evaluate'.
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 usage when needing to locate function calls in a trace, optionally evaluating expressions. However, it does not explicitly state when to use this tool over alternatives or provide exclusion criteria, missing an opportunity to clarify its specific role among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gotoA
Navigate to a specific execution point by result index (from a previous query) or raw focus object
| Name | Required | Description | Default |
|---|---|---|---|
| index | No | Result index from the last query (1-based) | |
| focus | No | Raw focus object with moment.event and moment.instr fields |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full burden. It describes the action as 'navigate', implying a change in execution state, but does not disclose side effects, permissions, or error conditions like invalid index. While the core behavior is clear, more transparency would be beneficial.
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 sentence that efficiently captures the tool's purpose and usage. Every word is necessary, and no irrelevant information is included.
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 no output schema, no annotations, and two well-described parameters, the description is largely complete for a navigation tool. It could mention what the user experiences after navigation (e.g., focus changes), but overall it provides sufficient 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% with descriptions that exactly match the tool description. The description adds no additional meaning beyond what the schema already provides, 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 clearly states it navigates to an execution point using either a result index or a raw focus object. The verb 'navigate' and resource 'execution point' are specific, and it differentiates from siblings like stack or step_to_next_hit which involve navigation but by different means.
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 explains when to use the index parameter (from a previous query) versus the focus parameter (raw object), providing clear usage context. However, it does not explicitly state when not to use this tool or mention alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
notebook_readA
Read Pernosco notebook annotations saved in this session
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description should fully disclose behavior. It implies a read operation but does not explicitly state non-destructiveness or side effects. Missing details like what happens with no annotations or format of output.
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, clear sentence with no extraneous words. It is appropriately sized.
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 no output schema, the description should explain return values. It does not describe what the annotations look like or if it returns text, structure, etc. However, the tool is simple with no parameters, making the description passable.
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?
No parameters exist, so baseline 4 applies. The description adds no parameter info, but none is needed.
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 tool reads Pernosco notebook annotations, using a specific verb 'Read' and a specific resource. It distinguishes itself from sibling tools like source_read or dynamic_annotations.
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 on when to use this tool versus alternatives. The description does not mention prerequisites or context for use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
searchB
Search for symbols, functions, or types by name
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search term, e.g. "LoadURI" or "nsDocShell" | |
| max_results | No | Maximum number of results (default 20) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It reveals that the search is by name and covers symbols, functions, and types, but lacks details on case sensitivity, scope, search algorithm, or result behavior. This is minimal beyond purpose.
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 sentence with no wasted words. While succinct, it is appropriately concise 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?
Given no output schema, the description is incomplete. It does not describe return values, error handling, or search scope (e.g., global vs. local). Essential context for a search tool is missing.
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 baseline is 3. The description adds no semantic meaning beyond the schema; it does not explain the query format or max_results behavior.
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 'Search for symbols, functions, or types by name' clearly states the verb (search), resource types (symbols, functions, types), and method (by name). It distinguishes the tool from siblings, none of which are search tools.
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 usage guidelines are provided. The description does not specify when to use this tool vs alternatives, nor does it mention any context or prerequisites such as required session state.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_connectA
Connect to a Pernosco trace by URL or trace ID. Opens the tab in Firefox if not already open.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Pernosco trace URL (https://pernos.co/debug/{TRACE_ID}/index.html) or bare trace ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, description carries burden. Discloses opening Firefox tab, but lacks info on connection states, error handling, or side effects like creating multiple tabs.
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?
Single sentence, to the point. Could be slightly more concise, but no unnecessary words.
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 simple tool with one parameter and no output schema, description covers core purpose and side effect. Missing connection state or error info, but adequate for typical use.
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 already covers URL/trace ID. Tool description repeats this, adding no new semantic value beyond 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?
Clearly states verb 'Connect' and resource 'Pernosco trace', specifying input as URL or trace ID. Also mentions side effect of opening Firefox tab. Distinguishes from sibling like session_disconnect.
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 on when to connect versus using other session tools (e.g., session_list, session_status). Does not mention prerequisites or context for connecting.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_disconnectB
Disconnect from the current Pernosco session
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided; description only says 'Disconnect' without explaining what happens (e.g., whether state is saved or discarded). Minimal behavioral disclosure.
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?
Single sentence, no wasted words. Concise but not overly terse.
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?
Tool is simple with no parameters. Description covers basic purpose but lacks behavioral details. Adequate for a simple action but could be more informative.
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?
No parameters, so schema coverage is effectively 100%. Description does not need to add parameter info; baseline score of 4 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?
Clearly states the verb 'Disconnect' and the resource 'current Pernosco session'. Distinguishes from sibling tools like session_connect and session_list.
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 on when to use this tool versus alternatives. Does not mention prerequisites or side effects.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_listA
List available Pernosco traces (open Firefox tabs with pernos.co loaded)
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, and the description does not disclose behavioral traits such as side effects, required permissions, or return behavior. For a listing tool, it should at least hint at what is returned.
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 sentence, front-loaded with the verb and resource, containing no unnecessary words. It 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?
The tool has no parameters and no output schema. The description states what it does but does not specify what exactly is listed (e.g., session names or URLs). Some output behavior context is missing.
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 tool has no parameters, and the schema (empty) covers 100% of parameter definitions. The description does not add parameter info, but none is needed. Following the 0-param baseline of 4.
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 tool lists available Pernosco traces, specifically open Firefox tabs with pernos.co loaded. It distinguishes from sibling tools like session_connect (which connects) and session_status (which shows status).
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 should be used before connecting to a session, but it does not explicitly state when to use vs alternatives or any exclusions. Sibling tools exist, but no guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_statusA
Get current focus position (event number, source file, line) for the connected session
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must fully disclose behaviors. It only states what is returned, but omits whether it is a read-only operation, requires an active connection, or has any 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?
Single sentence, straightforward, no redundancy. Front-loaded with the action and resource.
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 no output schema, the description specifies the return components (event number, source file, line). It is sufficient for a simple status check, though it could note that it applies to the connected session explicitly.
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?
No parameters exist, and the schema coverage is trivially 100%. Baseline for 0 parameters is 4. The description adds no extra parameter meaning, but none is needed.
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 tool retrieves current focus position, specifying three concrete components (event number, source file, line). It is distinct from sibling tools like session_list (list sessions) or goto (navigate).
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 on when to use this tool versus alternatives (e.g., before stepping, after connecting). No mention of context or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
source_readA
Read source code lines from the current trace. Use after stack or session_status to see code around the current position.
| Name | Required | Description | Default |
|---|---|---|---|
| source_url | No | Source URL as it appears in Pernosco (from stack or session_status output). If omitted, uses current focus source. | |
| start_line | No | First line to read (1-based, default: 1) | |
| end_line | No | Last line to read (inclusive). Defaults to start_line + 50. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It indicates a read operation without side effects, but lacks explicit mention of non-destructiveness or other behavioral traits (e.g., performance, error states).
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 concise with two sentences, no unnecessary words. It front-loads the core purpose and follows with usage guidance.
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 read tool with 0 required parameters and no output schema, the description fully covers what is needed: what it does and when to use it. No additional information is necessary.
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% with descriptive parameter descriptions. The description adds value by hinting at the use of defaults to see code around current position, but does not significantly enhance parameter understanding 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 'Read source code lines from the current trace', which is a specific verb and resource. It distinguishes from sibling tools like stack and session_status by specifying the action of reading code lines.
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 explicitly advises to 'Use after stack or session_status to see code around the current position', providing clear context for when to invoke this tool. It does not mention when not to use, but the guidance is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stackA
Get the call stack at the current focus position
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden for behavioral disclosure. It only states the operation without revealing traits like side effects, thread context, or safety. A read operation is implied but not explicitly stated.
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, well-front-loaded sentence that conveys the purpose without extraneous words. It is maximally concise.
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 the simple nature (no params, no output schema), the description is minimally adequate. However, it lacks details on return format or integration with debugging flow, which could be inferred but not explicit.
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 tool has no parameters, so schema coverage is full. The description does not add parameter semantics, but it is unnecessary. Baseline 4 is appropriate for zero 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?
The description clearly states the action ('Get') and the resource ('the call stack'), with a specific scope ('at the current focus position'). It uniquely identifies the tool among siblings like 'current_tasks' or 'source_read'.
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 provided on when to use this tool versus alternatives. There is no mention of context, prerequisites, or exclusions. The description is purely declarative without usage recommendations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stdout_stderrA
Get stdout/stderr output around the current focus position. Output is scoped to the current process — use goto to navigate to a content process first if needed. Results include event IDs for navigation.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results per direction (default 200) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description discloses key behaviors: scoping to current process, inclusion of event IDs, and default limit. It does not explicitly state that it is non-destructive, but that is implied.
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 concise, front-loaded sentences with no fluff. Every sentence adds value.
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 retrieval tool with one parameter and no output schema, the description is complete: it explains the scope, navigation dependency, and result features (event IDs).
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 does not add meaning beyond the schema for the 'limit' parameter, which is adequately described.
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 it gets stdout/stderr output around the current focus position, scoped to the current process. This distinguishes it from sibling tools like stack, breakpoint hits, or watchpoints.
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 explicitly advises to use 'goto' to navigate to a content process first if needed, providing clear guidance on when to use an alternative tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
step_to_next_hitA
Navigate forward to the next execution of the current source line (or a specified line). Useful for stepping through loop iterations or repeated calls.
| Name | Required | Description | Default |
|---|---|---|---|
| file | No | Source file (defaults to current focus source) | |
| line | No | Line number (defaults to current focus line) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, and description lacks details on side effects, error states, or behavior when no next hit exists. Only states basic navigation behavior.
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 concise sentences: first states action, second provides use case. No unnecessary text.
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?
Adequate for a simple navigation tool, but lacks details on breakpoint interaction or automatic stopping behavior. Could be more 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?
Schema coverage is 100%, so the description adds no extra meaning beyond the schema. 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?
Clearly states the action ('Navigate forward') and the resource ('next execution of the current source line'), and distinguishes from sibling 'step_to_prev_hit' by specifying direction.
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 a use case ('stepping through loop iterations or repeated calls'), but does not explicitly state when not to use it or mention alternatives like 'step_to_prev_hit'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
step_to_prev_hitB
Navigate backward to the previous execution of the current source line (or a specified line). Useful for reverse debugging.
| Name | Required | Description | Default |
|---|---|---|---|
| file | No | Source file (defaults to current focus source) | |
| line | No | Line number (defaults to current focus line) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It only states 'navigate backward', but fails to disclose behavioral effects such as whether it modifies execution state, requires an active debugging session, or affects other views. This is insufficient for a reverse debugging tool.
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 very concise with two sentences, front-loading the primary action. Every word serves a purpose, with no 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?
Given the complexity of reverse debugging and the lack of annotations or output schema, the description is too minimal. It does not explain prerequisites, side effects, or how the tool fits into the debugging workflow among many siblings.
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% and the schema already describes defaults for file and line. The description adds minimal value by repeating 'or a specified line', which is already implied by the parameters. 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 clearly states the action (navigate backward) and the target (previous execution of a specified or current line). It explicitly indicates reverse debugging, distinguishing it from the forward sibling 'step_to_next_hit'.
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 includes 'Useful for reverse debugging' as a usage hint, but does not explicitly state when to use this tool versus alternatives like 'step_to_next_hit' or 'goto', nor does it provide exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
task_treeA
Get the complete process/thread hierarchy for the trace
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must disclose behavioral traits. It only states 'complete' hierarchy, but does not mention performance, caching, prerequisites (e.g., trace loaded), or return format details.
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?
A single, short sentence that conveys the essence with zero wasted words. Front-loaded and efficient.
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 tool with no parameters and no output schema, the description is minimally adequate. However, it lacks context on how this relates to sibling tools like current_tasks or stack, reducing completeness.
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?
No parameters exist, so schema coverage is 100%. Baseline 4 applies; description adds no extra param info, but none is needed.
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 verb 'get' and the resource 'complete process/thread hierarchy', which precisely defines the tool's purpose and distinguishes it from siblings like current_tasks.
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 on when to use this tool versus alternatives (e.g., current_tasks, stack). The description is silent on context or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
watchpoint_historyA
Get complete write history for a memory address across the trace (reads all writes before and after current focus)
| Name | Required | Description | Default |
|---|---|---|---|
| address | Yes | Memory address in hex, e.g. "0x7fff1234abcd" | |
| type | Yes | C++ type of the value, e.g. "uint64_t", "int32_t", "bool" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It discloses that the tool reads all writes before and after the current focus, implying it is a read-only operation with broad trace coverage. However, it does not mention any potential performance impact or prerequisites like an active session.
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 sentence that is front-loaded with the main action and scope. Every word serves a purpose with no redundancy or fluff.
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 the tool's simplicity with only two required params and no output schema, the description adequately covers purpose and behavior. It hints at the return value ('complete write history') but could be more explicit about the output format or limitations. Still, it is sufficiently complete for its complexity.
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 for parameters is 100%, so the description adds no additional meaning beyond what the input schema already provides. The baseline score of 3 is appropriate as the description does not elaborate on parameter usage 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 verb 'get' and the resource 'complete write history for a memory address across the trace', specifying scope beyond current focus. It distinguishes from sibling 'watch_variable' which likely monitors live changes rather than historical writes.
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 usage for historical analysis of memory writes, but provides no explicit guidance on when to use this tool versus alternatives like 'watch_variable' or 'stack'. No when-not-to-use or condition information is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
watch_variableA
Get the complete write history of a C++ variable. Evaluates the expression to find its memory address, then traces all writes. Simpler than manually using evaluate + watchpoint_history.
| Name | Required | Description | Default |
|---|---|---|---|
| expression | Yes | C++ expression for the variable, e.g. "this->mURI" or "aLoadState" | |
| type | Yes | C++ type of the value, e.g. "uint64_t", "int32_t", "nsCOMPtr<nsIURI>" | |
| limit | No | Max results per direction (default 100) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It explains the process: 'Evaluates the expression to find its memory address, then traces all writes.' This is adequate but lacks details on limitations, error handling, or scope constraints.
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 sentences, front-loaded with the core action, and every word adds value. No redundancy or filler, making it optimally concise.
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 no output schema, the description could elaborate on return format. It covers the process and a usage hint but leaves agents guessing about the output structure. Adequate but not exceptional.
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 examples for expression and type but repeats schema info. It does not significantly enhance parameter meaning or constraints.
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 verb 'Get the complete write history' and the resource 'a C++ variable'. It distinguishes from siblings by noting it's 'Simpler than manually using evaluate + watchpoint_history', making the purpose unambiguous.
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 provides a clear alternative ('evaluate + watchpoint_history') and implies when to use this tool for simplicity. However, it lacks explicit when-not-to-use instructions or deeper context about prerequisites.
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.
20 tool updates
v0.2.3- First observed
current_tasks - First observed
dynamic_annotations - First observed
evaluate - First observed
find_breakpoint_hits - First observed
find_executions - First observed
goto - First observed
notebook_read - First observed
search - First observed
session_connect - First observed
session_disconnect - First observed
session_list - First observed
session_status - First observed
source_read - First observed
stack - First observed
stdout_stderr - First observed
step_to_next_hit - First observed
step_to_prev_hit - First observed
task_tree - First observed
watch_variable - First observed
watchpoint_history
TDQS
Scored across 20 tools
Each tool has a clearly distinct purpose, covering navigation, state querying, session management, and annotations. Overlaps are minimal (e.g., watchpoint_history vs. watch_variable are differentiated by input type), and descriptions clearly delineate boundaries.
All tool names use snake_case and follow a consistent verb_noun or noun pattern (e.g., find_breakpoint_hits, session_status, source_read). There is no mixing of conventions, making the naming predictable and easy to reason about.
With 20 tools, the count is slightly above the typical well-scoped range (3-15), but each tool addresses a specific debugging need in a complex domain. The surface is neither bloated nor insufficient, earning a 4.
The tool set covers the core reverse debugging workflow: session management, navigation, source inspection, stack traces, variable/watchpoint history, expression evaluation, and process/thread hierarchy. Minor gaps (e.g., no explicit register inspection) exist, but the overall coverage is strong.
Maintenance
Related MCP Connectors
Persistent memory and cross-session learning for AI coding assistants (hosted remote MCP).
Agent Replay Debugger MCP — record every agent step + deterministic replay. Step-debugger for
MCP server for building and testing AI agents with multi-model experimentation and insights.
Query application logs, traces, and metrics from your AI coding assistant via Foam's MCP server.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceAn MCP server that provides programmatic access to the GNU Debugger (GDB), enabling AI models to interact with GDB through natural language for debugging tasks.9Apache 2.0
- AlicenseAqualityCmaintenanceMCP server that exposes GDB debugging as tools. An AI assistant can set breakpoints, run programs, step through code, inspect variables and memory, and examine registers — all via structured tool calls. Reverse debugging with rr is also supported.343MIT
- AlicenseAqualityDmaintenanceAn MCP server that enables AI assistants to control GDB debugging sessions, including breakpoint management, thread analysis, and variable inspection, using the GDB/MI protocol.221MIT
- AlicenseNot gradedqualityCmaintenanceMCP server for AI-assisted Python debugging using debugpy and Debug Adapter Protocol, enabling AI agents to run tests, set breakpoints, and inspect variables via natural language.8MIT