{ "name": "jlink-mcp", "displayName": "J-Link MCP \u2014 Embedded Debugging for AI Agents", "description": "MCP server for SEGGER J-Link debug probes \u2014 LLM-driven embedded debugging with RTT, GDB server, and Trice/Pigweed support", "repository": { "type": "git", "url": "https://github.com/Klievan/jlink-mcp" }, "homepage": "https://github.com/Klievan/jlink-mcp#readme", "bugs": { "url": "https://github.com/Klievan/jlink-mcp/issues" }, "version": "0.7.0", "publisher": "Klievan", "icon": "logo.png", "license": "MIT", "engines": { "vscode": "^1.110.0" }, "categories": [ "Debuggers", "AI", "Other" ], "keywords": [ "jlink", "j-link", "segger", "embedded", "firmware", "debugger", "gdb", "rtt", "swd", "jtag", "cortex-m", "arm", "microcontroller", "mcu", "nrf52", "nordic", "stm32", "zephyr", "svd", "cmsis", "mcp", "mcp-server", "model-context-protocol", "copilot", "ai", "llm", "openocd", "blackmagic", "trice", "pigweed" ], "bin": { "jlink-mcp": "./out/mcp/standalone.js" }, "activationEvents": [ "onStartupFinished" ], "main": "./out/extension.js", "contributes": { "commands": [ { "command": "jlinkMcp.showStatus", "title": "J-Link MCP: Show Status", "category": "J-Link" }, { "command": "jlinkMcp.startGdbServer", "title": "J-Link MCP: Start GDB Server", "category": "J-Link" }, { "command": "jlinkMcp.stopGdbServer", "title": "J-Link MCP: Stop GDB Server", "category": "J-Link" }, { "command": "jlinkMcp.connectRtt", "title": "J-Link MCP: Connect RTT", "category": "J-Link" }, { "command": "jlinkMcp.disconnectRtt", "title": "J-Link MCP: Disconnect RTT", "category": "J-Link" }, { "command": "jlinkMcp.startTelnetProxy", "title": "J-Link MCP: Start Telnet Proxy", "category": "J-Link" }, { "command": "jlinkMcp.stopTelnetProxy", "title": "J-Link MCP: Stop Telnet Proxy", "category": "J-Link" }, { "command": "jlinkMcp.flashFirmware", "title": "J-Link MCP: Flash Firmware", "category": "J-Link" }, { "command": "jlinkMcp.showOutput", "title": "J-Link MCP: Show Output Log", "category": "J-Link" }, { "command": "jlinkMcp.showRttOutput", "title": "J-Link MCP: Show RTT Output", "category": "J-Link" }, { "command": "jlinkMcp.freeProbe", "title": "J-Link: Free the probe (stop the GDB server)", "category": "J-Link MCP" } ], "configuration": { "title": "J-Link MCP", "properties": { "jlinkMcp.probeType": { "type": "string", "enum": [ "jlink", "openocd", "blackmagic" ], "default": "jlink", "description": "Debug probe backend. OpenOCD covers ST-Link, CMSIS-DAP and FTDI adapters." }, "jlinkMcp.gdbPath": { "type": "string", "default": "arm-none-eabi-gdb", "description": "GDB used for source-level debugging. gdb-multiarch works if you have no ARM-specific build." }, "jlinkMcp.jlink.installDir": { "type": "string", "default": "", "description": "Path to SEGGER J-Link installation directory (auto-detected if empty)" }, "jlinkMcp.jlink.device": { "type": "string", "default": "Unspecified", "description": "Target device name (e.g., NRF52840_XXAA, STM32F407VG)" }, "jlinkMcp.jlink.interface": { "type": "string", "enum": [ "SWD", "JTAG" ], "default": "SWD", "description": "Debug interface" }, "jlinkMcp.jlink.speed": { "type": "number", "default": 4000, "description": "Connection speed in kHz" }, "jlinkMcp.jlink.serialNumber": { "type": "string", "default": "", "description": "J-Link serial number (for multi-probe setups)" }, "jlinkMcp.jlink.gdbPort": { "type": "number", "default": 2331, "description": "GDB server port" }, "jlinkMcp.jlink.rttTelnetPort": { "type": "number", "default": 19021, "description": "RTT telnet port" }, "jlinkMcp.jlink.swoTelnetPort": { "type": "number", "default": 2332, "description": "SWO telnet port" }, "jlinkMcp.telnetProxy.listenPort": { "type": "number", "default": 19400, "description": "Telnet proxy listen port for Trice/Pigweed" }, "jlinkMcp.telnetProxy.sourcePort": { "type": "number", "default": 19021, "description": "Source port to proxy (usually RTT telnet port)" }, "jlinkMcp.telnetProxy.sourceHost": { "type": "string", "default": "localhost", "description": "Source host for telnet proxy" }, "jlinkMcp.openocd.binaryPath": { "type": "string", "default": "openocd", "description": "Path to the openocd binary" }, "jlinkMcp.openocd.interfaceConfig": { "type": "string", "default": "interface/stlink.cfg", "description": "OpenOCD interface config (e.g. interface/stlink.cfg, interface/cmsis-dap.cfg)" }, "jlinkMcp.openocd.targetConfig": { "type": "string", "default": "target/stm32f4x.cfg", "description": "OpenOCD target config (e.g. target/stm32f4x.cfg, target/nrf52.cfg)" }, "jlinkMcp.openocd.gdbPort": { "type": "number", "default": 3333, "description": "OpenOCD GDB server port" }, "jlinkMcp.openocd.telnetPort": { "type": "number", "default": 4444, "description": "OpenOCD telnet/monitor port" }, "jlinkMcp.blackmagic.gdbPath": { "type": "string", "default": "arm-none-eabi-gdb", "description": "GDB binary used to drive a Black Magic Probe" }, "jlinkMcp.blackmagic.serialPort": { "type": "string", "default": "", "description": "BMP serial port (e.g. /dev/cu.usbmodemXXXX). Auto-detected when empty." }, "jlinkMcp.blackmagic.targetIndex": { "type": "number", "default": 1, "description": "Target index reported by the probe's scan" }, "jlinkMcp.svdPath": { "type": "string", "default": "", "description": "Path to a CMSIS-SVD file for the target. Enables symbolic peripheral reads (list_peripherals, read_peripheral, decode_register). Vendors publish these; the same file Cortex-Debug uses as svdFile works here." }, "jlinkMcp.rtt.controlBlockAddress": { "type": "string", "default": "", "markdownDescription": "Address of the SEGGER RTT control block (your firmware's `_SEGGER_RTT` symbol), e.g. `0x20000000`. J-Link locates this by scanning RAM and never reports it back, so supplying it is what allows RTT to be recovered after a target reset \u2014 without it, collection stops at the first reset and every later read looks like a quiet target." } } }, "mcpServerDefinitionProviders": [ { "id": "jlinkMcp.mcpServer", "label": "J-Link Debug Probe" } ] }, "scripts": { "compile": "tsc -p ./", "bundle": "node esbuild.mjs", "watch": "tsc -watch -p ./", "build": "npm run compile && npm run bundle", "prepublishOnly": "npm run build", "vscode:prepublish": "npm run build", "package": "npm run build && vsce package", "lint": "tsc --noEmit", "test": "npm run test:unit", "test:unit": "npm run clean:test && tsc -p tsconfig.test.json && node --test out-test/test/unit/*.test.js", "test:watch": "npm run clean:test && tsc -p tsconfig.test.json && node --test --watch out-test/test/unit/*.test.js", "test:hil": "npm run clean:test && tsc -p tsconfig.test.json && node --test out-test/test/hil/*.test.js", "clean:test": "node -e \"require('fs').rmSync('out-test',{recursive:true,force:true})\"", "demo": "node demo/story.js" }, "dependencies": { "@modelcontextprotocol/sdk": "^1.29.0", "sax": "^1.6.1", "zod": "^4.3.6" }, "devDependencies": { "@types/node": "^25.5.2", "@types/sax": "^1.2.7", "@types/vscode": "^1.110.0", "@vscode/vsce": "^3.7.1", "esbuild": "^0.28.0", "typescript": "^6.0.2" }, "mcpName": "io.github.Klievan/jlink-mcp" }