Skip to main content

MCP server for orchestrating multi-process rr debugging sessions

Project description

rr-mcp

MCP (Model Context Protocol) server for orchestrating multi-process rr debugging sessions.

Overview

rr-mcp enables AI agents (like Claude) to debug multi-process applications using rr's record-and-replay capabilities. It provides:

  • 48 specialized debugging tools with rich descriptions and usage context
  • Dynamic MCP resources that expose live session state (rr://sessions/{id})
  • Concurrent replay sessions for debugging different processes simultaneously
  • Full reverse execution — step, continue, and finish in both directions
  • Multi-process support — debug exec'd processes (pid) or forked-without-exec children (fork_pid)
  • Conditional and temporary breakpoints, watchpoints, and catchpoints (throw/catch/syscall/signal)

New to rr debugging? See RR_DEBUGGING_GUIDE.md for concepts, workflows, and best practices.

Requirements

  • Linux (rr only runs on Linux)
  • Python 3.11+
  • rr installed and in PATH
  • An rr recording to debug

Installation

Claude Code

claude mcp add rr-mcp -- uvx rr-mcp

Other MCP clients

Any MCP client that supports stdio servers can run uvx rr-mcp (or pipx run rr-mcp).

Installing from source

For development (recommended - no reinstall needed after changes):

git clone https://github.com/jnjaeschke/rr-mcp && cd rr-mcp
uv sync  # Install dependencies

# Configure Claude Code to run from source
claude mcp add rr-mcp -- uv run --directory /absolute/path/to/rr-mcp rr-mcp

For production use:

git clone https://github.com/jnjaeschke/rr-mcp && cd rr-mcp
uv tool install .

# Configure Claude Code
claude mcp add rr-mcp -- rr-mcp

For other MCP clients, use the appropriate command (uv run ... for development or rr-mcp for production).

Usage

Once installed, the server loads automatically when you start your MCP client. Verify it's working by asking:

"List available rr traces"

Claude will use the traces_list tool to show recordings in your _RR_TRACE_DIR (defaults to ~/.local/share/rr).

MCP Resources

  • rr://guide — Debugging guide with workflows, tool selection advice, and common pitfalls
  • rr://traces — Dynamic list of available recordings
  • rr://sessions/{id} — Current session state (position, location)
  • rr://sessions/{id}/backtrace — Live call stack for a session

Tools

48 debugging tools organized into categories. Each tool includes rich descriptions with usage context, parameter documentation, return value format specifications, and workflow guidance.

Trace Management (3 tools)

Tool Description
traces_list List all available rr recordings on the system
trace_info Get metadata about a trace (creation time, binary, etc.)
trace_processes List processes in a trace with PIDs and exec info

Session Lifecycle (3 tools)

Tool Description
session_create Create a replay session for a specific process. Supports pid (exec'd processes) and fork_pid (forked-without-exec children)
session_list List all active replay sessions
session_close End a session and free its resources

Execution Control (14 tools)

Tool Description
continue / reverse_continue Run forward/backward until breakpoint, signal, or end
step / reverse_step Step by source lines, into functions
next / reverse_next Step by source lines, over functions
finish / reverse_finish Run to end/start of current function
stepi / reverse_stepi Step by machine instructions, into calls
nexti / reverse_nexti Step by machine instructions, over calls
run_to_event Jump to a specific rr event number
interrupt Stop a running program

Breakpoints & Watchpoints (7 tools)

Tool Description
breakpoint_set Set breakpoints by function, file:line, or address. Supports conditional (condition) and temporary breakpoints. Pending breakpoints are enabled automatically for unloaded code
breakpoint_delete Delete a breakpoint by number
breakpoint_list List all breakpoints with their state
breakpoint_enable / breakpoint_disable Toggle breakpoints on/off
watchpoint_set Break on memory writes, reads, or access to an expression
catch Catchpoints for C++ throw/catch, syscalls (optionally filtered by name), and signals

Inspection (14 tools)

Tool Description
backtrace Call stack with optional full mode (includes locals per frame)
print Evaluate an expression in the current context
locals Local variables in the current frame
args Function arguments across stack frames
frame_select Switch to a different stack frame
registers CPU registers (gp_only flag filters to general-purpose registers)
examine_memory Formatted memory dump (like GDB's x command)
when Current rr event and tick position
threads_list / thread_select List and switch between threads
checkpoint_create Save execution position for instant return later
checkpoint_restore Jump back to a saved checkpoint
checkpoint_delete / checkpoint_list Manage checkpoints

Signal Handling & Memory Search (2 tools)

Tool Description
handle_signal Configure how GDB handles a signal (stop, pass, print)
find_in_memory Search memory range for a byte pattern

Source & Advanced (5 tools)

Tool Description
source_list Show source code around a location with context lines
source_path Resolve a filename to its full path
source_files List all source files in the program
info GDB info subcommands (proc mappings, shared libs, symbols, types, signals)
gdb_raw Execute an arbitrary GDB command (escape hatch)

All tools include detailed descriptions visible to Claude. See tool definitions in src/rr_mcp/server.py.

Example Session

Agent: Let me list the available traces.
[calls traces_list]

Agent: I see firefox-0. Let me check what processes are in it.
[calls trace_processes with trace="firefox-0"]

Agent: The main process is PID 12345, and there's a content process
       PID 12350 that crashed with SIGSEGV. Let me debug the content
       process — it forked without exec, so I need fork_pid.
[calls session_create with trace="firefox-0", fork_pid=12350]

Agent: Let me see where we are and get the crash backtrace.
[calls backtrace with session_id="abc123"]

Agent: Frame #3 in HandleEvent dereferences a null mWidget pointer.
       Let me see the source code around that line.
[calls source_list with location="HandleEvent.cpp:142"]

Agent: I'll set a watchpoint on mWidget to find where it was set to null,
       then reverse-continue to catch the moment it happened.
[calls watchpoint_set with expression="this->mWidget", access_type="write"]
[calls reverse_continue]

Agent: The watchpoint triggered at event 84021 in Widget::Destroy().
       Let me check who called this.
[calls backtrace]

Agent: I'll save this position as a checkpoint so I can return here later,
       then continue investigating the caller.
[calls checkpoint_create]

Development

# Install dev dependencies
uv sync --all-extras

# Run tests (parallel execution with pytest-xdist)
uv run pytest -n auto

# Run tests (sequential)
uv run pytest

# Run linter
uv run ruff check src/ tests/

# Run type checker
uv run mypy src/

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

rr_mcp-0.2.0.tar.gz (71.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

rr_mcp-0.2.0-py3-none-any.whl (45.3 kB view details)

Uploaded Python 3

File details

Details for the file rr_mcp-0.2.0.tar.gz.

File metadata

  • Download URL: rr_mcp-0.2.0.tar.gz
  • Upload date:
  • Size: 71.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for rr_mcp-0.2.0.tar.gz
Algorithm Hash digest
SHA256 08b3f71beea60f409f96a4f6f2b2f91a6d67f76f279e05f4c655423d571467fe
MD5 b063c978753ddc7bdf138de73e97a395
BLAKE2b-256 a61b07fc41c98f3be74266b591a80cf8b2afd005b6150e5132816caa0a03d722

See more details on using hashes here.

Provenance

The following attestation bundles were made for rr_mcp-0.2.0.tar.gz:

Publisher: release.yml on jnjaeschke/rr-mcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rr_mcp-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: rr_mcp-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 45.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for rr_mcp-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 7310542c2e6efbd68ddf546d6925c430f372f26529ffa8e033c2d4895ab3bc37
MD5 5a418ba2994e6b1357acd30b41d8c4d7
BLAKE2b-256 101d11abcc7fbfcc41d48cd6fbfd48bf9c4f45e3e1f24aa6b6acd808951fda77

See more details on using hashes here.

Provenance

The following attestation bundles were made for rr_mcp-0.2.0-py3-none-any.whl:

Publisher: release.yml on jnjaeschke/rr-mcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page