{"name":"io.github.microhenrio/openocd-mcp","slug":"microhenrio-openocd-mcp","title":"OpenOCD Debugger","description":"Debug microcontrollers via OpenOCD: flash, breakpoints, memory, registers and variables.","url":"https://mcp.market/server/microhenrio-openocd-mcp","rating":null,"grade":"A","score":88,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":25,"stars":4,"forks":0,"downloads_week":37,"last_push_at":"2026-07-02T14:02:49.000Z","license":"MIT"},"uptime":null,"claimed":false,"transport":"pypi","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/microhenrio/openocd-mcp","website":null,"version":"0.4.5","remotes":[],"packages":[{"registryType":"pypi","registryBaseUrl":"https://pypi.org","identifier":"openocd-mcp","version":"0.4.5","runtimeHint":"uvx","transport":{"type":"stdio"},"environmentVariables":[{"description":"Path to OpenOCD binary; optional.","name":"OPENOCD_BIN"},{"description":"Path to openocd-mcp.json config; optional.","name":"OPENOCD_MCP_CONFIG"},{"description":"Set to 1 to force read-only mode; optional.","name":"OPENOCD_MCP_READONLY"}]}],"tools":[{"name":"add_breakpoint","description":"Add a breakpoint. address : hex address, e.g. '0x08001234' hardware : True for hardware breakpoint (recommended for flash); False for software","write_action":false,"price_micros":0,"input_schema":null},{"name":"add_conditional_breakpoint","description":"Add a conditional breakpoint. The target halts at `address` only if `condition` evaluates true; otherwise resume/reset-run skips past it.","write_action":false,"price_micros":0,"input_schema":null},{"name":"add_watchpoint","description":"Add a data watchpoint. address : hex address to watch length : size in bytes (usually 1, 2, or 4) type : 'r' (read), 'w' (write), or 'a' (access/any) value : optional hex value to match (hardware dependent) mask : optional hex mask for the value match","write_action":false,"price_micros":0,"input_schema":null},{"name":"configure","description":"Set the chip/project settings for this session. Only non-empty arguments are applied; the rest keep their current values.","write_action":false,"price_micros":0,"input_schema":null},{"name":"connect","description":"Connect to OpenOCD. Call this first.","write_action":false,"price_micros":0,"input_schema":null},{"name":"flash_erase_sector","description":"Erase a range of flash sectors. bank : flash bank index (usually 0) first : first sector number to erase last : last sector number to erase (inclusive)","write_action":false,"price_micros":0,"input_schema":null},{"name":"flash_info","description":"Display information about the flash bank (size, sectors, erase state).","write_action":false,"price_micros":0,"input_schema":null},{"name":"flash_write","description":"Program a firmware file onto the target flash. path : full path to .elf, .bin, or .hex file verify : read back and verify after programming (recommended) reset_after : reset and run the new firmware after flashing","write_action":true,"price_micros":0,"input_schema":null},{"name":"halt","description":"Halt the target CPU so registers and memory can be inspected.","write_action":false,"price_micros":0,"input_schema":null},{"name":"install_openocd","description":"Download and cache OpenOCD for this OS/architecture (if not already present), so the server can run without a separate OpenOCD install. Verifies a pinned SHA-256. Needed only when OpenOCD isn't bundled or on PATH (e.g. a pip install).","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_breakpoints","description":"List all currently set breakpoints and watchpoints.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_peripheral_registers","description":"With no argument: list all peripheral names. With a peripheral name (e.g. 'RCC'): list that peripheral's registers.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_variables","description":"List known variable names, optionally filtered by a substring.","write_action":false,"price_micros":0,"input_schema":null},{"name":"load_elf","description":"Load variable names and addresses from a firmware .elf file, so you can read and write variables by name. Build the firmware with debug symbols. path: full path to the .elf (defaults to the configured elf_file if set).","write_action":false,"price_micros":0,"input_schema":null},{"name":"load_svd","description":"Load peripheral register definitions from a CMSIS-SVD file. Loaded automatically on first use from the configured svd_file; call this only to use a different SVD. path defaults to the configured svd_file.","write_action":false,"price_micros":0,"input_schema":null},{"name":"read_memory","description":"Read memory from the target. address : hex address, e.g. '0x20000000' count : number of units to read width : unit size in bits — 8, 16, or 32","write_action":false,"price_micros":0,"input_schema":null},{"name":"read_peripheral","description":"Read memory-mapped peripheral registers. base_address : peripheral base, e.g. '0x40020000' for GPIOA on STM32 count : number of 32-bit registers to read (default 16)","write_action":false,"price_micros":0,"input_schema":null},{"name":"read_peripheral_register","description":"Read a peripheral register by name (e.g. 'RCC.CR', 'GPIOA.MODER') and decode its named bitfields. The target should be halted for a stable read.","write_action":false,"price_micros":0,"input_schema":null},{"name":"read_register","description":"Read a single CPU register by name. Examples: 'r0', 'pc', 'sp', 'lr', 'xpsr', 'msp', 'psp'","write_action":false,"price_micros":0,"input_schema":null},{"name":"read_registers","description":"Dump all CPU registers (r0-r15, pc, sp, lr, xpsr, etc.).","write_action":false,"price_micros":0,"input_schema":null},{"name":"read_variable","description":"Read a global/static variable by name (requires load_elf first). Scalars (1/2/4 bytes) are decoded to hex and decimal; larger objects (arrays, structs) are dumped as words.","write_action":false,"price_micros":0,"input_schema":null},{"name":"remove_all_breakpoints","description":"Remove every breakpoint and watchpoint that is currently set.","write_action":true,"price_micros":0,"input_schema":null},{"name":"remove_breakpoint","description":"Remove the breakpoint at the given address.","write_action":true,"price_micros":0,"input_schema":null},{"name":"remove_conditional_breakpoint","description":"Remove the conditional breakpoint at the given address.","write_action":true,"price_micros":0,"input_schema":null},{"name":"remove_watchpoint","description":"Remove the watchpoint at the given address.","write_action":true,"price_micros":0,"input_schema":null},{"name":"reset","description":"Reset the target. mode: 'halt' — reset and immediately halt (good for debugging) 'run' — reset and start running 'init' — reset and run init scripts With 'run' and conditional breakpoints set, this honors those conditions (skipping false ones) just like resume.","write_action":false,"price_micros":0,"input_schema":null},{"name":"resume","description":"Resume CPU execution. Optionally resume from a specific address. If conditional breakpoints are set, this skips past those whose condition is false and stops at the first one whose condition is true (or on any other halt).","write_action":false,"price_micros":0,"input_schema":null},{"name":"run_command","description":"Run any raw OpenOCD TCL command and return its output. Use this for anything not covered by the other tools.","write_action":true,"price_micros":0,"input_schema":null},{"name":"set_permissions","description":"Adjust safety permissions for this session (only provided args change).","write_action":false,"price_micros":0,"input_schema":null},{"name":"show_config","description":"Show the current effective project settings and where they came from.","write_action":false,"price_micros":0,"input_schema":null},{"name":"start_openocd","description":"Start OpenOCD as a subprocess (so you don't have to launch it manually). Detects an already-running instance and won't start a duplicate.","write_action":false,"price_micros":0,"input_schema":null},{"name":"status","description":"Report current debug state: whether OpenOCD is running, whether the target is halted or running, and the current program counter (PC) if halted. Does not disturb execution.","write_action":false,"price_micros":0,"input_schema":null},{"name":"step","description":"Execute a single instruction and halt again.","write_action":true,"price_micros":0,"input_schema":null},{"name":"stop_openocd","description":"Stop the OpenOCD process this server started.","write_action":false,"price_micros":0,"input_schema":null},{"name":"watch_variables","description":"Live-watch one or more variables WITHOUT halting the CPU: sample them repeatedly while the target runs and return a time-series table.","write_action":false,"price_micros":0,"input_schema":null},{"name":"write_memory","description":"Write a value to a memory address. address : hex address, e.g. '0x20000000' value : hex value, e.g. '0xDEADBEEF' width : 8, 16, or 32","write_action":true,"price_micros":0,"input_schema":null},{"name":"write_peripheral_register","description":"Write a 32-bit value to a peripheral register by name (e.g. 'GPIOA.ODR').","write_action":true,"price_micros":0,"input_schema":null},{"name":"write_register","description":"Write a value to a CPU register. value: hex string, e.g. '0x20001000'","write_action":true,"price_micros":0,"input_schema":null},{"name":"write_variable","description":"Write a scalar global/static variable by name (requires load_elf first). value: hex (e.g. '0x2A') or decimal. Use write_memory for arrays/structs.","write_action":true,"price_micros":0,"input_schema":null}],"scan":{"score":88,"grade":"A","scanned_at":"2026-09-26T11:38:17.891Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-26T11:38:17.916Z","components":{"code":{"score":25,"max":25,"notes":["13 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":12,"max":15,"notes":["local package, no credentials required"]},"maintenance":{"score":12,"max":15,"notes":["last push 86 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[],"inputs":{"packages":[{"registryType":"pypi","identifier":"openocd-mcp","version":"0.4.5","found":true,"weeklyDownloads":37,"license":"MIT","dependencyCount":3,"publishedAt":"2026-07-02T14:03:19.243473Z","repositoryUrl":"https://github.com/microhenrio/openocd-mcp"}],"repo":{"found":true,"owner":"microhenrio","repo":"openocd-mcp","archived":false,"pushedAt":"2026-07-02T14:02:49Z","stars":4,"forks":0,"openIssues":0,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/8642755?v=4","ownerCreatedAt":"2014-09-03T14:01:16Z","license":"MIT"},"icon":{"url":"https://avatars.githubusercontent.com/u/8642755?v=4&s=128","source":"github"},"presence":{"stars":4,"forks":0,"downloadsWeek":37,"license":"MIT","lastPushAt":"2026-07-02T14:02:49.000Z","score":25}}}},"grade_history":[],"reviews":[]}