FreeOCD VSCode Extension
April 18, 2026 · View on GitHub
Open-source CMSIS-DAP flasher, verifier, and RTT debugger for embedded development — powered by DAP.js and integrated with every MCP-capable IDE (VS Code Copilot, Windsurf, Cursor, Cline) so AI agents can drive your hardware the same way you do.
Design Philosophy
A debugger is a tool that developers place their trust in during the most critical moments of development. We hold ourselves to that standard:
- Reliability — Every flash and recover operation must complete correctly, or fail explicitly with clear guidance
- Stability — Robust error recovery, bounded timeouts, and concurrency guards ensure the tool never hangs or leaves a device in an unknown state
- Security — All user inputs are validated; no external network requests; least-privilege CI/CD; MCP tools run in isolated subprocess
- Compatibility — Clean VS Code API feature detection, graceful degradation, and a modular architecture that welcomes new targets and platforms
- Performance — Responsive UI using VS Code's native components that never blocks during long operations; lazy-loaded DAPjs for fast activation
Highlights
- Flash / Verify / Recover / Soft reset over CMSIS-DAP v1 (node-hid).
- SEGGER RTT bidirectional terminal via
vscode.Pseudoterminal(ANSI, LF→CRLF translation, configurable polling interval). - Auto-flash on save for a single selected
.hexfile, with optional confirmation dialog. - Full MCP surface: tools, prompts, resources, and chat tool sets (VS Code 1.101+ stable APIs).
- Target JSON + Zod schema: nRF54L15 out of the box, AI-assisted workflow for any additional MCU.
- Tasks API: chain flash / verify / recover from
tasks.json. - Walkthrough + viewsWelcome + LanguageStatusItem: first-run UX.
- 7 platform-specific VSIX builds: macOS arm64 / x64, Windows x64 / ARM, Linux x64 / arm64 / armhf (ChromeOS Crostini covered).
Quick start
- Install the extension from the VS Code Marketplace or Open VSX.
- Plug in a CMSIS-DAP-class probe (DAPLink / Picoprobe / XIAO+CMSIS-DAP / …).
- Open the FreeOCD sidebar.
- Run
FreeOCD: Connect Probe→Select Target MCU→Select .hex File→Flash.
Supported MCUs
Out of the box:
- Nordic nRF54L15 (Cortex-M33, RRAMC) —
nordic/nrf54/nrf54l15
Additional MCUs can be added via:
- User-defined target JSON —
FreeOCD: Import Target Definition. - AI-assisted workflow — in any MCP-enabled chat run
/mcp.freeocd.add_new_mcu_supportor/mcp.freeocd.create_target_from_datasheet.
See CONTRIBUTING.md for the PR workflow.
MCP integration
The extension auto-registers an MCP server with any VSCode-family IDE that
implements vscode.lm.registerMcpServerDefinitionProvider (VS Code 1.101+,
Windsurf Next 1.110+). For other clients, run FreeOCD: Setup MCP to copy
ready-to-paste JSON into your clipboard for:
- Windsurf —
~/.codeium/windsurf/mcp_config.json - Cursor —
~/.cursor/mcp.json - Cline —
~/.cline/cline_mcp_settings.json
Tool Sets
VS Code 1.101+ lets you group MCP tools under a single #mention via a tool
sets file (the contributes.chatToolSets manifest entry does not exist).
FreeOCD ships a ready-to-import JSONC file so you do not have to hand-craft
one.
- Run Configure Tool Sets from the Command Palette and choose Create new tool sets file.
- Open
resources/tool-sets/freeocd.toolsets.jsonc(also installed into the VSIX attool-sets/freeocd.toolsets.jsonc) and copy its entire contents. - Paste into the tool sets file VS Code opened in step 1 and save.
- Reference groups in chat with
#freeocd-flash,#freeocd-rtt,#freeocd-target,#freeocd-low-level, or#freeocd-sessionto scope AI tool access.
The bundled file is the single source of truth for group membership — edit it locally if you want to add custom MCU tools alongside FreeOCD's built-in ones.
Prompts
From chat:
/mcp.freeocd.add_new_mcu_support/mcp.freeocd.debug_flash_error/mcp.freeocd.create_target_from_datasheet/mcp.freeocd.troubleshoot_rtt
Resources
Attach as chat context:
schema://target-definitionreference://targets/nrf54l15docs://mcu-workflowdocs://dap-glossarydocs://arm-cortex-m-registerslogs://session-log
Tasks API example
Wire flash into your build in .vscode/tasks.json:
{
"version": "2.0.0",
"tasks": [
{
"label": "Flash firmware",
"type": "freeocd",
"action": "flash",
"file": "build/firmware.hex",
"verify": true,
"problemMatcher": []
}
]
}
Troubleshooting
Linux udev rules
Add a rules file so non-root users can access CMSIS-DAP HID devices:
# /etc/udev/rules.d/50-cmsis-dap.rules
# DAPLink / CMSIS-DAP v1 (HID interface, usagePage 0xFF00)
SUBSYSTEM=="hidraw", ATTRS{idVendor}=="0d28", MODE="0666"
SUBSYSTEM=="hidraw", ATTRS{idVendor}=="2886", MODE="0666"
SUBSYSTEM=="hidraw", ATTRS{idVendor}=="2e8a", MODE="0666"
SUBSYSTEM=="usb", ATTRS{idVendor}=="0d28", MODE="0666"
SUBSYSTEM=="usb", ATTRS{idVendor}=="2886", MODE="0666"
SUBSYSTEM=="usb", ATTRS{idVendor}=="2e8a", MODE="0666"
Reload with sudo udevadm control --reload && sudo udevadm trigger.
Windows
No WinUSB / Zadig required — CMSIS-DAP v1 speaks plain HID. If the probe still doesn't appear, check Device Manager for a yellow triangle on the "HID-compliant device" entry and re-plug the probe.
macOS
macOS may prompt for permission to access the probe the first time. Accept the prompt and reconnect.
Licenses and attribution
- FreeOCD — BSD 3-Clause
- DAP.js (bundled under
vendor/dapjs) — MIT
See SECURITY.md for reporting vulnerabilities, and AI_REVIEW.md for the AI-oriented review checklist.