# J-Link MCP (npm · jlink-mcp)

Debug embedded firmware on real hardware: J-Link probes, Cortex-M faults, RTT logs, GDB.

- Trust score: 82/100 (high trust)
- Change this week: +4
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-09-23

## Components

- npm · `jlink-mcp`: 82/100 (this document), [markdown](https://verifymcp.io/servers/klievan-jlink-mcp/jlink-mcp.md), [page](https://verifymcp.io/servers/klievan-jlink-mcp/jlink-mcp)

## Channel facts

- Registry: `npm`
- Package: `jlink-mcp`
- Version: `0.6.0`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-09-23.

- **Supply Chain Security**: 98/100
  - No malware found by supply-chain analysis.
  - No known CVEs affecting this package version or its production dependencies.
  - No install/post-install scripts declared.
  - 31 of 96 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 45/100
  - Source repository is publicly reachable at the declared URL.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 25 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 81/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (good).
  - Tool/resource definitions use about 2026 tokens (~44/item across 46 items; 43 tools + 3 resources), lean.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 87/100
  - Stability observed for 26 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
- **Tool Safety**: 75/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - 0 of 4 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "erase" implies "erase" and declares no destructiveHint at all, which the MCP spec reads as destructive by default.
  - An AI judge read all 44 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### How do I install the J-Link MCP server?

J-Link MCP runs locally as an npm package, launched with npx -y jlink-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add klievan-jlink-mcp -- npx -y jlink-mcp
```

### Cursor

```json
{
  "mcpServers": {
    "klievan-jlink-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "jlink-mcp"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "klievan-jlink-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "jlink-mcp"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add klievan-jlink-mcp -- npx -y jlink-mcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "klievan-jlink-mcp": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "jlink-mcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add klievan-jlink-mcp --command npx --arg -y --arg jlink-mcp
```

### Hermes

```yaml
mcp_servers:
  klievan-jlink-mcp:
    command: "npx"
    args: ["-y", "jlink-mcp"]
```

### Netclaw

```json
{
  "McpServers": {
    "klievan-jlink-mcp": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "jlink-mcp"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add klievan-jlink-mcp -t stdio -c npx -a -y jlink-mcp
```

### Other

```json
{
  "mcpServers": {
    "klievan-jlink-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "jlink-mcp"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-09-23 (score 82, +1)

No change was recorded against any check on this day. Stability & Change Management went from 83 to 87. That category is still filling its 30-day observation window: 25 days of observed history at the previous scan, 26 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-21 (score 81, +1)

No change was recorded against any check on this day. Stability & Change Management went from 77 to 80. That category is still filling its 30-day observation window: 23 days of observed history at the previous scan, 24 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-19 (score 80, +1)

No change was recorded against any check on this day. Stability & Change Management went from 70 to 73. That category is still filling its 30-day observation window: 21 days of observed history at the previous scan, 22 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-17 (score 79, +1)

No change was recorded against any check on this day. Stability & Change Management went from 63 to 67. That category is still filling its 30-day observation window: 19 days of observed history at the previous scan, 20 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-15 (score 78, +1)

No change was recorded against any check on this day. Stability & Change Management went from 57 to 60. That category is still filling its 30-day observation window: 17 days of observed history at the previous scan, 18 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-13 (score 77, +1)

No change was recorded against any check on this day. Stability & Change Management went from 50 to 53. That category is still filling its 30-day observation window: 15 days of observed history at the previous scan, 16 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-10 (score 76, +1)

No change was recorded against any check on this day. Stability & Change Management went from 40 to 43. That category is still filling its 30-day observation window: 12 days of observed history at the previous scan, 13 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-08 (score 75, +1)

No change was recorded against any check on this day. Stability & Change Management went from 33 to 37. That category is still filling its 30-day observation window: 10 days of observed history at the previous scan, 11 at this one. The score rises as the window fills, whether or not the server changes.

## MCP tools (43)

### `list_devices` (~32 tokens)

Scan for connected debug probes and show what hardware is attached. Use this first if you don't know what device is connected.

### `search_devices` (~115 tokens)

Search the device names this J-Link installation accepts, by part number, manufacturer, or core. Use this before set_device instead of guessing a part number — the name must match exactly, and a wrong one fails in a way that looks like broken hardware.

Input parameters:

- `limit` (number): Maximum results (default 40)
- `query` (string, required): Substring of a part number, manufacturer, or core. E.g. 'stm32f407', 'nrf528', 'nordic', 'cortex-m33'

### `set_device` (~110 tokens)

Set the target device name at runtime. Required before any debugging commands will work. The name must match J-Link's exactly — use search_devices to find it rather than guessing a part number. Examples: 'nRF52840_XXAA', 'nRF5340_xxAA_APP', 'STM32F407VG', 'STM32L476RG'.

Input parameters:

- `device` (string, required): Target device name (e.g., 'nRF52840_XXAA', 'STM32F407VG')

### `start_debug_session` (~57 tokens)

One-call setup: starts GDB server via SEGGER J-Link, connects RTT (if supported), waits for initial output. This is the recommended first tool to call. If no device is configured, use list_devices and set_device first.

### `snapshot` (~45 tokens)

Capture complete device state: CPU registers (compact), fault status, recent RTT output, and stack dump.

Input parameters:

- `rttLines` (number): RTT lines to include (default 30)

### `diagnose_crash` (~42 tokens)

Auto-read and decode ARM Cortex-M fault registers (CFSR, HFSR, MMFAR, BFAR), exception stack frame, and recent errors.

### `device_info` (~30 tokens)

Get connected device info via SEGGER J-Link. Returns probe type, target CPU, and compact register summary.

### `halt` (~12 tokens)

Halt the target CPU

### `resume` (~12 tokens)

Resume the target CPU

### `reset` (~144 tokens)

Reset the target device. Halting leaves the core stopped at the reset vector, which is where you want it before flashing, or to watch startup run.

Input parameters:

- `halt` (boolean): Halt at the reset vector after reset (default: false)
- `strategy` (number): J-Link reset type. Omit to let J-Link pick the right one for the device, which is what SEGGER recommends and is almost always correct. 0 = normal; 1 = core only, via VECTRESET, leaving peripherals ru…

### `step` (~12 tokens)

Step one CPU instruction

### `read_memory` (~53 tokens)

Read memory from the target. Returns clean hex dump.

Input parameters:

- `address` (string, required): Hex address (e.g., '0x20000000')
- `length` (number, required): Bytes to read (max 4096)

### `write_memory` (~45 tokens)

Write a 32-bit value to memory

Input parameters:

- `address` (string, required): Hex address
- `value` (string, required): Hex value (e.g., '0xDEADBEEF')

### `read_registers` (~23 tokens)

Read all CPU registers (compact format, FP only if non-zero).

### `read_register` (~38 tokens)

Read a specific CPU register by name

Input parameters:

- `register` (string, required): Register name (e.g., 'PC', 'SP', 'R0')

### `flash` (~50 tokens)

Flash firmware to the target device

Input parameters:

- `baseAddress` (string): Base address for .bin files (hex)
- `filePath` (string, required): Path to firmware file (.hex, .bin, .elf)

### `erase` (~13 tokens)

Erase target flash memory

### `list_peripherals` (~56 tokens)

List the target's peripherals and base addresses, from its CMSIS-SVD description. Requires an SVD file to be configured.

Input parameters:

- `filter` (string): Case-insensitive substring, e.g. 'uart' or 'timer'

### `read_peripheral` (~78 tokens)

Read every register of a peripheral from the target and decode each one's bit fields by name. This is read_memory plus the meaning of what was read.

Input parameters:

- `peripheral` (string, required): Peripheral name, e.g. 'FICR', 'UARTE0'
- `registers` (array): Only these registers (default: all readable ones)

### `decode_register` (~96 tokens)

Decode a value into named bit fields using the target's SVD. Reads from the device unless a value is supplied — useful for interpreting a number you already have.

Input parameters:

- `peripheral` (string, required): Peripheral name, e.g. 'UARTE0'
- `register` (string, required): Register name, e.g. 'ENABLE' or 'INFO.PART'
- `value` (string): Hex value to decode instead of reading the device

### `set_breakpoint` (~23 tokens)

Set a hardware breakpoint

Input parameters:

- `address` (string, required): Hex address

### `clear_breakpoints` (~27 tokens)

Clear all breakpoints, including any left armed in the debug hardware by an earlier session

### `gdb_server_start` (~19 tokens)

Start SEGGER J-Link GDB server

### `gdb_server_stop` (~22 tokens)

Stop SEGGER J-Link GDB server and disconnect RTT

### `gdb_server_status` (~23 tokens)

Get GDB server, RTT, and telnet proxy status

### `gdb_connect` (~106 tokens)

Connect a GDB client to the running GDB server. Enables source-level debugging: backtraces, variable inspection, conditional breakpoints, stepping by source line. Optionally load an ELF file for symbol info.

Input parameters:

- `elfFile` (string): Path to .elf file with debug symbols (enables source-level debugging)
- `host` (string): GDB server host (default: localhost)
- `port` (number): GDB server port (default: 2331)

### `gdb_command` (~136 tokens)

Send any GDB command and get the response. For execution commands (continue, step, next, finish, until), blocks until the target stops or times out. If the target doesn't stop, use gdb_wait to poll. Examples: 'bt' (backtrace), 'info threads', 'print myVar', 'break main', 'continue', 'next', 'step', 'finish', 'info registers', 'x/10xw 0x20000000'

Input parameters:

- `command` (string, required): GDB command to execute
- `timeout` (number): Timeout in ms for run commands (default 15000)

### `gdb_wait` (~62 tokens)

Poll for target stop after a continue/step that timed out. Returns the stop reason (breakpoint hit, signal, finished stepping, etc.) when the target halts.

Input parameters:

- `timeout` (number): How long to wait in ms (default 30000)

### `gdb_load` (~87 tokens)

Load an ELF file into GDB. By default loads symbols only (for source-level debugging: backtraces with file:line, variable names). Set flash=true to also program it onto the target.

Input parameters:

- `elfFile` (string, required): Path to .elf file with debug symbols
- `flash` (boolean): Also flash the ELF to the target (default: false, symbols only)

### `gdb_backtrace` (~48 tokens)

Get a stack backtrace. With debug symbols loaded, shows function names, file paths, and line numbers.

Input parameters:

- `full` (boolean): Include local variables in each frame (default false)

### `gdb_disconnect` (~23 tokens)

Disconnect the GDB client (does not stop the GDB server)

### `rtt_connect` (~13 tokens)

Connect to RTT

### `rtt_disconnect` (~13 tokens)

Disconnect from RTT

### `rtt_read` (~36 tokens)

Read recent RTT log lines (clean, parsed Zephyr format)

Input parameters:

- `count` (number): Lines to read (default 50)

### `rtt_search` (~79 tokens)

Search/filter RTT logs by level, module, or regex

Input parameters:

- `count` (number): Max results (default 50)
- `level` (string): Log level: 'err', 'wrn', 'inf', 'dbg'
- `module` (string): Module name (partial match)
- `pattern` (string): Regex or text pattern

### `rtt_send` (~28 tokens)

Send data to device via RTT down-channel

Input parameters:

- `data` (string, required): Data to send

### `rtt_clear` (~13 tokens)

Clear RTT buffer

### `telnet_proxy_start` (~58 tokens)

Start a TCP relay that re-serves the RTT stream on another port, so an external decoder (Trice, Pigweed, or your own) can consume it alongside this server. It relays bytes; it does not decode them.

### `telnet_proxy_stop` (~15 tokens)

Stop telnet proxy

### `telnet_proxy_status` (~16 tokens)

Get telnet proxy status

### `telnet_proxy_read` (~31 tokens)

Read raw data from telnet proxy buffer

Input parameters:

- `lines` (number): Lines (default 100)

### `probe_command` (~26 tokens)

Execute raw SEGGER J-Link commands

Input parameters:

- `commands` (array, required): Commands to execute

### `get_config` (~15 tokens)

Get current probe and server configuration

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/klievan-jlink-mcp/jlink-mcp#diagnostics

## Score history

- 2026-09-23: 82
- 2026-09-22: 81
- 2026-09-21: 81
- 2026-09-20: 80
- 2026-09-19: 80
- 2026-09-18: 79
- 2026-09-17: 79
- 2026-09-16: 78
- 2026-09-15: 78
- 2026-09-14: 77
- 2026-09-13: 77
- 2026-09-12: 76
- 2026-09-11: 76
- 2026-09-10: 76
- 2026-09-09: 75
- 2026-09-08: 75
- 2026-09-07: 74
- 2026-09-06: 74
- 2026-09-05: 73
- 2026-09-04: 69
- 2026-09-03: 69
- 2026-09-02: 69
- 2026-09-01: 69
- 2026-08-31: 69
- 2026-08-30: 69
- 2026-08-29: 69
- 2026-08-28: 69

## Common questions

### What is the J-Link MCP server?

J-Link MCP is listed in the public MCP registry as io.github.Klievan/jlink-mcp. Debug embedded firmware on real hardware: J-Link probes, Cortex-M faults, RTT logs, GDB. This page covers its npm package (jlink-mcp).

### Is the J-Link MCP server safe to use?

J-Link MCP scores 82 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 23 September 2026. It declares no install or post-install scripts. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the J-Link MCP server expose?

J-Link MCP exposes 43 tools: list_devices, search_devices, set_device, start_debug_session, snapshot, and 38 more. Their descriptions and schemas cost roughly 1,982 tokens of context every time the server is loaded.

### Is the J-Link MCP server still maintained?

J-Link MCP is still listed as active in the MCP registry. We last reached this channel on 23 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What licence is the J-Link MCP server under?

J-Link MCP declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

## Links

- npm package: https://www.npmjs.com/package/jlink-mcp
- Socket report: https://socket.dev/npm/package/jlink-mcp
- Repository: https://github.com/Klievan/jlink-mcp
- Changelog RSS feed: https://verifymcp.io/servers/klievan-jlink-mcp/jlink-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/klievan-jlink-mcp/jlink-mcp.json
- HTML version of this page: https://verifymcp.io/servers/klievan-jlink-mcp/jlink-mcp
