MCP Hub
Back to servers

jlink-mcp

Requires Setup

MCP server for SEGGER J-Link debug probes — LLM-driven embedded debugging with RTT, GDB server, and Trice/Pigweed support

npm233/wk
Stars
1
Updated
Apr 3, 2026
Validated
May 6, 2026

Quick Install

npx -y jlink-mcp

jlink-mcp logo

jlink-mcp

Give AI hands to touch silicon.
An MCP server that lets LLMs debug embedded devices through SEGGER J-Link probes.

MCP Server TypeScript J-Link ARM Cortex-M

GitHub Stars License npm npm downloads VSCode Marketplace Smithery MCP Compatible


What is this?

jlink-mcp connects AI assistants (Claude, Copilot, etc.) to your embedded hardware via SEGGER J-Link debug probes using the Model Context Protocol.

Instead of manually typing J-Link commands, your AI assistant can:

  • Read registers and memory to understand device state
  • Flash firmware and reset devices
  • Stream RTT logs and search them by level/module/regex
  • Diagnose crashes by auto-decoding ARM Cortex-M fault registers
  • Control execution — halt, step, resume, breakpoints
  • Start GDB servers for full debugging sessions

Also supports OpenOCD (ST-Link, CMSIS-DAP, FTDI) and Black Magic Probe backends.

Quick Start

Claude Desktop

Add to your Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json):

{
  "mcpServers": {
    "jlink": {
      "command": "node",
      "args": ["/path/to/jlink-mcp/out/mcp/standalone.js"],
      "env": {
        "JLINK_DEVICE": "nRF52840_XXAA"
      }
    }
  }
}

Claude Code

Add .mcp.json to your project root:

{
  "mcpServers": {
    "jlink": {
      "command": "node",
      "args": ["out/mcp/standalone.js"],
      "cwd": "/path/to/jlink-mcp",
      "env": {
        "JLINK_DEVICE": "nRF52840_XXAA"
      }
    }
  }
}

VSCode Extension

Install the extension (requires VSCode 1.99+). It auto-registers the MCP server via the native vscode.lm API. Configure the device in settings:

jlinkMcp.jlink.device = "nRF52840_XXAA"

Copilot Chat and Claude in VSCode will automatically discover all 31 tools.

From Source

git clone https://github.com/Klievan/jlink-mcp.git
cd jlink-mcp
npm install
npm run compile
JLINK_DEVICE=nRF52840_XXAA node out/mcp/standalone.js

Tools (31)

Workflow Tools (start here)

ToolDescription
start_debug_sessionOne-call setup. Starts GDB server + connects RTT + returns boot log.
snapshotCaptures full device state: registers, fault status, stack dump, RTT output.
diagnose_crashAuto-reads and decodes ARM Cortex-M fault registers (CFSR, HFSR, MMFAR, BFAR) with exception stack frame.

Device Control

ToolDescription
device_infoProbe type, target CPU, compact register summary
haltHalt CPU
resumeResume CPU
resetReset device (optionally halt after reset)
stepSingle-step one instruction

Memory & Registers

ToolDescription
read_memoryRead memory at address (clean hex dump output)
write_memoryWrite 32-bit value to address
read_registersAll CPU registers in compact format
read_registerRead specific register (PC, SP, R0-R12, etc.)

Flash

ToolDescription
flashFlash .hex/.bin/.elf firmware to device
eraseErase entire flash

Breakpoints

ToolDescription
set_breakpointSet hardware breakpoint at address
clear_breakpointsClear all breakpoints

GDB Server

ToolDescription
gdb_server_startStart probe's GDB server
gdb_server_stopStop GDB server + disconnect RTT
gdb_server_statusGDB server, RTT, and proxy status

RTT (Real-Time Transfer)

ToolDescription
rtt_connectConnect to RTT telnet port
rtt_disconnectDisconnect from RTT
rtt_readRead recent log lines (ANSI stripped, Zephyr format parsed)
rtt_searchFilter logs by level (err/wrn/inf/dbg), module, or regex
rtt_sendSend data to device via RTT down-channel
rtt_clearClear RTT buffer

Telnet Proxy (Trice / Pigweed)

ToolDescription
telnet_proxy_startStart TCP proxy that tees RTT for external detokenizers
telnet_proxy_stopStop proxy
telnet_proxy_statusProxy connection status
telnet_proxy_readRead raw proxy buffer

Advanced

ToolDescription
probe_commandExecute raw probe commands
get_configCurrent probe and server configuration

Multi-Probe Support

jlink-mcp supports multiple debug probe backends through a common ProbeBackend abstraction:

BackendProbe HardwareStatusRTT Support
J-LinkSEGGER J-Link, J-Link OB, J-Link EDUProductionYes
OpenOCDST-Link, CMSIS-DAP, FTDI, J-Link (via OpenOCD)BetaNo
Black Magic ProbeBMP (built-in GDB server on serial)BetaNo
probe-rsAll probe-rs supported probesPlannedPlanned

Selecting a Backend

# J-Link (default)
PROBE_TYPE=jlink JLINK_DEVICE=nRF52840_XXAA node out/mcp/standalone.js

# OpenOCD with ST-Link
PROBE_TYPE=openocd \
  OPENOCD_INTERFACE=interface/stlink.cfg \
  OPENOCD_TARGET=target/stm32f4x.cfg \
  node out/mcp/standalone.js

# Black Magic Probe
PROBE_TYPE=blackmagic \
  BMP_SERIAL_PORT=/dev/ttyACM0 \
  node out/mcp/standalone.js

Architecture

┌─────────────────────────────────────────────────────┐
│                    MCP Client                        │
│          (Claude, Copilot, any MCP client)           │
└──────────────────────┬──────────────────────────────┘
                       │ JSON-RPC over stdio
┌──────────────────────▼──────────────────────────────┐
│                  jlink-mcp                           │
│                                                      │
│  ┌──────────┐  ┌──────────┐  ┌───────────────────┐  │
│  │ 31 Tools │  │4 Resources│  │    4 Prompts      │  │
│  └────┬─────┘  └────┬─────┘  └───────┬───────────┘  │
│       │              │                │              │
│  ┌────▼──────────────▼────────────────▼───────────┐  │
│  │              ProbeBackend                       │  │
│  │  ┌─────────┐ ┌─────────┐ ┌──────────────────┐  │  │
│  │  │ J-Link  │ │ OpenOCD │ │ Black Magic Probe│  │  │
│  │  └────┬────┘ └────┬────┘ └────────┬─────────┘  │  │
│  └───────┼───────────┼───────────────┼─────────────┘  │
│          │           │               │              │
│  ┌───────▼───┐ ┌─────▼────┐ ┌───────▼──────────┐  │
│  │ RTTClient │ │TelnetProxy│ │  ProcessManager  │  │
│  └───────────┘ └──────────┘ └──────────────────┘  │
└─────────────────────────────────────────────────────┘
                       │
          ┌────────────▼────────────┐
          │    Debug Probe (USB)    │
          │  → Target MCU (SWD/JTAG)│
          └─────────────────────────┘

Source Layout

src/
├── probe/
│   ├── backend.ts      # ProbeBackend abstract class + shared utilities
│   ├── jlink.ts        # SEGGER J-Link implementation
│   ├── openocd.ts      # OpenOCD implementation
│   ├── blackmagic.ts   # Black Magic Probe implementation
│   └── factory.ts      # Probe creation from config
├── mcp/
│   ├── server.ts       # MCP server (31 tools, 4 resources, 4 prompts)
│   └── standalone.ts   # Standalone entry (stdio transport)
├── rtt/
│   └── rtt-client.ts   # RTT client with ANSI stripping + Zephyr log parsing
├── telnet/
│   └── telnet-proxy.ts # TCP proxy for Trice/Pigweed detokenizer
├── utils/
│   ├── config.ts       # VSCode settings / env var config
│   ├── logger.ts       # Logging
│   └── process-manager.ts # Child process lifecycle
└── extension.ts        # VSCode extension + MCP provider registration

Design Decisions (LLM-Optimized)

This server was built by having an AI use it against real hardware, then fixing every friction point:

  • Output parsing strips 40+ lines of J-Link connection banners. Only data comes back.
  • Registers are compact: Core: PC=0xBF54 SP=0x20062880 ... instead of 65 raw lines.
  • FP registers only shown if non-zero (they're usually all zeros).
  • RTT output has ANSI escape codes stripped and Zephyr log format parsed into structured fields.
  • Composite tools (start_debug_session, snapshot, diagnose_crash) replace multi-step workflows with single calls.
  • Fault decoding is automatic — reads CFSR/HFSR/MMFAR/BFAR and explains each bit.
  • rtt_search lets you find errors without reading the entire log.

Environment Variables

J-Link

VariableDefaultDescription
PROBE_TYPEjlinkProbe backend: jlink, openocd, blackmagic
JLINK_DEVICEUnspecifiedTarget device (e.g., nRF52840_XXAA, STM32F407VG)
JLINK_INSTALL_DIRAuto-detectPath to SEGGER J-Link installation
JLINK_INTERFACESWDDebug interface: SWD or JTAG
JLINK_SPEED4000Connection speed in kHz
JLINK_SERIALJ-Link serial number (multi-probe)
JLINK_GDB_PORT2331GDB server port
JLINK_RTT_PORT19021RTT telnet port

OpenOCD

VariableDefaultDescription
OPENOCD_BINARYopenocdPath to openocd binary
OPENOCD_INTERFACEinterface/stlink.cfgInterface config file
OPENOCD_TARGETtarget/stm32f4x.cfgTarget config file
OPENOCD_GDB_PORT3333GDB server port
OPENOCD_TELNET_PORT4444Telnet command port

Black Magic Probe

VariableDefaultDescription
BMP_GDB_PATHarm-none-eabi-gdbPath to GDB binary
BMP_SERIAL_PORT/dev/ttyACM0BMP serial port
BMP_TARGET_INDEX1Target index after scan

Prerequisites

  • SEGGER J-Link Software installed (JLinkExe, JLinkGDBServer)
  • A J-Link debug probe connected to an ARM Cortex-M target
  • Node.js 18+

For other backends: OpenOCD or arm-none-eabi-gdb as appropriate.

Contributing

Adding a new probe backend:

  1. Create src/probe/yourprobe.ts implementing ProbeBackend
  2. Add a case to src/probe/factory.ts
  3. That's it — all 31 MCP tools work automatically

License

MIT - see LICENSE


Built by The Sprk Factory

Reviews

No reviews yet

Sign in to write a review