STM32 GDB MCP Server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@STM32 GDB MCP Serverbuild and flash my firmware, then pause at main"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
STM32 GDB MCP Server / STM32 GDB MCP 服务器
An MCP server that lets an AI agent debug STM32 firmware on real hardware — drive GDB + OpenOCD/ST-Link/J-Link to flash, breakpoint, inspect memory/registers/RTOS, triage HardFaults, and profile — and get back decoded, structured evidence instead of raw GDB text.
让 AI 智能体在真实硬件上调试 STM32:通过 GDB + OpenOCD/ST-Link/J-Link 烧录、打断点、查 内存/寄存器/RTOS、定位 HardFault、做性能采样,返回已解码的结构化证据而非原始 GDB 文本。
What you get / 能力一览
Bring-up & flash / 启动与烧录 |
|
Execution / 执行控制 |
|
Inspect / 状态检查(需暂停) |
|
Fault triage / 故障诊断 |
|
RTOS / 实时系统 |
|
Observe / 可观测性 |
|
Determinism / 可复现性 |
|
Multi-board / 多板卡 | 任意工具传 |
Two cross-cutting goals: low comprehension cost (decoded outputs, suggested_next_actions)
and minimal repro steps (composites like flash_and_run / debug_until collapse 5–15 calls
into one). Compact mode keeps the visible surface small; every tool remains reachable through
call(tool, args), and tool_help exposes hidden schemas.
两个贯穿目标是:通过解码结果和 suggested_next_actions 降低理解成本,并通过
flash_and_run、debug_until 等组合工具把多次调用压缩为一次,缩短复现路径。
compact 模式只展示核心工具;所有隐藏工具仍可由 call(tool, args) 调用,并可用
tool_help 查询完整说明与 schema。
Related MCP server: jlink-mcp
Install / 安装
Client | One command |
Claude Code(工具 + skills + 常驻规则) |
|
Cursor / VSCode / Codex / Windsurf / Trae |
|
Manual / 手动配置(任意 MCP 客户端) |
|
deploy.py installs the server, writes the IDE's MCP config, and drops a project-aware rules
file into your firmware project. Per-client config snippets + the rules template are in
docs/install-ides.md. Compact mode is on by default.
PyPI/console installs also expose stm32-gdb-mcp-check-env, stm32-gdb-mcp-install,
and stm32-gdb-mcp-deploy.
deploy.py 会安装服务器、写入 IDE 的 MCP 配置,并在固件项目中生成带项目上下文的规则文件。
各客户端配置片段和规则模板见 docs/install-ides.md。默认启用 compact
模式;PyPI/console 安装还会提供上述三个辅助命令。
stm32-gdb-mcp-check-env --json also reports the imported module version/path, installed
distribution version, and all four console scripts. Use stm32-gdb-mcp-deploy --upgrade
when those installation fields drift. / stm32-gdb-mcp-check-env --json 还会报告当前导入
模块的版本/路径、已安装发行版本和四个 console script;这些安装字段发生漂移时,使用
stm32-gdb-mcp-deploy --upgrade 修复。
Requirements / 环境要求:PATH 中需要 arm-none-eabi-gdb,以及至少一种 GDB Server
(openocd / JLinkGDBServerCL / st-util)。运行 python setup_env.py 检查。
30-second quickstart / 快速上手
detect_probe() # USB evidence; auto-select only one probe
debug_profile(action=set, mcu="STM32L431", probe="stlink", elf_path="build/app.elf", svd_path="STM32L4.svd")
suggest_server_args(mcu="STM32L431") # probe omitted -> use profile probe
start_debug_session(server_type="openocd") # server_args omitted -> infer from profile mcu/probe
self_check() # ALWAYS first: byte order, core, family
flash_and_run(file_path="build/app.elf", run_to="main")
breakpoint(action=set, location="my_func", condition="state == BAD")
run_and_wait() # structured stop event + next actions
run_for_duration(duration_sec=30, capture={"expressions": ["rx_count"]})
run_for_duration(duration_sec=60, sample={"interval_ms": 500, "expressions": ["rx_count", "state"]})
reconstruct_fault_context() # on a crash: faulting PC → file:linedetect_probe reads physical USB devices, keeps serials for identical probes, and never
chooses between multiple connected probes. / detect_probe 读取真实 USB 设备,同型号探针按
序列号分别保留;连接多个探针时绝不会擅自选择。
The full tool reference (lean families with action=/what=) is
skills/stm32-debug/reference/tool-map.md. The server
also ships always-on instructions, so any MCP client gets the debug loop without setup.
完整工具索引见 skills/stm32-debug/reference/tool-map.md,
其中按 action= / what= 归并工具族。服务器还会发送常驻 instructions,因此任意 MCP
客户端连接后都能获得同一套调试闭环。
Key rules (the target must cooperate) / 关键规则
Reads need a HALTED core. If a read says
target_unresponsive,halt_executionfirst. / 读取要求内核已暂停。 若返回target_unresponsive,先执行halt_execution。run_for_duration(sample=...)is best-effort low-rate debugger polling. It does not halt the target itself, but running-target expression reads may fail on some probes/MCUs; use SWO/ring-buffer firmware telemetry for higher-rate or guaranteed capture. /run_for_duration(sample=...)是尽力而为的低速调试器轮询;某些探针或 MCU 无法在运行中读取 表达式。需要更高采样率或可靠采集时,请使用 SWO 或固件环形缓冲。A breakpoint TIMEOUT means the path was NOT reached — don't just retry. Halt,
capture_state,breakpoint(action=list)(hit_count=0 confirms), read the gating flag, set an earlier breakpoint or drive the precondition. / 断点超时表示路径没有到达。 不要原样重试;暂停后采集状态、确认 命中次数、读取门控条件,再前移断点或驱动前置条件。Writes are guarded (option bytes/IWDG/WWDG blocked) —
write_guard(action=policy)to allow. / 写操作受保护。 option bytes、IWDG、WWDG 默认禁止,需用write_guard(action=policy)显式放行。Never hard-kill OpenOCD (wedges the ST-Link USB) — use
recover_session. SWD is exclusive. / 不要强杀 OpenOCD。 使用recover_session;同一探针的 SWD 调试连接是独占的。A wedged probe needs a physical re-enumeration. With the optional
[hub]extra and a SmartUSBHub,hub(action=power)cuts VBUS andhub(action=data)drops the USB data lines, so that re-plug becomes a tool call. Without a hub it is still a human with a cable. / 卡死的探针必须物理重新枚举。 装上可选的[hub]extra 并接可编程 USB Hub 后,hub(action=power)可断 VBUS、hub(action=data)可断数据线,那次插拔就变成一次工具调用; 没有 Hub 时仍然只能靠人手拔插。
Programmable USB hub (optional) / 可编程 USB Hub(可选)
pip install 'stm32-gdb-mcp[hub]'Then point a session at its port (1-based, matching the hub's silkscreen):
{"action": "set", "hub": {"channel": 2, "guard": "confirm"}}hub(action=describe) is read-only and also reports per-port voltage/current on models
with an ADC. hub(action=power/data/cycle) requires confirm=true while the guard is in
its default confirm mode, and — in every mode, guard: allow included — whenever the
calling session's own GDB server is live on that port: cutting power mid-flash is how a
board becomes a brick. Note the scope: in local mode the check sees only the session
making the call, so it will not notice that a different session is mid-flash on that
channel. With the shared hub daemon (the default; see below) it sees every registered
session on every server.
Three entry points confirm on their own behalf, deliberately, because naming them is the
confirmation — and their decisions land in the same audit trail hub(action=describe)
returns. reset_target(strategy="cold") and recover_session's escalation ladder stop the
GDB session before the cut instead of yanking VBUS out from under it.
hub(action=discover) refuses outright while a session is live — except with
force=true, which bypasses the interlock entirely, so that flag is the one place you
are genuinely on your own. Set guard: allow for scripted CI. /
hub(action=describe) 是只读的,带 ADC 的型号还会返回每端口电压/电流。默认 confirm
模式下,hub(action=power/data/cycle) 必须显式传 confirm=true;调用方自己的会话在该端口
上有活跃 GDB 服务时,任何模式(含 guard: allow)下都强制要求——烧录中途断电正是把板子变砖的
方式。注意这条检查的范围:local 模式下它只看发起调用的那个会话,不会发现另一个会话正在该
通道上烧录;使用共享 Hub 守护进程时(默认,见下文)则能看到所有服务器登记的全部会话。
有三处入口会自行确认,这是刻意设计的——点名调用它们本身就是确认,且其决定同样进入
hub(action=describe) 返回的审计日志。reset_target(strategy="cold") 与 recover_session
的恢复阶梯会先停掉 GDB 会话再断电,而不是从活跃会话脚下拔掉 VBUS;hub(action=discover)
在有活跃会话时直接拒绝运行——但 force=true 会完全绕过该联锁,那是唯一真正需要你自己
负责的地方。CI 脚本可设 guard: allow。
Selecting a channel on a multi-board rack / 多板机架下的通道选择
hub: {channel: N} above pins one session to one port. With several boards, map the
whole rack once instead and let each session pick its own channel: /
上面的 hub: {channel: N} 把一个会话钉在一个端口上。多块板时改为一次性描述整个机架,
让每个会话各自选中自己的通道:
# bench_hub.yaml
hub:
port: COM7 # omit to auto-scan / 省略则自动扫描
guard: confirm
map:
3: {label: TC}
4: {label: AGS}{"action": "load", "path": "bench_hub.yaml"}Three things about this that are easy to get wrong: / 其中有三点很容易搞错:
A
labelis matched against the debug session name, exactly. It is not a free-form nickname: the channel is selected only when the session was started assession="TC". This is the only way to select a channel for a serial-less probe —hub(action=discover, apply=true)keys those by USB port, which identifies a channel but cannot select one. /label是与调试会话名精确比对的,不是自由昵称:只有会话以session="TC"启动时才会 选中该通道。对于无序列号的探针这是唯一可行的选择方式——hub(action=discover, apply=true)只能按 USB 端口给它们建 key,那能认出通道,却无法选中通道。The debug profile is per-session. Loading the config into one session does not make the map visible to another; the hub call then fails with
hub_unavailable: hub channel unmapped. Load it into each session:debug_config(action=load, path="bench_hub.yaml", session="TC"). The profile is also in-memory only, so this is re-run after every server restart. / 调试 profile 是按会话隔离的。 在一个会话里加载配置,另一个会话看不到该映射,此时 hub 调用会以hub_unavailable: hub channel unmapped失败。需要给每个会话都加载一次:debug_config(action=load, path="bench_hub.yaml", session="TC")。profile 还是纯内存的, 因此服务器每次重启后都要重新加载。setreplaces a nested block; it does not merge into it.debug_profile(action=set, hub={...})keeps every OTHER profile field, but thehubblock you pass replaces the stored one whole — so writinghub={map: {3: {label: TC}}}afterhub(action=discover, apply=true)throws away the probe identity discovery had written there, and a serial-less probe has no other identity. Passmerge=trueto deep-merge into the stored block instead; leave it off when you mean to drop a stale channel, because replacing is the only way to remove one. /set对嵌套块是整块替换,不是合并。 顶层其他字段会保留,但传入的hub块会整块覆盖已 存的内容——在hub(action=discover, apply=true)之后再写hub={map: {3: {label: TC}}}, 会把 discovery 写入的探针身份一并丢掉(无序列号探针没有别的身份可用)。需要合并请加merge=true;要删除过期通道则保持默认的替换语义,因为那是唯一的删除方式。
When it works, the result carries channel_source: "map_label" — check that field rather
than assuming the right port was chosen. /
生效时结果会带 channel_source: "map_label"——请以该字段为准,不要想当然认为选对了端口。
Several MCP servers on one rack / 多个 MCP 服务器共用一个 Hub
The hub's control port opens in one process at a time, so by default the first hub call
spawns a small hub daemon that owns it, and every MCP server talks to that instead.
Nothing changes in how you call hub(...). /
Hub 控制口同一时间只能被一个进程打开。因此默认情况下,第一次调用 hub 会拉起一个Hub 守护进程
独占它,所有 MCP 服务器都改为与守护进程通信;hub(...) 的用法完全不变。
Reads are shared. Writes lock only the channels they touch: a power cycle on CH1 never interleaves with another switch on CH1, but a switch on CH4 runs alongside it. Exclusive isolation locks the whole rack, and
hub(action=discover)holds a rack-wide lease for its whole run, so no other server's switch can corrupt the map. Waiting is FIFO among conflicting requests, so a rack-wide request is never starved. / 读取共享;写操作只锁住 涉及的通道:CH1 的电源循环不会与 CH1 上的其他开关交错,但 CH4 的操作可以同时进行。exclusive 隔离锁住整个机架;hub(action=discover)在整个运行期间持有全机架租约,其他服务器的开关无法 插入。冲突请求按先来后到排队,整机架请求不会被饿死。Each server's guard mode stays its own (
guard: allowon a CI server does not relax anyone else), and the audit trail records which server did what. / 每个服务器的 guard 模式各自独立,审计日志记录是哪台服务器执行的操作。What a server switched off is restored when it exits — or when the daemon finds its PID gone. / 某服务器断开的电源/数据线,在它退出(或守护进程发现其进程已消失)时自动恢复。
Cross-server interlock. Every server registers its sessions that have a
hubblock (after each tool call, plus a 2 s heartbeat). Cutting power or data on a channel where any server has a live GDB server needsconfirm=true, whatever the guard mode, and the refusal names that session and server.hub(action=discover)refuses while any server on the rack is live. A session with nohubblock cannot be mapped to a channel and so is not protected. / 跨服务器互锁:每个服务器都会登记带hub配置的会话(每次工具调用后 同步登记,另有 2 秒心跳)。只要任一服务器在该通道上有活跃 GDB,断电/断数据就必须confirm=true(与 guard 模式无关),拒绝信息会指出是哪个服务器的哪个会话;任一服务器有活跃 会话时hub(action=discover)拒绝运行。没有hub配置的会话无法映射到通道,因此不受保护。A write waits at most 30 s behind another server's write, then is refused (not run late) with the name of what held the hub; one that did wait reports
queued_ms. Every switch also invalidates every server'sdetect_probecache. / 写操作最多排队 30 秒,超时则拒绝执行 (而不是延后执行)并指出占用者;排过队的结果带queued_ms。每次切换都会让所有服务器的detect_probe缓存失效。The daemon exits after 10 idle minutes unless it still owes a channel. / 空闲 10 分钟且无待恢复通道时,守护进程自动退出。
python -m mcp_server.hub_daemon status # URL, version, connected servers
python -m mcp_server.hub_daemon stop # restores what clients switched off
python -m mcp_server.hub_daemon serve --config bench_hub.yaml # run it yourself, foregroundSTM32_GDB_MCP_HUB_MODE=auto (default) uses the daemon and falls back to in-process when
the [hub] extra is absent or the daemon cannot start; daemon never falls back; local
is the old single-process behaviour. Everything binds to 127.0.0.1; writes need the token
in the per-user state file. /
STM32_GDB_MCP_HUB_MODE=auto(默认)使用守护进程,未安装 [hub] extra 或守护进程无法启动时
退回进程内模式;daemon 不回退;local 为原来的单进程行为。全部仅监听 127.0.0.1,写操作需
要用户私有状态文件中的 token。
Live dashboard / 实时看板
hub(action=dashboard) # -> data.url, e.g. http://127.0.0.1:8765/A read-only page: per-port power/data state, live V/I/P with a 1/5/15-minute history
(power-off spans shaded), and a timeline of hub actions. With the daemon it is the
daemon's page, showing every connected MCP server and what each still owes; in local
mode it runs inside this server (state=off stops it) and lists its debug sessions. /
只读页面:各端口电源/数据线状态、电压电流功率及 1/5/15 分钟历史(断电区间灰色)、hub 操作时间线。
使用守护进程时就是守护进程的页面,显示所有已连接的 MCP 服务器及其待恢复通道;local 模式下
在本服务器内运行(state=off 停止),并列出本服务器的调试会话。
Response shape / 响应结构
Every tool returns a stable JSON envelope inside the MCP TextContent transport:
{ "ok": true, "data": {}, "error": null, "raw_response": null, "suggested_next_actions": [] }Human-readable text lives in data.message / error.message; raw GDB output stays in
raw_response when it aids diagnosis. Errors carry a code (e.g. target_unresponsive).
可读消息位于 data.message / error.message;仅在有助于诊断时保留原始 GDB 输出到
raw_response。错误包含稳定的 code,例如 target_unresponsive。现代 MCP 客户端还会收到
内容相同的原生 structuredContent,错误结果设置 isError=true。
Agent guidance — three layers / 三层引导
Inline / 内联 — most results carry
suggested_next_actions(the next loop step) / 大多数结果直接给出下一步动作。Always-on / 常驻 — the server's
instructionsinject automatically / 服务器自动注入调试闭环与关键规则。On-demand — skills:
stm32-debug(bring-up, HardFault, hang, minimal repro, replayable scenarios) andstm32-instrument(write-time SWO/ITM trace). In other IDEs the same guidance travels as a rules file (AGENTS.md). / 按需加载两项 skill;其他 IDE 通过AGENTS.md等规则文件获得同样指导。
Repeatable config / 可复现配置
Load a YAML debug profile so sessions reproduce across clients:
debug_config(action=load, path="mcp/board.yaml").
加载 YAML 调试 profile 可让不同客户端复现同一会话:
debug_config(action=load, path="mcp/board.yaml")。
mcu: STM32L431CCUx
probe: stlink
server_type: openocd
server_args: ["-f", "interface/stlink.cfg", "-f", "target/stm32l4x.cfg"]
elf_path: build/app.elf
svd_path: STM32L4.svdRelative elf_path, svd_path, project_root, and swo.file values are resolved from the
YAML file's directory. Session start, logging, reset, and flash tools then use the loaded
profile when their corresponding arguments are omitted.
相对的 elf_path、svd_path、project_root 和 swo.file 均以 YAML 所在目录为基准解析。
随后启动会话、日志、复位和烧录工具会在省略对应参数时自动使用该 profile。
Load the profile, connect, and run the mandatory identity check in one MCP round trip:
batch(steps=[
{"tool": "debug_config", "args": {"action": "load", "path": "mcp/board.yaml"}},
{"tool": "start_debug_session", "args": {}},
{"tool": "self_check", "args": {}}
], stop_on_error=true)以上配方在一次 MCP 往返中完成“加载配置 -> 连接 -> 自检”,任一步失败即停止。
See examples/configs/ for J-Link, OpenOCD, and non-flashing L151/L431/U535 HIL profiles. /
J-Link、OpenOCD 及不烧录的 L151/L431/U535 HIL 配置见 examples/configs/。
Develop / 开发
pip install -e ".[dev]"
python -m ruff check . && python -m pytest && python -m compileall src tests
python -m build && python scripts/check_dist_contents.py dist/*docs/install-ides.md— per-IDE install + rules template / 各 IDE 安装与规则模板docs/TROUBLESHOOTING.md— common failures + recovery / 常见故障与恢复docs/hil-validation.md— HIL validation / 硬件在环验证(STM32_GDB_MCP_HIL=1)CONTRIBUTING.md,SECURITY.md,docs/release.md
Hardware validation runs on a self-hosted runner labeled stm32; normal CI is hardware-free
(lint, tests, compile, packaging).
硬件验证运行在带 stm32 标签的自托管 runner;普通 CI 不依赖硬件,只执行 lint、测试、
编译检查和发行包验证。
Available Tools
86 toolsacceptance_loop_statusARead-onlyIdempotent
Read the acceptance loop's trajectory (per-iteration pass/fail counts, status) and the current decision without running an iteration.
| Name | Required | Description | Default |
|---|---|---|---|
| session | No | Target session id (default 'default'). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds meaningful context: that this is a passive inspection that does not trigger an iteration and that it returns trajectory plus decision state, which is beyond what the annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that leads with the action and resource and packs the scope constraint and return contents with zero filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of describing returns and does so (pass/fail counts, status, decision). Annotations cover the safety profile. Minor gap: no mention of how the trajectory is scoped or paginated, but complete enough to call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one optional parameter ('session', default 'default') and schema description coverage is 100%, so the schema fully documents it. The description adds nothing about the parameter, which is the expected baseline when the schema does the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Read') and resource ('the acceptance loop's trajectory'), and enumerates the returned data (per-iteration pass/fail counts, status, current decision). The clause 'without running an iteration' functionally distinguishes it from sibling run_acceptance_iteration.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Without running an iteration' implies this is the non-mutating status-check counterpart to run_acceptance_iteration, giving implied usage. However, it names no alternative explicitly and gives no explicit when-to-use/when-not conditions, so the agent must infer the routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analyze_stackARead-onlyIdempotent
Reports stack used/free bytes and a clear overflow verdict for the halted core. stack_top defaults to the initial MSP (first word of the vector table at vector_table_addr). Give stack_size or stack_limit for the overflow check (else only usage is reported). The key tool for diagnosing stack overflows.
| Name | Required | Description | Default |
|---|---|---|---|
| session | No | Optional debug-session name. Omit for the default target. | |
| stack_top | No | Top-of-stack address (hex). Default: initial MSP from the vector table. | |
| stack_size | No | Stack size in bytes (used as stack_top - stack_size if stack_limit omitted). | |
| stack_limit | No | Lowest valid stack address (hex). | |
| vector_table_addr | No | Vector table base for the initial MSP (default '0x08000000'). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety burden is lifted. The description adds meaningful context beyond them: it only works on a halted core, and the overflow verdict is conditional on stack_size/stack_limit being supplied. It does not describe the return payload structure, but with annotations covering behavior this is solid.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads what is reported, then the defaults/parameter rules, then the positioning statement. Four compact sentences, each doing work; only slight overlap with the schema on parameter behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description adequately covers what comes back (used/free bytes plus a verdict) and the precondition (halted core, overflow check needs a size or limit). An agent has enough to invoke it correctly, though return-format detail is left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all five parameters. The description adds minor value by restating the stack_top default source and the stack_size vs stack_limit relationship, but mostly echoes the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Reports stack used/free bytes') plus a distinct outcome ('a clear overflow verdict for the halted core'), which separates it from nearby siblings like read_call_stack or diagnose_fault. The closing line 'key tool for diagnosing stack overflows' pins down its niche explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the conditional behavior clearly: provide stack_size or stack_limit for the overflow check, otherwise only usage is reported. It also scopes the tool to a 'halted core'. It does not name alternative sibling tools, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
batchADestructive
Runs several tool calls in ONE round trip and returns ALL their full results — the fastest way to do a sequence of operations (e.g. read registers + backtrace + several variables) without per-call latency. ok is false if ANY step failed; data.succeeded/data.failed count the outcomes (count/total only count steps run vs requested). Pass session to run every step against a named debug session.
| Name | Required | Description | Default |
|---|---|---|---|
| steps | Yes | Ordered tool calls, each {tool, args}. | |
| session | No | Optional debug-session name. Omit for the default target. | |
| stop_on_error | No | Stop at the first failing step (default false). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false and openWorldHint=true, so the safety profile is covered. The description adds genuinely useful behavioral context beyond that: the aggregation rule ('ok is false if ANY step failed') and how data.succeeded/data.failed vs count/total are counted. It does not discuss per-step error isolation or permission needs, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the purpose and the latency benefit. Each sentence carries information, though the middle return-semantics sentence is dense and slightly run-on.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must carry return semantics, and it does so reasonably (ok flag, succeeded/failed counts, count/total distinction). For a batch meta-tool it is nearly complete; it could say more about partial-failure handling when stop_on_error is false.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description still adds meaning by clarifying that session applies to every step ('Pass session to run every step against a named debug session'), and implies steps are an ordered sequence. stop_on_error is left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Runs several tool calls in ONE round trip') and reinforces it with a concrete example (read registers + backtrace + several variables). It is clearly a batching/meta-tool, but it never names the single-call sibling (call/call_read) it contrasts against, so differentiation is implicit rather than explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for when to reach for it ('the fastest way to do a sequence of operations... without per-call latency') with an illustrative use case. It does not state any when-not condition or explicitly point to the alternative single-call tool for one-off invocations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
breakpointB
Breakpoint / watchpoint management. action=set(location[,condition,temporary,ignore_count]) | delete(breakpoint_id) | list | watch(location,access_type). access_type=r|w|a.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Which operation to perform. | |
| session | No | Optional debug-session name. Omit for the default target. | |
| location | No | Location to break at, e.g., 'main', 'main.c:42', or '*0x08001000'. | |
| condition | No | Optional C expression; break only when it is non-zero, e.g. 'count > 5'. | |
| temporary | No | If true, the breakpoint is deleted after its first hit. | |
| access_type | No | Read (r), Write (w), or Access (a). | |
| ignore_count | No | Number of hits to ignore before stopping. | |
| breakpoint_id | No | ID of the breakpoint to delete (e.g., '1'). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false, and openWorldHint=false, so the safety profile is covered. The description adds only the argument signatures, with no mention of permissions, session scoping behavior, or what a 'list' returns; it does not contradict the annotations but adds little beyond them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Extremely compact and front-loaded: one sentence plus a signature-style breakdown of each action. It is dense but wastes nothing; the terse backus-naur-like notation is the only mild readability cost.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter, no-output-schema mutation tool, the description covers all four actions but omits any statement of return behavior (notably for 'list'), does not mention the optional 'session' parameter, and gives no indication of how set/delete affect program state. Adequate but with clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and all 8 parameters are documented in the schema itself, so the baseline of 3 applies. The description's signature notation mirrors the schema (location, condition, temporary, ignore_count, access_type) without adding format or constraint detail beyond it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource (breakpoints/watchpoints) and enumerates the four operations (set/delete/list/watch) with their key arguments, so an agent immediately knows this tool manages debug breakpoints. It does not explicitly distinguish itself from similarly-purposed siblings like run_to_line or debug_until, which also stop execution, keeping it short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The action list implies when each mode applies (set vs delete vs list vs watch), but there is no explicit when-to-use or when-not guidance and no routing to alternatives such as run_to_line or run_to_line-style stop helpers. Usage is inferable but not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
build_firmwareADestructive
Builds firmware with Keil uVision (UV4), CMake, make, or a custom command, so the AI can rebuild after a fix. Keil emits a .axf (ELF/DWARF) that the debug tools load like any .elf. Returns the exit code, success flag, and build log tail.
| Name | Required | Description | Default |
|---|---|---|---|
| cwd | No | Working directory for the build. | |
| kind | Yes | Toolchain to build with. | |
| config | No | cmake: build config, e.g. Debug/Release. | |
| target | No | Keil/CMake/make build target. | |
| command | No | custom: full argv to run. | |
| project | No | keil: path to the .uvprojx/.uvproj project. | |
| rebuild | No | keil: rebuild all (-r) instead of incremental (-b). | |
| session | No | Optional debug-session name. Omit for the default target. | |
| uv4_path | No | keil: path to UV4.exe (auto-detected if omitted). | |
| build_dir | No | cmake: the configured build directory. | |
| directory | No | make: directory containing the Makefile. | |
| timeout_sec | No | Max build seconds (default 600). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, non-idempotent, open-world, so the safety profile is covered. The description adds useful artifact context (Keil emits .axf usable by debug tools) and states the return payload (exit code, success flag, log tail), but never explains what the destructive hint means (overwritten build outputs) or permission needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three front-loaded sentences, purpose first, with no filler. The .axf/debug-tools sentence is slightly tangential but earns its place by linking the build artifact to downstream tools.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 12 parameters and no output schema, the description does the needed work by naming the toolchains and describing the return values. Only the meaning of the destructive annotation and any required setup are left unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter including the kind enum is already documented. The description adds only that Keil produces .axf and names the toolchains; it does not add syntax or defaults beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (builds) and resource (firmware) plus the four supported toolchains, and it is clearly distinct from sibling flash_firmware (build vs deploy). An agent can tell exactly what this does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"so the AI can rebuild after a fix" gives an implied usage scenario, but there is no explicit when-not guidance or named alternative (e.g., build_firmware vs flash_firmware sequencing). Usage is inferable rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
callADestructive
Invoke ANY stm32-gdb-mcp tool by name — including one that is NOT in your current tool list (clients with tool-count limits may hide some). Use this to reach e.g. start_debug_session when it isn't directly listed: call(tool='start_debug_session', args={...}). Returns that tool's result.
| Name | Required | Description | Default |
|---|---|---|---|
| args | No | Arguments for that tool. | |
| tool | Yes | Name of the tool to invoke. | |
| session | No | Optional debug-session name. Omit for the default target. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false, idempotentHint=false and openWorldHint=true, so the risk profile is largely covered structurally. The description adds the delegation semantics ('Returns that tool's result') but does not warn that side effects depend entirely on the invoked tool or discuss auth/rate limits, so it adds only moderate context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One tight paragraph, front-loaded with the capability and immediately followed by the condition and a concrete example. Every sentence earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully notes that it returns the invoked tool's result, closing the biggest information gap. For a generic dispatcher the coverage is strong, though it could say more about how errors or destructive side effects from the delegated tool surface.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so tool, args and session are all documented in the schema itself, which sets the baseline at 3. The description reinforces usage with a call(tool=..., args={...}) example but adds no syntax, format, or constraint detail beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (invoke) and resource (ANY stm32-gdb-mcp tool by name) and makes the dispatch role explicit, which cleanly separates it from every concrete sibling like start_debug_session or read_memory. An agent immediately understands this is a meta-call escape hatch rather than a domain operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives the selecting condition explicitly — use it when the target tool is 'NOT in your current tool list' because clients with tool-count limits may hide some — and provides a concrete example with start_debug_session. It stops short of stating when to prefer a directly-listed sibling over this generic path, which is the only gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
call_readARead-onlyIdempotent
Like call, but restricted to tools that only READ state — so it needs no approval prompt where call, which can reach anything, does. Prefer it for hidden read-only tools: call_read(tool='read_core_registers', args={}). The gate is per-ACTION, not per-tool: a family's reading action goes through even though the family also writes, so call_read(tool='debug_profile', args={'action':'get'}) works while action='set' does not. A refusal names the actions it would accept. Refuses anything that writes; use call for those.
| Name | Required | Description | Default |
|---|---|---|---|
| args | No | Arguments for that tool. | |
| tool | Yes | Name of the read-only tool to invoke. | |
| session | No | Optional debug-session name. Omit for the default target. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint/idempotent/destructive=false, but the description adds substantial context beyond them: it avoids an approval prompt, the gate is per-ACTION not per-tool, and a refusal names the actions it would accept. These are genuine operational behaviors an agent could not infer from the annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the key distinction ('Like call, but restricted to tools that only READ state'), and every sentence carries a distinct piece of information (prompt avoidance, per-action gate, refusal behavior). It runs slightly long and the per-action nuance takes a few clauses to land, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a gateway/dispatch tool with no output schema, the description covers purpose, when to prefer it, the subtle per-action eligibility rule, and error/refusal behavior. An agent has everything needed to invoke it correctly and interpret a rejection.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds value by demonstrating the tool/args relationship with concrete examples (args={} and args={'action':'get'}). It does not clarify the optional 'session' parameter, which the schema already documents, so it stops short of a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific capability (invoke read-only tools) and explicitly contrasts itself with the sibling 'call', which can reach anything. The agent can distinguish the two without opening either schema, and the 'restricted to tools that only READ state' clause pins down the exact scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use (hidden read-only tools), when-not-to-use ('Refuses anything that writes; use call for those'), and names the alternative 'call'. The per-action guidance ('get' works, 'set' does not) tells the agent exactly which invocations are eligible, not just which tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
capture_stateARead-onlyIdempotent
One-call 'where am I': decoded core registers + a PC/LR/SP summary, the decoded backtrace, and the innermost-frame locals. The fastest way to get full halted context.
| Name | Required | Description | Default |
|---|---|---|---|
| session | No | Optional debug-session name. Omit for the default target. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so the safety profile is covered structurally. The description adds real behavioral value beyond that by disclosing the exact payload composition and the decoding (symbol-resolved backtrace/locals), plus the implicit requirement that the target be halted. It stops short of describing formatting, truncation, or pagination.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences with zero filler, front-loaded with the 'where am I' framing so the agent immediately grasps the intent. Every clause earns its place by naming a concrete returned artifact.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of describing the return value, and it does so concretely (registers, PC/LR/SP, backtrace, locals). Combined with annotations covering safety and idempotency, an agent has enough to call it correctly; only edge cases like a non-halted target or empty stack are unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single optional parameter with 100% schema description coverage ('Optional debug-session name. Omit for the default target.'), so the schema fully documents it. The description adds no parameter-level detail, which is the correct baseline when the schema does the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource ('One-call "where am I"') and enumerates exactly what it returns: decoded core registers, a PC/LR/SP summary, a decoded backtrace, and innermost-frame locals. It reads as an aggregate snapshot tool, but it does not name the sibling tools it consolidates (read_call_stack, read_registers, analyze_stack), so differentiation is implicit rather than explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a usage context ('the fastest way to get full halted context') that implies you call it when you want a complete halted picture in one shot. However, it names no alternatives and no exclusions, so an agent must infer when a narrower sibling like read_call_stack or read_registers is preferable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clear_session_journalB
Clears the session journal (keeps the run-id).
| Name | Required | Description | Default |
|---|---|---|---|
| session | No | Optional debug-session name. Omit for the default target. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, and idempotentHint=false, so the safety profile is largely covered. The parenthetical 'keeps the run-id' adds useful scope detail beyond annotations, clarifying what survives the clear, but the description says nothing about what happens to the journal content, recoverability, or auth needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short sentence that front-loads the action and appends the key constraint. No wasted words; every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter tool with no output schema and annotations covering safety, the description is adequate but thin. It omits when to use it and any notion of the effect on the journal content, leaving minor gaps for an agent to resolve.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single optional 'session' parameter is fully documented in the schema, so the baseline is 3. The description adds no detail about the parameter (e.g., default vs named session behavior beyond what the schema states).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear specific verb (clears) plus resource (session journal) and scope qualifier (keeps the run-id), which lets an agent distinguish it from siblings like get_session, session_diagnostics, or recover_session. It does not explicitly name any sibling, so differentiation is implicit rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no when-to-use context, no prerequisites, and no alternatives (e.g., how this differs from recover_session or session_diagnostics). The agent must infer the scenario in which clearing the journal is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
close_sessionB
Closes a named debug session, tearing down its GDB client and server.
| Name | Required | Description | Default |
|---|---|---|---|
| session | No | Optional debug-session name. Omit for the default target. | |
| session_id | Yes | Name of the session to close, e.g. 'rackA'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, and the description usefully adds that a close tears down both the GDB client and server. It does not say what happens if the session does not exist, whether the teardown is recoverable, or what a caller should expect afterwards.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence with zero filler; the verb, resource, and effect are all in the first clause.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema and no annotations beyond safety hints, the description covers the operation's effect but omits error/failure behavior and the post-close state of the session, leaving meaningful gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with both 'session' and 'session_id' fully documented in the schema itself. The description adds no parameter detail beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Closes a named debug session") and adds the concrete effect of tearing down the GDB client and server. It does not, however, distinguish itself from the very similar sibling 'stop_debug_session', so sibling differentiation is missing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to close versus stop, recover, or get a session, and no stated prerequisites. The only conditional hint (omit the name for the default target) lives in the schema, not the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
configure_debug_freezeADestructive
Freezes peripherals (IWDG, WWDG, RTC, timers) while the core is halted via the DBGMCU freeze registers, so the watchdog cannot reset the target out from under the debugger. Family is taken from the debug profile MCU if omitted.
| Name | Required | Description | Default |
|---|---|---|---|
| apply | No | If false, only return the planned register writes (default true). | |
| family | No | STM32 family or part number. Known: ['stm32f4', 'stm32l4']. | |
| session | No | Optional debug-session name. Omit for the default target. | |
| peripherals | Yes | Peripherals to freeze, e.g. ['iwdg', 'wwdg', 'rtc', 'tim2']. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare the mutation profile (readOnlyHint=false, destructiveHint=true), and the description adds genuinely useful context beyond them: it explains the register mechanism and the resulting target behavior (watchdog freeze while the core is halted), which clarifies what the side effect actually is. It does not, however, say whether the freeze is reverted on session close or how to undo it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly packed sentences, front-loaded with the action and rationale, with zero filler. The trailing default-resolution note is short and useful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and a four-parameter mutation tool whose annotations already carry the safety profile, the description covers purpose, mechanism, consequence and the family default adequately. It stops short of describing the reversion/unfreeze story, which would matter for a tool that alters target watchdog behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds one meaningful default-resolution rule not in the schema: 'Family is taken from the debug profile MCU if omitted,' which tells the agent it can safely omit family. It adds nothing further about the peripherals list syntax or session semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb and resource ('Freezes peripherals (IWDG, WWDG, RTC, timers)') and names the exact mechanism (DBGMCU freeze registers) plus the concrete outcome ('watchdog cannot reset the target out from under the debugger'). An agent can immediately tell this apart from generic siblings like halt_execution or debug_config.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The tool's purpose implies its usage scenario (halting debugging sessions where watchdogs would otherwise reset the target), and the 'apply=false' dry-run path hints at a safe pre-check workflow. However, it never states when to reach for this versus siblings such as debug_config or debug_profile, nor any exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
continue_executionA
Resumes execution of the target device until the next breakpoint. Safe to call when the target is already running (reports already_running instead of erroring), so 'make sure it is running' is expressible.
| Name | Required | Description | Default |
|---|---|---|---|
| session | No | Optional debug-session name. Omit for the default target. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (non-destructive, non-readonly), and the description adds a valuable behavioral trait beyond them: calling while already running yields already_running rather than an error. It does not describe what happens at the breakpoint stop or return format, but adds real context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the core action and termination condition, followed by the useful edge-case behavior. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple execution-control tool with no output schema, the description covers action, scope, and the key edge case (already_running). It could mention interaction with breakpoints/stops, but is nearly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single optional 'session' parameter is fully documented in the schema (omit for default target). The description adds no parameter-level meaning beyond that, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (resumes execution), the resource (target device), and the termination condition (until the next breakpoint). This distinguishes it from step, run_for_duration, and run_to_line without needing to name them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete when-to-use pattern ('make sure it is running' is expressible) and clarifies the already-running case. It does not name or exclude alternatives like step or run_for_duration, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
coredumpC
Core-dump capture / load. action=capture(path) | load(path).
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Output path for the core file. | |
| action | Yes | Which operation to perform. | |
| session | No | Optional debug-session name. Omit for the default target. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already disclose read-only=false, idempotent=false, and destructive=false, so the safety profile is partially covered. The description adds nothing beyond that: it doesn't explain that capture writes a core file to 'path' while load reads from it (a key semantic difference), whether the target is halted, or what the session parameter affects. Given the mutation and non-idempotent hints, this is a notable gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single terse line with the purpose front-loaded and zero filler. The action/path shorthand borders on cryptic, but nothing is wasted, so it is efficient if minimal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutating, dual-mode operation with no output schema, the description omits what a core dump is, what capture does to the running target, how session interacts, and what the caller should expect back. The rich schema covers parameters but the behavioral context an agent needs to invoke this safely is largely missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The 'action=capture(path) | load(path)' notation restates the required parameter pairing already expressed by the oneOf schema and adds no format, default, or meaning beyond it; the crucial fact that 'path' is an output for capture but an input for load is left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Core-dump capture / load') and spells out the two operational modes via action values, so an agent immediately knows the tool captures or loads core dumps. It stops short of distinguishing this tool from near-neighbors like capture_state or snapshot, so it does not reach a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use or when-not guidance: nothing says when to capture versus load, whether a debug session must exist first, or which siblings are alternatives. The action notation shows the mechanics of invocation but gives no contextual selection criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
debug_configB
Debug-config file (.json) management. action=load(path) | save(path,config) | validate(config).
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Path to a YAML debug config file. | |
| action | Yes | Which operation to perform. | |
| config | No | Config object to save. | |
| session | No | Optional debug-session name. Omit for the default target. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false); the description adds little beyond that and never says save overwrites the destination file, whether writes are reversible, or what load/validate return. Worse, it labels the file '.json' while the schema describes 'Path to a YAML debug config file', a contradiction that can actively mislead an agent about the format.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight fragments, front-loaded with the resource and then the operations; nothing is padded. The only issue is accuracy, not verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description should explain what load and validate yield, but says nothing about return values, error behavior, or the role of the 'session' parameter. For a mutating, file-writing tool this leaves a significant gap for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, and the oneOf already encodes which parameters each action requires. The inline signatures (load(path), save(path,config), validate(config)) restate that mapping compactly but add no format or constraint detail, and the description omits the optional 'session' parameter entirely.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource (debug-config file) and enumerates the three concrete operations (load/save/validate) with their argument signatures, so an agent can tell what the tool does at a glance. It does not, however, differentiate itself from any sibling tool by name or scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Listing action=load(path) | save(path,config) | validate(config) implies which operation to pick for a given need, which is better than nothing, but there is no explicit when-to-use guidance, no prerequisites (e.g. session context), and no routing to alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
debug_profileA
Active debug profile (mcu/elf/svd/probe). action=get | set([mcu,elf_path,svd_path,board,probe,server_type,server_args,project_root,hub,notes,merge]). set merges at the TOP LEVEL ONLY: omitted fields keep their value, but a nested block you pass REPLACES the stored one whole — hub={map:{3:{label:TC}}} drops the rest of hub, including what hub(action=discover) wrote. merge=true deep-merges nested blocks instead; leave it off to DROP a stale entry, since replace is the only way to remove one. Returns the full resulting profile, which is in-memory only: empty again after the MCP server restarts.
| Name | Required | Description | Default |
|---|---|---|---|
| hub | No | Programmable USB hub binding: {port, serial, channel, map, power_cycle, guard}. channel is 1-based and selects which port this session's board sits on. | |
| mcu | No | ||
| board | No | ||
| merge | No | Deep-merge nested blocks (hub, rtt, uart, swo, reset, hil) into the stored ones instead of replacing them -- use it to add one key, e.g. a hub.map label, without dropping the identity hub(action=discover) wrote. Leave it off to replace, which is the only way to remove a stale entry. | |
| notes | No | ||
| probe | No | ||
| action | Yes | Which operation to perform. | |
| session | No | Optional debug-session name. Omit for the default target. | |
| elf_path | No | ||
| svd_path | No | ||
| server_args | No | ||
| server_type | No | ||
| project_root | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing top-level-only merge semantics, whole-block replacement of nested blocks, the concrete hub example of accidental data loss, and that the profile is in-memory only and empty again after a server restart. That last point is critical volatility context the annotations (readOnly=false, destructive=false, idempotent=false) do not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense and front-loaded, opening with the resource and actions before explaining merge semantics and the lifetime caveat. The hub example earns its place, though the 'replace is the only way to remove' point is restated, adding mild redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-output-schema tool it does state the return value ('full resulting profile') and covers the tricky merge/volatility behavior thoroughly. The gaps are the unexplained optional parameters (notably session) against 13 params at 31% coverage, so it is strong but not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With only 31% schema description coverage, the description carries much of the load: it enumerates the set-able fields and richly explains merge and hub. However, several parameters (session, board, notes, server_type/server_args) get no meaning beyond their names, so compensation is partial.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the resource (active debug profile) and the two operations (action=get | set) with the set-field list, so an agent knows it reads/writes the session's debug configuration. Sibling differentiation is weak, though: it does not explicitly separate itself from adjacent tools like debug_config, hub, or get_session.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear conditional guidance for the merge flag: enable it to add one nested key without dropping identity, leave it off to replace and thereby remove a stale entry. This is real when-to-use reasoning, though it stays at the parameter level and names no alternative tool for configuration.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
debug_untilA
One-call repro step: set an optional conditional/temporary breakpoint at a location, run, and return the stop event PLUS the decoded backtrace and innermost-frame locals. Collapses set_breakpoint + run + read frame/vars into a single round-trip.
| Name | Required | Description | Default |
|---|---|---|---|
| session | No | Optional debug-session name. Omit for the default target. | |
| location | Yes | Where to break, e.g. 'trigger_divzero' or 'main.c:21'. | |
| condition | No | Optional C condition, e.g. 'g_divisor == 0'. | |
| temporary | No | Auto-delete the breakpoint after the first hit (default true). | |
| timeout_sec | No | Max seconds to wait (default 10). | |
| ignore_count | No | Hits to ignore before stopping. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare safety profile (readOnly=false, destructive=false, idempotent=false), so the bar is lower. The description adds real value: it discloses the return payload (stop event, decoded backtrace, innermost-frame locals) and the temporary/conditional breakpoint behavior, which annotations alone don't convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the action, and the collapse rationale is a tight second clause. No padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly summarizes the return values (stop event, backtrace, locals). Reasonably complete for a repro tool; minor gap on error/timeout outcomes but not blocking.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all six parameters. The description reinforces 'optional conditional/temporary breakpoint' but adds little syntax or default detail beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb chain (set breakpoint, run, return stop event) on a specific resource (a location) and explicitly names what it collapses. An agent can distinguish it from breakpoint/run/read_call_stack siblings immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Frames usage as a 'one-call repro step' and names the three sibling operations it replaces (set_breakpoint + run + read frame/vars), giving clear context for selection. It does not explicitly exclude alternatives like run_to_line or run_and_wait, keeping it below a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
decode_peripheral_registerBRead-onlyIdempotent
Reads and decodes a peripheral register with SVD bitfield names and enumerated values.
| Name | Required | Description | Default |
|---|---|---|---|
| session | No | Optional debug-session name. Omit for the default target. | |
| register | Yes | Register name (e.g., 'MODER'). | |
| peripheral | Yes | Peripheral name (e.g., 'GPIOA'). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description usefully discloses the decoded output shape (bitfield names, enumerated values), but omits the key behavioral prerequisite that SVD data must be loaded for decoding to succeed, and says nothing about failure behavior when it is not.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler or repetition. It is appropriately sized for the tool's simplicity, though it could have spent a few more words on the load_svd dependency.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description does convey what the return value looks like (bitfields, enums), which is valuable. But for a tool sitting in a debug session, the missing mention of the SVD prerequisite and the unresolved overlap with read_peripheral_register leave meaningful gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the description adds no parameter-level detail beyond what the schema already documents (peripheral, register, optional session). Baseline 3 is appropriate since the schema carries the parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Reads and decodes a peripheral register') and adds the distinguishing detail that results carry SVD bitfield names and enumerated values, so it is clearly richer than a raw read. However, it never references the near-identical sibling 'read_peripheral_register', so an agent cannot tell the two apart from the description alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no prerequisites, and no named alternatives are given. The description does not say when decoding is preferable to the sibling read_peripheral_register, nor that an SVD must be loaded (via load_svd) before decoding works.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
describe_acceptanceARead-onlyIdempotent
Read the loaded AcceptanceSpec or the last verdict. what=summary (name + check counts), checks (full check list), or last_result (the most recent run_acceptance report).
| Name | Required | Description | Default |
|---|---|---|---|
| what | No | summary|checks|last_result (default summary). | |
| session | No | Target session id (default 'default'). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered. The description adds that it can read either a loaded spec or a previously produced verdict, but doesn't state what happens if no spec is loaded or which verdict (last run only?) is returned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the core action, then the mode breakdown. No filler; every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully describes the shape of each mode's result, and the schema covers the session parameter and its default. Only minor gaps remain, such as behavior when no spec is loaded, but the definition is sufficient to call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema lists the allowed 'what' values, but the description goes further by explaining what each value returns (summary = name + check counts, checks = full list, last_result = the run_acceptance report). That is genuine meaning beyond the schema's bare enum list.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Read) and resource (the loaded AcceptanceSpec or the last verdict), which immediately distinguishes it from load_acceptance (which loads a spec) and run_acceptance (which executes). It doesn't explicitly call out the siblings it is not, but the read-only framing is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: you call it to view the loaded spec or the most recent verdict. However there is no explicit when-to-use guidance or routing to alternatives (e.g. 'use this instead of run_acceptance when you only want to inspect'), so the agent must infer the context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
describe_boardARead-onlyIdempotent
Read the BoardDescription imported by import_netlist. what=summary (MCU + peripherals + counts), pins (full MCU pin map), nets, power (power/ground nets), or peripherals (distinct peripherals in use).
| Name | Required | Description | Default |
|---|---|---|---|
| what | No | summary|pins|nets|power|peripherals (default summary). | |
| session | No | Target session id (default 'default'). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is fully covered. The description adds the data-provenance fact (content originates from import_netlist), but nothing about session scoping, error behavior when no netlist was imported, or output size; with annotations carrying the load, a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence, front-loaded with the action and data source, then the option list. Slightly run-on, but every clause carries information and nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by describing what each view returns; annotations cover the safety profile and the schema covers both parameters. For a read-only describe tool, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description genuinely enriches the terse "summary|pins|nets|power|peripherals" enum by explaining what each view returns (e.g. summary = MCU + peripherals + counts, power = power/ground nets). The session parameter is left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb ("Read") plus a specific resource ("the BoardDescription imported by import_netlist"), and it enumerates the five selectable views. An agent can tell this apart from validate_board, inspect_project, or describe_framework without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the precondition clearly (this reads what import_netlist produced) and explains what each "what" value yields, which is the main selection decision an agent faces. It never names an alternative tool or a when-not condition, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
describe_frameworkARead-onlyIdempotent
Read the synthesized FrameworkPlan. what=summary (mcu + clocks + peripherals), clocks, gpio (per-pin config), peripherals (init blocks), init_order, or unresolved (the TODO holes that need target data or a design decision). Run design_framework first.
| Name | Required | Description | Default |
|---|---|---|---|
| what | No | summary|clocks|gpio|peripherals|init_order|unresolved (default summary). | |
| session | No | Target session id (default 'default'). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds genuine context beyond that: the plan is 'synthesized', it must follow design_framework, and the 'unresolved' view exposes TODO holes needing target data or a design decision.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the verb and resource, then the selectors, then the prerequisite last. Dense with parentheticals but every clause carries information; no filler sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description carries the return-value burden and does so by enumerating the report sections. It omits what happens if design_framework was never run (empty result vs error), which is the only notable gap for a two-parameter read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description goes further by explaining what each 'what' selector actually returns (summary = mcu + clocks + peripherals, gpio = per-pin config, peripherals = init blocks, unresolved = TODO holes), which is meaning the flat enum string in the schema does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb ('Read') plus a specific resource ('the synthesized FrameworkPlan'), and it enumerates the distinct views (summary, clocks, gpio, peripherals, init_order, unresolved) so an agent knows exactly what it gets. It differentiates itself from design_framework by naming it as a prerequisite, though it never distinguishes itself from render_framework.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Run design_framework first' gives an explicit ordering prerequisite, which is real usage context that prevents calling it before a plan exists. It stops short of stating when-not to use it or naming render_framework as an alternative for visual output.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
design_frameworkA
Synthesize a deterministic FrameworkPlan (Pillar D) from the session's imported board: which clocks to enable, how each pin must be muxed, and which peripheral init blocks to emit, in dependency order. Supply per-peripheral HAL .Init parameters via design={'USART1': {'baud': 115200, ...}} and optional AF numbers via af_map. Mandatory .Init members are auto-filled with HAL-standard defaults (a complete, valid init struct, not a half-initialized one) and a few are derived from the netlist (UART flow control from RTS/CTS pins, SPI NSS from an NSS pin); each field is tagged explicit/derived/default. Alternate-function numbers are also auto-derived from a pin-capability DB (db_path or the STM32_GDB_MCP_PIN_DB env) when its entries carry an 'af' field; an explicit af_map overrides the DB per pin. Anything that needs a human decision (baud, timer period, I2C timing) is surfaced as unresolved, never guessed. Import a netlist first (import_netlist).
| Name | Required | Description | Default |
|---|---|---|---|
| af_map | No | Optional alternate-function numbers: {line_or_family: {port_pin: {'USART1_TX': 7}}}. Overrides db_path per pin. | |
| design | No | Per-peripheral config, e.g. {'USART1': {'baud': 115200, 'word_length': 'UART_WORDLENGTH_8B'}}. | |
| db_path | No | Optional JSON pin-capability DB (CubeMX-derived); entries with an 'af' field auto-fill alternate-function numbers. | |
| session | No | Target session id (default 'default'). | |
| from_spec | No | Build from the session's imported product spec (import_spec) instead of, or merged under, an explicit design (explicit keys win). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Far beyond the annotations, it discloses auto-fill of mandatory .Init members with HAL defaults, derivation from the netlist (UART flow control, SPI NSS), explicit/derived/default tagging per field, AF auto-derivation from a pin DB, and precedence rules (explicit af_map overrides DB). It also states the safety-relevant policy that ambiguous fields are surfaced as unresolved rather than guessed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and output list are front-loaded in the first sentence, and each following sentence carries distinct information (parameter shapes, defaults, derivation, precedence). It is dense and slightly long, but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a five-parameter, nested-object tool with no output schema, the description covers purpose, prerequisites, parameter semantics, behavioral rules, and the shape of the produced plan (clocks, muxing, init blocks in dependency order). An agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all five parameters; the baseline is 3. The description adds genuine value on top, documenting the design and af_map shapes, the STM32_GDB_MCP_PIN_DB env fallback for db_path, and the merge/precedence semantics of from_spec.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb (Synthesize), resource (FrameworkPlan / Pillar D), and concrete outputs (clocks to enable, pin muxing, peripheral init blocks in dependency order), so an agent knows exactly what the tool produces. It also ties itself to the sibling import_netlist as a prerequisite, anchoring it in the workflow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly states the precondition ('Import a netlist first') and explains when to supply design/af_map versus relying on auto-fill, and how from_spec merges with explicit design. It does not explicitly contrast with sibling tools like describe_framework or render_framework, so routing between those is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
detect_probeARead-onlyIdempotent
Lists physical ST-Link, J-Link, and CMSIS-DAP probes currently connected over USB. Preserves serial numbers so multiple identical probes are never silently collapsed.
| Name | Required | Description | Default |
|---|---|---|---|
| session | No | Optional debug-session name. Omit for the default target. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered. The description adds a concrete behavioral trait beyond annotations: it preserves serial numbers so identical probes are not collapsed, which is important for identifying multiple devices. It does not cover return format or error cases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly written sentences, front-loaded with the action and resource, with no filler. Every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple detection tool with one optional parameter and no output schema, the description conveys the essential purpose and a key output guarantee (serial-number preservation). It could say more about the returned format (e.g., list of serials/names), but the annotation set covers safety and the tool's scope is clear.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single optional 'session' parameter is documented in the schema ('Optional debug-session name. Omit for the default target.'). The description adds no additional meaning about the parameter. Baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Lists') and resource ('physical ST-Link, J-Link, and CMSIS-DAP probes currently connected over USB'), and adds the serial-number preservation guarantee that differentiates it from a generic list tool. The scope is unambiguous and no sibling performs the same action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides no when-to-use guidance, prerequisites, or alternatives. It does not say whether to call this before starting a debug session or how it relates to tools like start_debug_session or self_check. Implied usage only.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
detect_rtosARead-onlyIdempotent
Detects whether FreeRTOS symbols are available in the current GDB session.
| Name | Required | Description | Default |
|---|---|---|---|
| session | No | Optional debug-session name. Omit for the default target. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and closed-world behavior, so the safety profile is covered. The description adds session scoping but does not describe return shape, failure behavior, or prerequisites beyond that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. It communicates the essential purpose immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple detection tool, the purpose plus schema and annotations are nearly sufficient; the boolean-style result is implied by 'detects whether.' However, it does not explicitly state the return form or behavior when no session exists, leaving minor gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the sole optional session parameter is fully documented in the schema. The description adds no extra meaning beyond what the schema already provides, so the baseline is 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: detect FreeRTOS symbol availability. The scope, 'current GDB session,' makes it clearly distinct from siblings such as read_freertos or session diagnostics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description says what the tool does but not when to use it instead of alternatives like read_freertos or detect_probe. There is no explicit when-to-use, when-not-to-use, or prerequisite guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
diagnose_faultBRead-onlyIdempotent
Reads and decodes Cortex-M fault registers into likely fault causes.
| Name | Required | Description | Default |
|---|---|---|---|
| session | No | Optional debug-session name. Omit for the default target. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is fully covered by structured data. The description adds that the output is an interpreted result ('likely fault causes') rather than raw register dumps, which is genuinely useful, but it omits any precondition about the target being halted in a fault state and does not describe what is read.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero filler; every word (verb, resource family, output type) earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must carry the return-value burden, and it only gestures at the output ('likely fault causes'). It also omits the crucial precondition that a fault condition exists to diagnose. Adequate but with clear gaps for a diagnostic tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single optional 'session' parameter, so the schema already explains the omit-for-default behavior. The description adds no additional semantics about the session parameter, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb pair (reads and decodes) and a specific resource (Cortex-M fault registers), plus the derived output (likely fault causes). The scope is clear, but it does not distinguish itself from close siblings such as reconstruct_fault_context or coredump, so an agent cannot route between them from the text alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisite (e.g. target halted due to a fault), and no mention of alternatives like reconstruct_fault_context or session_diagnostics. The agent is left to infer the diagnostic context entirely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
disassembleCRead-onlyIdempotent
Disassembles N instructions at a location (default $pc).
| Name | Required | Description | Default |
|---|---|---|---|
| session | No | Optional debug-session name. Omit for the default target. | |
| location | No | Where to disassemble from (default '$pc'). | |
| instructions | No | Number of instructions (default 8). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, covering the safety profile. The description adds default values ($pc, N) that are already in the schema, but no behavioral context beyond what structured fields provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence with zero waste. It states the action, count, and default location efficiently, though it could benefit from marginally more structure to aid selection among siblings.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool whose annotations cover safety and whose schema is fully described, the description is minimally adequate. However, it lacks any usage context or differentiation from many similar debug siblings, leaving selection ambiguous.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents all three parameters. The description repeats the default location ($pc) and instruction count concept, adding no new meaning. Baseline 3 is appropriate when the schema carries the explanatory load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Disassembles') and resource ('instructions') with scope ('N instructions at a location'). Clear what the tool does, but does not distinguish itself from sibling debug tools like step, read_memory, or read_call_stack.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides no when-to-use guidance, no alternatives, and no prerequisites. The agent is left to infer context from the name alone among many debug-oriented siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_debug_reportA
Writes a single self-contained JSON report (journal + metrics + profile, optionally a state snapshot and a coredump) tied to the run-id, so a bug session is fully reproducible and shareable from one artifact.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Output path for the report JSON. | |
| session | No | Optional debug-session name. Omit for the default target. | |
| coredump_path | No | If set, capture a coredump there and reference it in the report. | |
| include_snapshot | No | Capture and embed a debug snapshot (requires a halted target). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare write (readOnlyHint=false), non-destructive, non-idempotent, non-open-world, so the safety profile is already covered. The description adds genuine context beyond them: that it produces one self-contained artifact tied to the run-id and can optionally embed a snapshot and a coredump. It omits any note on disk/permission requirements or cost of capturing a coredump.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence that front-loads the action and artifact, then qualifies the optional components. Every phrase earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a write tool with no output schema, the description adequately explains what is produced and where it is anchored (run-id). It could say more about what the report enables next or any preconditions, but nothing critical for calling it is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all four parameters including the 'requires a halted target' constraint on include_snapshot. The description confirms the optional snapshot/coredump nature but adds no syntax or format detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Writes') and resource ('a single self-contained JSON report') and enumerates the composite content (journal + metrics + profile, optionally snapshot and coredump), which distinguishes it from siblings like snapshot, coredump, and session_diagnostics. It does not explicitly name a sibling it replaces, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The clause 'so a bug session is fully reproducible and shareable from one artifact' implies the use case (packaging a bug session for sharing), but there is no explicit when-to-use vs when-not guidance and no named alternative such as snapshot or coredump for narrower needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
expressionsA
Evaluate C/GDB expressions. action=assert(assertions) | capture([expressions,table]) | compare(expressions,action). assertions=[{expression,expected[,operator]}]; table={index_range,columns}; compare runs 'action' between the two captures.
| Name | Required | Description | Default |
|---|---|---|---|
| table | No | Optional indexed table request, e.g. columns=['count'], index_range=[2,6]. | |
| action | Yes | Which operation to perform. | |
| session | No | Optional debug-session name. Omit for the default target. | |
| assertions | No | ||
| expressions | No | GDB/C expressions to evaluate. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, idempotentHint=false, so the agent knows this is not a pure read, yet the description never explains what state it mutates or what permissions/conditions are required. It does disclose one meaningful behavioral fact beyond the annotations: compare 'runs action between the two captures', i.e. it can drive execution (consistent with the step/continue/halt enum), which is genuinely valuable context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then compressed into pipe-delimited signatures; every clause carries content. It is dense and telegraphic rather than verbose, though the trailing 'compare runs action between the two captures' restates what the signature already implies.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter tool with nested objects and no output schema, the description covers action, assertions, table, and expressions but omits the 'session' parameter entirely and says nothing about what results are returned. Adequate for the main action flows, incomplete for the full surface.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With ~80% schema coverage the baseline is 3, and the description earns an extra point by spelling out the per-action argument shapes: assertions=[{expression,expected[,operator]}], table={index_range,columns}, and the action list for compare. This maps parameters to intent more directly than the schema's raw object definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Evaluate C/GDB expressions') and enumerates the three operations it actually performs (assert/capture/compare), so its scope is legible. However, it never distinguishes itself from sibling evaluation tools like read_variable, read_memory, or read_registers, leaving the agent to infer the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The action signatures implicitly communicate what each mode is for (assert compares to expected, capture snapshots, compare diffs two captures), which is usable guidance. But there is no explicit when-to-use/when-not statement and no routing to alternative tools for plain variable reads.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flash_and_runADestructive
One-call bring-up: flash an ELF (loads symbols), reset-halt, set a temporary breakpoint at an entry point (default 'main'), run to it, and return the decoded stop context. With hub_channel (or usb_location) and no session running, it starts one pinned to that probe first -- so 'flash the firmware on channel 4' is this single call, on a bench with several probes, without disconnecting any of the others.
| Name | Required | Description | Default |
|---|---|---|---|
| mcu | No | Passed through when this call starts the session; falls back to the profile. | |
| run_to | No | Entry point to stop at (default 'main'). | |
| session | No | Optional debug-session name. Omit for the default target. | |
| file_path | Yes | Path to the ELF to flash. | |
| hub_channel | No | Start a session on the probe at this hub channel first, if none is running. Uses the usb_location recorded for it in the profile's hub.map. Ignored when a session is already live -- it flashes through that one. | |
| timeout_sec | No | Max seconds to wait (default 10). | |
| usb_location | No | Same, but naming the USB position directly, e.g. '1-1.4'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag the tool as destructive, non-read-only, and non-idempotent. The description adds substantial context: the internal sequence (load symbols, reset-halt, temporary breakpoint, run to entry, return decoded stop context) and session-pinning logic, including that hub_channel is ignored when a session is already live.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core operation. The second sentence is dense but delivers non-redundant session behavior; no wasted words, though a more structured presentation could improve readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex, multi-step tool with no output schema, the description covers the purpose, action sequence, session selection, and return value ('decoded stop context'). All required parameters are documented in the schema, and nothing critical for correct invocation appears missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all seven parameters, including defaults for run_to ('main') and hub_channel behavior. The description reinforces the default entry point and session logic but does not add syntax, format, or examples beyond what the schema provides, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific composite verb+resource ('one-call bring-up: flash an ELF... reset-halt, set breakpoint, run...') and explicitly frames it as a single call that replaces multiple steps. It distinguishes itself from single-operation siblings like flash_firmware or reset_target by emphasizing the combined workflow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear usage context: with hub_channel or usb_location and no session running, it starts a session pinned to that probe, and it does not disconnect other probes. However, it does not explicitly name alternatives (e.g., call flash_firmware then reset_target) or state when not to use this tool, so guidance falls short of the top score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flash_eraseADestructive
Erases a flash range on the target (OpenOCD 'flash erase_address pad'), rounding out to the driver's erase-sector boundaries. The recovery tool for a board that will not boot: clearing a corrupt OTA journal, a stale boot descriptor, or a half-written image. Requires an explicit address AND length — there is deliberately no mass-erase default.
| Name | Required | Description | Default |
|---|---|---|---|
| length | Yes | Bytes to erase. Rounded UP to the erase-sector boundary. | |
| verify | No | Read back the first 64 bytes and confirm they hold this part's erased value — 0x00 on STM32L0/L1, 0xFF elsewhere, taken from the profile MCU (default true). | |
| address | Yes | Start address, e.g. '0x08016000'. Rounded DOWN to the erase-sector boundary. | |
| session | No | Optional debug-session name. Omit for the default target. | |
| sector_size_bytes | No | Erase-sector size of this part (e.g. 4096 on STM32L1, up to 131072 on F4). Give it and the write guard checks the padded range that is really erased; omit it and the guard can only check the range you asked for. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive=true and idempotent=false, so the safety profile is covered. The description adds real context beyond that: the driver-boundary rounding behavior, the deliberate absence of a mass-erase default, and the recovery framing. It does not describe failure/abort behavior or what the call returns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core action, then use case, then the key constraint. The OpenOCD parenthetical adds precision without padding; nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, non-idempotent tool with no output schema and annotations covering safety, the description supplies purpose, trigger scenarios, required-arg expectations, and boundary/verify behavior. The only gap is the absence of any statement about the outcome or failure modes after erasing, but the verify parameter partially compensates.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents length/address rounding, verify, session, and sector_size. The description only reinforces that both address and length are mandatory and explains the design rationale ('deliberately no mass-erase default'); it adds no per-parameter meaning beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Precise verb+resource: 'Erases a flash range on the target,' reconciled with the OpenOCD 'flash erase_address pad' primitive. The scope ('rounded out to the driver's erase-sector boundaries,' 'no mass-erase default') is distinct from flash_firmware/write_memory, which write rather than erase an arbitrary range.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clear when-to-use context: 'The recovery tool for a board that will not boot,' with three concrete scenarios (corrupt OTA journal, stale boot descriptor, half-written image). It gives strong positive guidance but does not explicitly name an alternative tool or an exclusion condition relative to siblings like flash_firmware.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flash_firmwareADestructive
Flashes a compiled firmware binary to the target. Accepts GCC .elf or Keil .axf. By default it then resets and RUNS the firmware (Keil-style 'Load + Run'). Pass reset_run=false to flash only (e.g. to set breakpoints before the firmware starts). Refuses (elf_layout_unsupported) an image GDB would flash incompletely, such as a Keil ARMCC5 AXF whose RW initializer lies outside its segment; flash its fromelf BIN instead.
| Name | Required | Description | Default |
|---|---|---|---|
| session | No | Optional debug-session name. Omit for the default target. | |
| file_path | Yes | Absolute path to the compiled firmware file (e.g. .elf/.axf). | |
| reset_run | No | Reset and run after flashing (default true). False = flash only, leave halted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and non-idempotence; the description adds substantial behavior beyond that: default post-flash reset-and-run, the option to leave the target halted, and a named refusal mode (elf_layout_unsupported) with the workaround. It stops short of describing timing, session state effects, or how a failure leaves the target.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and each subsequent sentence carries new information (formats, default run, opt-out, refusal workaround). Slightly dense and dependent on parenthetical device-tool jargon, but no wasted sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, non-idempotent single-parameter-ish operation with no output schema, the description covers the action, the default side effect, the opt-out, and one notable failure mode with an alternative. Adequate without over-explaining return values.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds real meaning beyond the schema: why reset_run=false matters (breakpoint setup), what the omitted session defaults to, and which formats file_path accepts. Useful context without re-documenting syntax.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Flashes) and resource (compiled firmware binary) plus supported input formats (.elf/.axf). An agent can immediately tell this is the flash-and-execute path rather than the sibling flash_erase or verify_flash tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear conditions for the reset_run=false variant ('to set breakpoints before the firmware starts') and for using a fromelf BIN instead of an AXF. It does not explicitly contrast itself with the sibling flash_and_run, so routing between those two is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
frameARead-onlyIdempotent
Stack-frame navigation. action=select(level) | source([location,count]) | variables([level,include_raw]). level 0 is the innermost frame.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | Approximate number of lines (default 10). | |
| level | No | Frame level, 0 is the innermost/current frame. | |
| action | Yes | Which operation to perform. | |
| session | No | Optional debug-session name. Omit for the default target. | |
| location | No | Where to list around. Omit to continue from current. | |
| include_raw | No | Include the raw GDB transcript (default false). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds the useful semantic that level 0 is the innermost frame, but says nothing about return format or how 'source/variables' continue from current context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense, front-loaded sentences with zero filler. The action/param map is compressed into a single readable line and the key semantic constraint is appended last.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 6 fully documented params and a oneOf schema, and no output schema required, the description covers the shape of all three operations adequately. It stops short of explaining what each action returns, but the schema carries the rest.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real value by mapping which parameters belong to which action (select→level, source→location/count, variables→level/include_raw), which is not obvious from the oneOf structure alone. The 'level 0 is innermost' note also clarifies the most important enum-adjacent parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (stack frames) and enumerates the three operations (select/source/variables), so an agent knows this is stack-frame navigation rather than a stack dump. It does not explicitly differentiate from close siblings like read_call_stack or analyze_stack, which would push it higher.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The action breakdown implies when each operation applies (choose level, view source, inspect variables), but there is no explicit guidance on when to prefer this tool over read_call_stack, analyze_stack, or step. Usage is inferable but not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sessionARead-onlyIdempotent
Returns this session's record by view: 'journal' (every tool call with args/ok/summary/duration; supports limit), 'timeline' (compact human-readable replay), or 'metrics' (per-tool call counts, success/failure, durations).
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | Which view (default journal). | |
| limit | No | journal: return only the most recent N entries. | |
| session | No | Optional debug-session name. Omit for the default target. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly=true, idempotent=true, non-destructive=false, so the safety profile is covered. The description adds substantive value by detailing what each view returns (args/ok/summary/duration for journal, per-tool counts and durations for metrics), which is meaningful behavioral context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence with the resource and view breakdown, no filler. It is dense and readable, though the parenthetical enumeration is heavy enough that a slightly more structured form might scan faster.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of explaining return values, and it does so for all three views. Remaining gaps (pagination/ordering beyond 'most recent N', session default behavior) are minor for a read-only introspection tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the enum values and limit semantics are already documented. The description nonetheless enriches the view parameter by explaining the distinct content of each mode and notes that limit applies specifically to journal, adding meaning the bare schema descriptions do not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (returns) and resource (this session's record) and immediately enumerates the three views with what each yields. An agent can distinguish it from list_sessions (which enumerates sessions rather than reading one session's contents) without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The view names imply which one to pick for a given goal, but the description never states when to use get_session versus alternatives like session_diagnostics, list_sessions, or export_debug_report, nor when a view is preferable. Usage is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
halt_executionC
Interrupts/halts the target device execution.
| Name | Required | Description | Default |
|---|---|---|---|
| session | No | Optional debug-session name. Omit for the default target. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, non-destructive, non-idempotent operation, covering the safety profile. The description adds nothing beyond the verb: it does not say whether execution state is preserved, whether the halt is resumable via continue_execution, or how it interacts with breakpoints or running scenarios. It does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence with no filler and the action front-loaded. It is appropriately sized, though it is thin rather than efficient—the brevity comes partly from omission of useful context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-optional-parameter mutation with annotations present and no output schema, the description is minimally adequate. It still leaves the agent unsure about resumability and the operational effect of halting relative to sibling stop/reset tools, which a one-line addition could resolve.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With a single optional parameter and 100% schema description coverage, the schema already fully explains the session argument ('Omit for the default target'). The description adds no extra meaning, which is the expected baseline when the schema carries the parameter burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action (interrupts/halts) on a specific resource (target device execution), so the core purpose is unambiguous. However, it does nothing to distinguish itself from closely related siblings like continue_execution, stop_debug_session, reset_target, or wait_for_stop, leaving the agent to infer the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this versus alternatives such as stop_debug_session (session teardown) or reset_target (restart). No prerequisites, no follow-up guidance (e.g., whether continue_execution can resume afterward), and no exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hubADestructive
Programmable USB hub: per-port power, USB2 data lines, cold boot, and V/I sampling. action=describe | power(state[,channel,confirm]) | data(state[,channel,exclusive,confirm]) | cycle([channel,off_ms,settle_ms,confirm]) | measure([channel,duration_sec,interval_sec,all_channels]) | discover([apply,force,settle_sec]) | dashboard([state,port,interval_sec,open_browser]). dashboard serves a read-only live web page on 127.0.0.1 and returns its URL. state=on|off; channel is 1-based and defaults to the session's mapped hub channel. Removing port power cold-boots that board and un-enumerates its probe.
| Name | Required | Description | Default |
|---|---|---|---|
| port | No | HTTP port on 127.0.0.1 (default 8765). | |
| apply | No | Write the discovered map into the debug profile. | |
| force | No | Run even though a GDB server is alive on this session. | |
| state | No | Target state for the port. | |
| action | Yes | Which operation to perform. | |
| off_ms | No | Milliseconds to hold power off (default 400). | |
| channel | No | 1-based hub channel. Defaults to the session's mapped hub channel. | |
| confirm | No | Required to cut power/data when the guard is in confirm mode or a session is live. | |
| session | No | Optional debug-session name. Omit for the default target. | |
| exclusive | No | With state=on, disconnect every other port's data line. | |
| settle_ms | No | Milliseconds to wait after restoring power (default 1500). | |
| settle_sec | No | Seconds to wait for USB re-enumeration per toggle (default 1.0). | |
| all_channels | No | Sample every channel instead of just one. | |
| duration_sec | No | Sampling window; 0 (default) takes one snapshot. | |
| interval_sec | No | Delay between samples (default 0.05). | |
| open_browser | No | Also open the page in the default browser. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true / not readOnly, so the bar is lower, yet the description still adds real behavioral context: cutting port power cold-boots the board and un-enumerates its probe, the dashboard is a read-only live page on 127.0.0.1 whose URL is returned, and 'confirm' guards power/data cuts when a session is live. It stops short of stating permission/rate-limit or expected failure behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the tool's identity, then compresses all seven action signatures into one dense line, then adds two short behavioral sentences. Nearly every clause carries information, though the signature list is terse enough to require careful reading.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-action, 16-parameter mutation tool with no output schema, the description covers the action set, key defaults (channel mapping, state values), the dashboard return value, and the destructive cold-boot consequence. It omits returns for most non-dashboard actions and any sequencing guidance, so it is strong but not exhaustive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so every parameter is already documented in the schema, and the inline action(...) signatures largely restate that mapping. The description does reinforce that channel is 1-based and defaults to the session's mapped channel, but adds little syntax or default information beyond what the schema already carries. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a concrete verb+resource scoping ('Programmable USB hub: per-port power, USB2 data lines, cold boot, and V/I sampling') and then enumerates the seven actions with their signatures, so an agent immediately knows this is a hardware power/data control surface rather than a debug-inspection tool. It is clearly distinguishable from the surrounding debug/flash siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The action list implies the usage of each operation, and the note that 'Removing port power cold-boots that board and un-enumerates its probe' hints at when power cycling is appropriate. But there is no explicit when-to-use vs when-not-to-use guidance, no ordering advice among actions (e.g., discover before power), and no pointer to alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_netlistA
Parse a schematic netlist (KiCad .net today) into a machine-readable BoardDescription: the MCU part/family/line, a per-pin map (package pin -> port pin -> net -> inferred peripheral function), and the power/ground nets. This is the input contract for automated framework design. Pass 'path' or 'text'. The result is stored on the session; read views with describe_board.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Path to a netlist file (e.g. board.net). | |
| text | No | Netlist contents inline (alternative to path). | |
| format | No | Netlist format: auto (default), kicad, altium (Protel .NET), orcad (pstxnet.dat) or csv (generic pin-map). | |
| db_path | No | Optional JSON pin-capability DB; when given (or STM32_GDB_MCP_PIN_DB is set), pins are resolved physically (package position -> port pin, AF corroboration). | |
| session | No | Target session id (default 'default'). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=false; the description justifies the write by disclosing that 'the result is stored on the session', which explains the mutation and how to retrieve it. It also notes the optional pin-capability DB enables physical pin resolution, adding context beyond the annotations, though it does not discuss failure behavior or idempotency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly packed sentences with zero filler; the core purpose and output shape come first, then input options, then the read-view pointer. Every sentence carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by enumerating the return structure (MCU part/family/line, pin map, power nets) and pointing to describe_board for views, and it covers the session-storage side effect. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds value: it frames path/text as mutually exclusive inputs and explains that db_path (or the STM32_GDB_MCP_PIN_DB env var) triggers physical pin resolution with AF corroboration — behavior the schema does not spell out.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (parse) and resource (schematic netlist, KiCad .net) and precisely characterizes the output (BoardDescription: MCU part/family/line, per-pin map, power/ground nets). It is clearly distinguishable from siblings like describe_board, which it names as the read-side counterpart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly frames the tool as 'the input contract for automated framework design', tells the agent it may pass either 'path' or 'text', and routes it to describe_board for reading results. It lacks explicit when-not conditions or alternatives for other import paths (e.g., import_spec), so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_specA
Translate a controlled-vocabulary product spec (human/product terms) into the per-peripheral design params design_framework consumes, and cross-check it against the imported netlist. This is the upstream guard the pipeline lacked: instead of hand-writing HAL macros, supply intent -- UART framing '8N1', direction 'txrx', flow_control 'rtscts'; SPI role 'master', spi_mode 0..3, data_size, bit_order; I2C speed 'fast', addressing '7bit'; ADC resolution 12, conversion 'continuous'; a timer update_hz; plus dma / interrupt / priority opt-ins -- and the machine expands it deterministically (8E1 -> UART_WORDLENGTH_9B + UART_PARITY_EVEN, honoring HAL's parity-bit-in-word-length rule). A peripheral named in the spec but absent from the netlist is a conflict; an intent key or value the machine does not model is surfaced as unresolved -- never guessed. Then design_framework(from_spec=true) builds the plan from the translated params. Import a netlist first so the spec is cross-checked.
| Name | Required | Description | Default |
|---|---|---|---|
| spec | No | Per-peripheral intent, e.g. {'USART1': {'baud': 115200, 'framing': '8N1', 'direction': 'txrx'}, 'ADC1': {'resolution': 12, 'conversion': 'continuous', 'dma': true}}. | |
| session | No | Target session id (default 'default'). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare this is a mutation (readOnlyHint=false) that is non-destructive and non-idempotent. Beyond that, the description adds real behavioral context: deterministic expansion, a named-but-absent peripheral being a 'conflict,' unmodeled intent surfaced as 'unresolved -- never guessed.' It stops short of describing the returned conflict/unresolved payload, but it substantially enriches the annotation profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and workflow, and the prerequisite/downstream sequencing bookends the text well. It is dense with examples and slightly verbose, but nearly every clause conveys new vocabulary or behavior rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutating tool with no output schema, the description covers the translation contract, conflict/unresolved handling, prerequisite import, and downstream consumption. It does not state the exact response shape (e.g., what the unresolved/conflict report looks like), which is the main residual gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description goes beyond the schema's single example, enumerating the accepted vocabulary per peripheral type (framing, direction, flow_control, spi_mode, data_size, resolution, conversion, update_hz, dma/interrupt/priority opt-ins) and the HAL expansion rule. This meaningfully clarifies the opaque 'spec' object.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: translate a controlled-vocabulary product spec into per-peripheral design params and cross-check against the netlist. It explicitly distinguishes itself from its siblings import_netlist (prerequisite) and design_framework (downstream consumer), so an agent can tell them apart without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit ordering: 'Import a netlist first so the spec is cross-checked,' and names the downstream call 'design_framework(from_spec=true) builds the plan from the translated params.' The when-to-use context and the alternative route are both stated, leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspect_projectBRead-onlyIdempotent
Discovers firmware project artifacts such as ELF, map, linker script, SVD, and STM32CubeMX .ioc metadata.
| Name | Required | Description | Default |
|---|---|---|---|
| session | No | Optional debug-session name. Omit for the default target. | |
| project_root | No | Project directory to scan. Uses debug profile project_root if omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the safety and side-effect profile is fully covered. The description adds that this is a scanning/discovery operation over project artifacts, but says nothing about whether results are cached into session state, whether it re-scans each call, or how it interacts with the optional debug session.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler or repetition. It is tight and readable, though it is arguably too terse for a tool whose output shape is undocumented.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of explaining what a caller gets back, and it only vaguely implies a list of discovered artifacts without stating the return shape, grouping, or failure behavior when nothing is found. Annotations cover the safety side, so the remaining gap is moderate rather than severe.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and both parameters (session, project_root) have their defaults and fallback behavior documented in the schema itself. The description mentions no parameters at all, so it adds no meaning beyond the schema — baseline 3 is correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ("Discovers") and resource ("firmware project artifacts") and enumerates concrete examples (ELF, map, linker script, SVD, .ioc). However, it never distinguishes itself from siblings that also ingest project artifacts such as load_svd, load_device_pack, or load_symbols, so the agent must guess which discovery tool applies to a given need.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no indication of when to call this tool, when not to, or what alternative covers a related need. The only hint is the implied "discovery/first step" framing, which the agent must infer from the word 'Discovers' alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspect_symbolARead-onlyIdempotent
Symbol / type introspection. what=size(expr) | type(expr) | address(symbol) | resolve(expr) | functions([regex]) | variables([regex]). resolve maps an address back to source, returning {resolved,symbol,offset,section,file,line}; resolved=false means no symbol there.
| Name | Required | Description | Default |
|---|---|---|---|
| expr | No | Type or expression to size, e.g. 'struct foo'. | |
| what | Yes | Which operation to perform. | |
| regex | No | Optional regex to filter function names. | |
| symbol | No | Symbol name, e.g. 'g_state'. | |
| address | No | Alias for 'expr'. | |
| session | No | Optional debug-session name. Omit for the default target. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so safety is covered. The description adds genuinely new behavioral context by documenting the return shape of resolve ({resolved,symbol,offset,section,file,line}) and the meaning of resolved=false, which matters because there is no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly packed sentences with the general purpose stated first, then the operation-to-argument mapping, then the one non-obvious return contract. The terse notation is efficient and front-loaded, though it is dense enough that it reads more like a reference line than prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With six operations and no output schema, an agent needs return-shape information for each mode, but only resolve is documented; it is unclear what size, type, address, functions or variables return. The tool's purpose and argument mapping are complete, but the return contract is only partially covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3, but the description adds real value beyond it by binding each operation to its expected argument — size(expr), type(expr), address(symbol), functions([regex]) — clarifying which of the six parameters pairs with which what value. The bracket notation on regex also communicates that it is an optional filter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific capability ('Symbol / type introspection') and enumerates all six operations via the what= syntax, so an agent immediately knows this is a symbol/type query tool rather than a memory or register reader. It does not explicitly name which siblings to prefer (read_variable, expressions, load_symbols), so sibling differentiation is only implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The operation list implies what each mode is for (size/type/address/resolve/functions/variables), which is more than nothing, but there is no explicit when-to-use vs when-not guidance and no named alternatives among the many sibling introspection tools. Usage must be inferred from the operation names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_sessionsARead-onlyIdempotent
Lists all debug target sessions (the 'default' one plus any named) with their liveness and port. To debug MULTIPLE boards at once, pass a 'session' argument (any string) to any tool — e.g. start_debug_session(session='rackA', ...) — and each gets fully isolated state.
| Name | Required | Description | Default |
|---|---|---|---|
| session | No | Optional debug-session name. Omit for the default target. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety bar is low. The description adds real behavioral context beyond that: what the result contains (liveness and port), the existence of a 'default' session alongside named ones, and the per-session isolation guarantee. No return-format or failure behavior is described, keeping it out of 5 territory.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly written sentences, with the core behavior front-loaded and the multi-board tip second. The second sentence is arguably about other tools rather than this one, but it earns its place by explaining the session argument the agent will reuse everywhere.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-required-param, read-only listing tool with annotations covering the safety profile and no output schema, the description covers what is returned (liveness, port) and the naming model. Nothing essential for calling it correctly is missing; only failure/empty-list behavior is unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description nevertheless adds non-obvious semantics: the session name may be any arbitrary string and each name yields fully isolated state, which the schema's one-line description does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Lists all debug target sessions') and adds scope detail — the default plus any named — plus what each entry shows (liveness and port). It does not name the closest sibling (get_session) for a single-session lookup, so differentiation is implicit rather than explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The second sentence explains the multi-session model and how to pass 'session' to any tool, which is genuinely useful context. But it never says when to call list_sessions versus get_session, session_diagnostics, or recover_session, so the guidance for choosing this tool is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
load_acceptanceA
Load a machine-checked AcceptanceSpec (product-spec → deterministic checks) from an inline 'spec' object or a JSON 'path'. Checks: memory_u32 (any memory-mapped register), variable (C global), core_register, no_fault, stopped_at (PC in a symbol). Stored on the session; evaluate with run_acceptance.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Path to a JSON AcceptanceSpec (alternative to 'spec'). | |
| spec | No | Inline AcceptanceSpec {name, description, checks:[...]}. | |
| session | No | Target session id (default 'default'). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnly=false, destructive=false, idempotent=false), so the bar is lower. The description adds real context beyond them: state is persisted ('Stored on the session') and the spec's check vocabulary is enumerated, which aids correct authoring. It omits error/failure behavior and permission needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and sources, then the check vocabulary. Dense but every clause earns its place; the check-type enumeration is long yet genuinely informative for authoring a spec.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, and the safety profile is covered by annotations. The description supplies the source format, the check vocabulary, and the follow-up call, which is sufficient for a loader. Missing only failure/return-format details, which is minor here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the baseline is 3, but the description adds the explicit either/or relationship between the two sources ('inline spec object or a JSON path'), which is meaningful semantics the schema only states separately. No syntax detail for the check schema beyond the type list.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Load) and resource (AcceptanceSpec), clarifies what the spec represents (product-spec → deterministic checks), enumerates the supported check types, and distinguishes itself from run_acceptance by naming evaluation as the next step. An agent can tell it apart from siblings like import_spec and synthesize_acceptance.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies the workflow (load here, then evaluate with run_acceptance), which is useful. However, it never states when to prefer this over near-siblings such as import_spec or synthesize_acceptance, and provides no prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
load_device_packA
Register a verified device-fact pack (Pillar F) so the deterministic solvers cover a new STM32 family: its DMA request routing, irregular NVIC vectors, clock PLL profile, and timer bus/width. Facts are DATA, never guessed -- STM32F4/L4 ship built-in; add a family by supplying a validated pack (schema 'stm32-device-pack/v1') via path= (a JSON file) or inline pack=. Call with no arguments to report current coverage. Honest by design: a malformed pack is rejected with the list of problems and never half-loaded; shadowing a built-in family needs allow_override=true.
| Name | Required | Description | Default |
|---|---|---|---|
| pack | No | Inline device-pack object (takes precedence over path). | |
| path | No | Path to a device-pack JSON file to load and register. | |
| session | No | Optional debug-session name. Omit for the default target. | |
| allow_override | No | Permit shadowing a built-in family pack (default false). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the write/repeat safety profile; the description adds substantive behavior: malformed packs are rejected with a problem list, never half-loaded, and shadowing a built-in family is gated behind allow_override=true. That is exactly the extra context the annotations do not carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first clause, followed by coverage facts, input modes, and failure semantics in a tight block. Slightly dense and the 'Facts are DATA, never guessed' phrasing is rhetorical rather than operational, but every other sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description covers return behavior (rejection with problem list, coverage report on no-arg call) and the override prerequisite. An agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the description's parameter remarks (path as JSON file, inline pack precedence, override gating) largely restate what the schema already documents. It adds no syntax or format detail for session, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Register a verified device-fact pack') and names the exact content it controls (DMA request routing, NVIC vectors, PLL profile, timer bus/width), which distinguishes it from sibling loaders like load_svd or describe_board. An agent can tell what this does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the trigger (adding a new STM32 family beyond the built-in F4/L4), the two input modes (path= JSON file or inline pack=), and a no-argument mode that reports current coverage. It lacks explicit when-not-to-use guidance or a named alternative, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
load_svdC
Loads an SVD file for peripheral parsing.
| Name | Required | Description | Default |
|---|---|---|---|
| session | No | Optional debug-session name. Omit for the default target. | |
| filepath | Yes | Path to the .svd file. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false, destructiveHint=false and openWorldHint=false, so the agent knows this mutates state without being read-only or repeatable. The description adds no behavioral context beyond that: it doesn't say the loaded SVD is attached to the session, what happens to a previously loaded SVD, or how invalid/missing files are handled.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler or redundancy. It is efficient, though the extreme brevity is the root of the gaps noted in other dimensions rather than a structural flaw.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a non-read-only state-mutating tool with no output schema, the description omits what the load actually affects (session-scoped vs global), persistence across sessions, and failure behavior. An agent cannot tell from this text alone how the operation changes system state.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both 'session' and 'filepath' documented in the schema itself, so the baseline is 3. The description adds no meaning beyond the schema (e.g., path resolution rules or what the default target means).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Loads) and resource (SVD file) plus the downstream purpose (peripheral parsing), which is more informative than a bare 'load' label. However, it does not distinguish itself from sibling loaders like load_symbols or load_device_pack, so an agent must infer which loader applies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no prerequisites, and no alternatives named. The phrase 'for peripheral parsing' only weakly implies it should precede read_peripheral_register/decode_peripheral_register, and nothing tells the agent how it relates to load_device_pack or load_symbols.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
load_symbolsA
Loads symbols from an ELF/AXF into the current GDB session WITHOUT flashing. Symbols are per-session, so after a fresh connect or recover_session you need this (or flash_firmware) before symbol breakpoints resolve. Falls back to the debug profile's elf_path if elf_path is omitted.
| Name | Required | Description | Default |
|---|---|---|---|
| session | No | Optional debug-session name. Omit for the default target. | |
| elf_path | No | Path to the ELF/AXF. Defaults to the profile elf_path. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, so safety is partly covered, but the description adds meaningful context beyond them: that symbols are per-session, that no flashing occurs, and that the profile elf_path is a fallback. It does not disclose the non-idempotent behavior hinted by idempotentHint=false or error behavior when a path is invalid.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly-packed sentences, front-loaded with purpose and the key constraint 'WITHOUT flashing', and every sentence earns its place by adding a distinct fact (non-flashing, per-session lifetime, fallback path).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and zero required parameters, the description covers what an agent needs to call it: when to use it, the no-flash constraint, and the elf_path fallback. It could be stronger by noting behavior on failure or the distinction from flash_firmware's side effects, but it is nearly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters, including the same elf_path default the description repeats. The description adds no syntax, format, or precedence detail beyond the schema, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (loads) and resource (symbols from an ELF/AXF) with an explicit scope qualifier, 'WITHOUT flashing', that immediately distinguishes it from the sibling flash_firmware. An agent can identify exactly what this does versus the nearby flash/build tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the triggering conditions ('after a fresh connect or recover_session you need this') and names the alternative ('or flash_firmware'). It also states the purpose of loading (so symbol breakpoints resolve), giving the agent clear selection logic.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
loggingA
Firmware log capture over a channel. action=start(channel[,port,baudrate,command,args,file,timeout]) | stop(channel) | get(channel[,limit,since_index,clear]) | clear(channel). channel=rtt|swo|uart; uart takes port/baudrate, rtt/swo take command/args or file.
| Name | Required | Description | Default |
|---|---|---|---|
| args | No | rtt/swo: command arguments. | |
| file | No | swo: tail OpenOCD's ITM decode file (run setup_swo first) — no external decoder needed. | |
| port | No | uart: serial port, e.g. COM3 or /dev/ttyUSB0. | |
| clear | No | Clear returned entries after reading. | |
| limit | No | Max recent entries to return. | |
| action | Yes | Which operation to perform. | |
| channel | No | Log channel. | |
| command | No | rtt/swo: executable to launch (rtt defaults to JLinkRTTClient). | |
| session | No | Optional debug-session name. Omit for the default target. | |
| timeout | No | uart: read timeout seconds (default 0.1). | |
| baudrate | No | uart: baudrate (default 115200). | |
| since_index | No | Only entries with index greater than this. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false, so the safety profile is partly covered. The description adds the channel-to-parameter mapping, but says nothing about whether start blocks, whether logs persist across sessions, what get returns, or that clear discards buffered entries — all relevant for a stateful multi-action tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense line that front-loads the purpose, then presents actions and the channel/parameter rules compactly with no filler. Every clause carries information; nothing is redundant with surrounding prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 12 parameters, four mutating/side-effecting actions, and no output schema, the definition should say more about what get returns (entries with indices, per since_index) and what clear/stop do to ongoing capture. It covers the invocation surface but leaves the result and state-management behavior to inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description's channel-conditioned parameter grouping (port/baudrate for uart, command/args/file for rtt/swo) largely echoes what the schema property descriptions already say, adding little beyond orientation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a concrete verb and resource ('Firmware log capture over a channel') and then enumerates the four operations with their argument shapes, so an agent immediately knows this is a log-capture tool rather than a config or state tool. It does not explicitly contrast itself with nearby siblings such as setup_swo or capture_state, which keeps it from a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The action grammar (start/stop/get/clear) implies the lifecycle, and the note that rtt/swo take command/args or file while uart takes port/baudrate hints at channel-dependent usage. However, there is no explicit statement of when to choose this tool over setup_swo, capture_state, or session_diagnostics, nor any prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mcp_infoARead-onlyIdempotent
Identifies THIS running stm32-gdb-mcp server: release version, git commit, the package directory the code was imported from (plus the install root the git probe used), whether compact mode is hiding tools, and how many tools this build advertises versus how many exist. Needs NO debug session, NO probe and NO target — call it the moment a tool you expect is missing or behaves like an older build, instead of guessing which checkout the client actually launched.
| Name | Required | Description | Default |
|---|---|---|---|
| session | No | Optional debug-session name. Omit for the default target. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds real behavioral context beyond them: it requires no session, no probe and no target, and it explains the compact-mode interaction that can hide tools. That is genuine value, though it does not describe return format or cost.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One dense sentence that front-loads the identity payload before the 'no prerequisites' clause and the usage trigger. Every clause carries distinct information (what is returned, what is not needed, when to call it) with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description is right to enumerate the returned fields, and it does so fairly exhaustively. For a single-optional-param read-only introspection tool this is close to complete; it omits nothing an agent needs to call it correctly, though return shape nuance (ordering, formats) is unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one optional parameter with 100% schema description coverage, so the schema already documents the debug-session name and its omission default. The description's 'Needs NO debug session' adds a mild hint about the optional nature but no syntax or format detail beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: it 'identifies THIS running stm32-gdb-mcp server' and then enumerates the exact facts returned (release version, git commit, package/install dir, compact mode state, tool counts). An agent immediately knows what it gets. It does not, however, name or distinguish itself from near-neighbors like self_check or tool_help.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ('call it the moment a tool you expect is missing or behaves like an older build') and frames the alternative to avoid ('guessing which checkout the client actually launched'). It also pre-clears prerequisites ('Needs NO debug session, NO probe and NO target'). It stops short of naming a sibling it should be preferred over, so no exclusion clause.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_call_stackARead-onlyIdempotent
Reads the call stack as a decoded list of frames {level, func, file, line, addr} plus a one-line summary. Set include_raw=true to also get the raw GDB output.
| Name | Required | Description | Default |
|---|---|---|---|
| session | No | Optional debug-session name. Omit for the default target. | |
| include_raw | No | Include the raw GDB transcript (default false). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive behavior, so the safety profile is covered. The description adds genuinely useful context beyond that by spelling out the decoded return shape and the one-line summary, which matters since there is no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the core action and return shape, with the optional flag mentioned second. No wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only inspection tool with full annotation coverage and full schema coverage, the description supplies the return structure an agent needs in the absence of an output schema. Only the session parameter's role and sibling differentiation are left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented. The description only restates include_raw's effect (raw GDB output) and says nothing about the session parameter, so it adds little beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Reads the call stack') and even characterizes the returned structure ({level, func, file, line, addr} plus a one-line summary). It does not distinguish itself from nearby siblings like analyze_stack or frame, which likely overlap.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to choose this over analyze_stack, frame, or reconstruct_fault_context. The only conditional instruction ('Set include_raw=true...') is parameter usage, not tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_freertosARead-onlyIdempotent
Reads FreeRTOS state by 'what': 'current_task' (pxCurrentTCB), 'tasks' (ready list: names/priorities/TCB/stack), 'task_lists' (ready/delayed/suspended/deleted), 'queue' or 'mutex' (needs handle = a Queue_t expression), or 'heap' (heap_4/5 usage).
| Name | Required | Description | Default |
|---|---|---|---|
| what | Yes | ||
| handle | No | For 'queue'/'mutex': GDB expression for the Queue_t pointer/handle. | |
| session | No | Optional debug-session name. Omit for the default target. | |
| max_tasks | No | tasks/task_lists: max tasks to return. | |
| max_priorities | No | tasks/task_lists: priority count override. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so safety is covered. The description adds real value beyond them by disclosing what each mode actually retrieves (TCB pointers, names/priorities/stack, heap_4/5 usage), which is not inferable from the annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence with the primary verb and the mode enumeration front-loaded; every parenthetical clause maps to a real parameter value and none is filler. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of explaining returns, and it does so for each mode. It omits only secondary details such as the exact output shape or how session/max_tasks/max_priorities interact with results, which the schema partially covers.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 80% (baseline 3), and the description goes beyond the bare enum list by explaining the semantics of every 'what' value and restating that 'queue'/'mutex' require a Queue_t handle expression. It adds meaningful interpretation the enum alone does not provide.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Reads) and resource (FreeRTOS state) and then enumerates exactly what each 'what' value yields, including internal structures like pxCurrentTCB and ready/delayed/suspended/deleted lists. An agent can distinguish this from siblings like detect_rtos or analyze_stack without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives conditional requirements (queue/mutex need a handle) and describes what each mode returns, but never states when to reach for this tool versus detect_rtos, analyze_stack, or read_variable. Usage is implied by the mode descriptions rather than explicitly scoped.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_memoryARead-onlyIdempotent
Reads a block of memory from the target. Returns the raw bytes in memory order, plus value_le -- the same bytes as one little-endian value -- for a 1/2/4/8-byte read. Use value_le for a peripheral register: the raw string arrives least-significant-byte first, so reversing it by hand is where bit positions get misread.
| Name | Required | Description | Default |
|---|---|---|---|
| length | Yes | Number of bytes to read. | |
| address | Yes | Hex address to read from, e.g., '0x20000000'. | |
| session | No | Optional debug-session name. Omit for the default target. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnly, idempotent, non-destructive, closed-world), so the bar is lower. The description still adds real value beyond them: it documents the return shape (raw bytes in memory order plus value_le), the little-endian byte ordering, and the rationale that hand-reversing leads to misread bit positions. That is useful behavioral/output context not present in the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core action, and no repetition of the schema. The third sentence is longer but earns its place by explaining the byte-ordering pitfall that motivates value_le.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries the burden of explaining return values, and it does so clearly (raw bytes plus value_le, with little-endian semantics). For a simple read tool whose annotations already cover the safety profile, nothing essential for invoking it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema documents address, length, and session, making 3 the baseline. The description adds meaning tied to length by specifying the useful sizes (1/2/4/8 bytes) for which value_le is produced, which is semantic guidance absent from the schema itself.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb 'Reads' plus resource 'a block of memory from the target', and it goes further by describing what the call returns (raw bytes plus value_le). It does not, however, draw a line against adjacent siblings such as read_variable, read_registers, typed_memory, or read_peripheral_register, so the boundary is left to the agent to infer.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives one concrete usage instruction -- use value_le when the read targets a peripheral register -- which is clear context for interpreting the result. But there is no statement of when to choose read_memory over its many read-oriented siblings, and no prerequisites or exclusions, so the guidance is largely implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_peripheral_registerARead-onlyIdempotent
Reads a peripheral register using its name from the loaded SVD.
| Name | Required | Description | Default |
|---|---|---|---|
| session | No | Optional debug-session name. Omit for the default target. | |
| register | Yes | Register name (e.g., 'ODR'). | |
| peripheral | Yes | Peripheral name (e.g., 'GPIOA'). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint=false, so the safety profile is fully covered structurally. The description adds the SVD dependency as behavioral context but says nothing about failure behavior when the SVD is absent or the name is unknown, and nothing about the return format.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the action, resource, and lookup mechanism stated in order and zero filler. Nothing is superfluous.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read tool with full schema coverage and annotations covering the safety profile, the description is nearly sufficient. The only gap is that it does not indicate what a read yields (raw value vs decoded fields), which matters given there is no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% – every parameter (session, register, peripheral) is documented with examples ('ODR', 'GPIOA') including the optional session. The description adds no meaning beyond the schema; baseline 3 applies when the schema does all the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear specific verb+resource ('Reads a peripheral register') with a scope qualifier ('using its name from the loaded SVD') that distinguishes it from an address-based read. However, it does not differentiate itself from close siblings such as read_registers or decode_peripheral_register, which an agent must still disambiguate by schema inspection.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'From the loaded SVD' implies a prerequisite (an SVD must be loaded, cf. load_svd) and that lookup is by symbolic name, which is useful context. But there is no explicit when-to-use, when-not-to-use, or named alternative versus read_registers/decode_peripheral_register, so guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_registersBRead-onlyIdempotent
Read CPU register groups. what=core([include_raw]) | fault | cycle([enable]). fault decodes CFSR/HFSR; cycle reads the DWT cycle counter.
| Name | Required | Description | Default |
|---|---|---|---|
| what | Yes | Which operation to perform. | |
| enable | No | If true, enable and zero the counter before reading. | |
| session | No | Optional debug-session name. Omit for the default target. | |
| include_raw | No | Include the raw GDB transcript (default false). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive behavior, so the safety profile is covered. The description adds what the fault and cycle modes actually yield, but omits the notable side effect that enable=true enables and zeroes the counter (a state change on a tool marked idempotent) and says nothing about return shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact, front-loaded sentences with no filler. The terse bracket notation is dense but still parseable, and the leading sentence establishes scope before the mode breakdown.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter tool with no output schema, the description covers the mode semantics adequately but leaves gaps: the behavior of enable (zeroing the counter), the meaning of session, and the shape of returned register data are not addressed. Annotations carry the safety story, so this is workable but incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description lightly annotates include_raw and enable within the mode shorthand but adds no syntax or semantics beyond what the oneOf schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read CPU register groups') and enumerates the three selectable modes (core/fault/cycle), so an agent knows exactly what the tool does. It stops short of distinguishing itself from near-siblings like read_peripheral_register or diagnose_fault.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The mode listing implies when to pick fault ('decodes CFSR/HFSR') versus cycle ('reads the DWT cycle counter'), which is useful selection guidance. However, there is no explicit when-not or pointer to overlapping siblings such as diagnose_fault, which also handles fault analysis, so usage must be inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_variableARead-onlyIdempotent
Reads the value of a C variable currently in scope.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Name of the variable to read. | |
| session | No | Optional debug-session name. Omit for the default target. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and a closed-world scope, so the safety profile is fully covered. The description's only added behavioral detail is the scoping requirement ('currently in scope'), which usefully implies the target must be halted/at a stop; it says nothing about failure modes such as optimized-out or out-of-scope variables.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence with no filler, and the key qualifier ('currently in scope') is placed where it will be read. Nothing is padded or restated from the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so return-format explanation would be welcome but is absent; the tool is simple and annotations cover safety, so the description is adequate. It stops short of noting prerequisites (halted session, symbols loaded) or what happens when the variable cannot be resolved.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage, both parameters ('name' and optional 'session') are already documented in the schema. The description adds no additional parameter meaning such as name syntax, fully-qualified paths, or session default behavior, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource ('Reads the value of a C variable') plus a scope qualifier ('currently in scope'), so an agent knows exactly what it returns. It does not differentiate itself from closely related siblings like track_variable, inspect_symbol, or expressions, which an agent might otherwise confuse it with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'currently in scope' implicitly tells the agent the variable must exist at the current execution point, which is a real usage constraint. However, there is no explicit when-to-use/when-not guidance and no routing to alternatives such as track_variable for ongoing monitoring or expressions for computed values.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reconstruct_fault_contextA
Reconstructs the full crash site after a HardFault: decodes fault registers, unwinds the auto-stacked exception frame from MSP/PSP via EXC_RETURN to recover the true faulting PC, and resolves it to source file:line. Run this when halted in a fault handler.
| Name | Required | Description | Default |
|---|---|---|---|
| session | No | Optional debug-session name. Omit for the default target. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a non-read-only, non-idempotent, non-destructive, closed-world operation, and the description does not contradict that. It adds real behavioral context about the underlying method (MSP/PSP unwinding, EXC_RETURN handling), but it never explains why the tool is not read-only or what side effects/preconditions the non-idempotent hint implies.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action and mechanism, and the second sentence delivers the invocation condition with zero filler. Every clause carries technical meaning about what the tool does or when to call it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a diagnostic tool with annotations present and no output schema, the description covers what it does, why it is non-trivial, and when to invoke it. It would be fully complete with the prerequisite (e.g., symbols loaded) and a note on how it relates to the fault-diagnosis siblings, but nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With a single parameter at 100% schema description coverage, the schema already fully documents 'session' (optional, default target). The description adds nothing about the parameter's meaning or format, so this sits at the baseline of 3 where structured data does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb (reconstructs) and resource (the crash site after a HardFault) and details the mechanism: decoding fault registers, unwinding the auto-stacked exception frame from MSP/PSP via EXC_RETURN, and resolving to source file:line. This is far more specific than a tautology, but it never distinguishes itself from nearby siblings such as diagnose_fault, analyze_stack, or coredump, which an agent could plausibly confuse it with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit trigger condition: 'Run this when halted in a fault handler,' which is exactly the state-dependent cue an agent needs. However, it names no alternatives or exclusions, so an agent halted in a fault has no guidance on when to prefer diagnose_fault or analyze_stack over this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recover_sessionA
Recovers a dropped or wedged session: cleanly tears down the GDB client and server, then restarts the server (with retry/backoff for a busy probe) using the last start_debug_session arguments and reconnects. Use after a probe_unavailable or connection_lost error. When a programmable USB hub is configured (debug_profile hub.channel), a retry that cannot fix the probe escalates to toggling its USB data lines and then power-cycling the port -- the only in-band cure for a wedged endpoint. Any hub action taken is reported in recovery_steps.
| Name | Required | Description | Default |
|---|---|---|---|
| deep | No | Add a long (2 s) power-off rung to drain bulk capacitance. | |
| session | No | Optional debug-session name. Omit for the default target. | |
| escalate | No | Allow hub data-line/power escalation when a plain retry fails (default true). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (which only flag readOnly/destructive/idempotent false) by disclosing what gets torn down and restarted, retry/backoff behavior, hub data-line toggling and power-cycling escalation, and that hub actions are reported in recovery_steps. Rich operational context an agent could not get from structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then the trigger, then the hub escalation, then the reporting note. Dense but every sentence carries information; only slightly verbose in the hub explanation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex recovery tool with no output schema, it covers trigger, mechanism, escalation, and result reporting. Annotations supply the safety profile, so remaining gaps are minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents deep, session, and escalate. The description explains the escalation concept but does not add parameter-specific syntax or format detail beyond the schema, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (recovers) and resource (session) and details the exact mechanism: tear down GDB client/server, restart server, reconnect. This clearly distinguishes it from siblings like close_session, stop_debug_session, or start_debug_session.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly gives the trigger condition: 'Use after a probe_unavailable or connection_lost error.' It also describes the escalation path when a hub is configured. It stops short of naming an alternative tool to use instead when recovery is not the right call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
render_frameworkA
Render the synthesized FrameworkPlan to a HAL C init skeleton (bsp_init.c + bsp_init.h). Every derived fact (clock enables, GPIO modes, mapped .Init fields) is concrete; every unresolved value is a clearly marked TODO — nothing is fabricated. Returns the files, their content, and a todo_count. Run design_framework first.
| Name | Required | Description | Default |
|---|---|---|---|
| style | No | Code style (default 'hal'). | |
| session | No | Target session id (default 'default'). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses meaningful behavior: each unresolved value becomes a clearly marked TODO and 'nothing is fabricated,' and it names what is returned (files, content, todo_count). It does not clarify whether files are written to disk (annotations imply non-read-only) or describe error/permission conditions, so it is strong but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the core action and output, followed by the behavior guarantee (TODOs, no fabrication) and the prerequisite. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so (files, content, todo_count), and it names the upstream dependency. It is nearly complete for this tool; only error/failure and disk-write behavior are left unspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (style, session) are already documented with defaults in the schema. The description adds no parameter-level detail, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Render) plus the exact resource and output artifacts: the synthesized FrameworkPlan turned into a HAL C init skeleton (bsp_init.c + bsp_init.h). An agent immediately knows what this produces and can distinguish it from design_framework (which builds the plan) and describe_framework.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the prerequisite: 'Run design_framework first.' This is clear context for when the tool is actionable, but it offers no alternatives or when-not-to-use conditions, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
report_issueA
Files a GitHub issue about an MCP problem from THIS session — auto-bundling the session journal, metrics, and MCP version into a structured report (via the gh CLI). Call this when a tool misbehaves or confuses you. Deduplicated per session so retries don't spam. Defaults to the stm32-gdb-mcp repo.
| Name | Required | Description | Default |
|---|---|---|---|
| env | No | Agent/IDE + model, e.g. 'Cursor / deepseek-v4-pro'. | |
| repo | No | owner/repo to file under (default the MCP repo). | |
| title | Yes | Short issue title, e.g. '[agent] start_debug_session ignores server_args'. | |
| session | No | Optional debug-session name. Omit for the default target. | |
| description | Yes | What you were doing and what went wrong. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a non-readOnly, open-world write with no idempotency. The description adds real behavioral context beyond that: it bundles journal/metrics/version automatically, is deduplicated per session so retries won't spam, and defaults to the stm32-gdb-mcp repo. It doesn't state auth/permission needs or what happens if gh is unavailable, so not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four compact sentences, front-loaded with the core action and mechanism, then the trigger, then the dedup safeguard, then the default target. Every sentence earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema present, the description still conveys enough for correct invocation: what gets bundled, the dedup behavior, and the default repo. It leaves the return/confirmation behavior unstated, a minor gap for a write tool posting to an external service.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so each parameter is already documented, making 3 the baseline. The description adds only marginal meaning beyond the schema (confirms the repo default and the session target), so no lift above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Files) and resource (GitHub issue about MCP problems from this session), plus the key mechanics: auto-bundling the session journal, metrics, and MCP version via the gh CLI. An agent can distinguish this from export_debug_report or self_check without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit trigger: "Call this when a tool misbehaves or confuses you." This gives clear context for use. It doesn't name alternatives (e.g., export_debug_report for a local export vs. filing upstream) or explicit when-not conditions, keeping it below a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reset_targetADestructive
Resets the target device. Can optionally halt immediately after reset. strategy="cold" removes target power through a configured programmable USB hub before resetting, which is the only strategy that produces a true power-on reset (RCC_CSR POR flag, cleared .noinit, drained RAM); it fails rather than silently doing a warm reset when no hub channel is mapped. It needs no confirm argument -- asking for a cold reset by name IS the confirmation the hub guard wants -- and it stops the GDB session before the cut, then re-establishes it.
| Name | Required | Description | Default |
|---|---|---|---|
| halt | Yes | If true, halts the CPU immediately after reset. | |
| command | No | Optional custom GDB monitor reset command. | |
| session | No | Optional debug-session name. Omit for the default target. | |
| strategy | No | Optional reset strategy: default, under_reset, software, or cold (hub power cycle). "software" issues soft_reset_halt, which resets through the debug unit WITHOUT asserting SYSRESETREQ -- so RCC_CSR does not record it and its sticky reset flags do not move; use "default" when the reset must be visible there, e.g. when proving a cold boot by watching a sticky flag disappear. "under_reset" is currently an alias of "default". The result's `note` says which of these applied to the call you actually made. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and idempotentHint=false, and the description goes well beyond them by disclosing that cold reset cuts power via a programmable hub, clears .noinit and RAM, stops the GDB session and then re-establishes it, and fails closed when no hub channel is mapped. The confirm-argument explanation (naming cold IS the confirmation the hub guard wants) is non-obvious behavioral context an agent could not derive from structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and optional halt are front-loaded in the first sentence, and the remaining content is dense with useful detail rather than filler. The second sentence is a long em-dash-and-parenthetical chain that is harder to parse than it needs to be, which costs it the top mark.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden, and it partially meets it by hinting at failure behavior for cold reset. It is well covered for the cold path but says little about what a plain or software reset leaves behind on the target, which is the main remaining gap for a destructive mutation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description nonetheless adds real meaning by explaining the semantics and preconditions of strategy="cold" and its distinct failure mode versus the other strategies. It stops short of covering the halt, command, or session parameters, so it does not fully round out parameter guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence gives a specific verb+resource ("Resets the target device") plus an optional behavior (halt after reset), so the action is unambiguous. However, it never differentiates itself from potentially confusable siblings such as recover_session, stop_debug_session, or halt_execution, leaving that discrimination to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Substantive guidance is given for the cold strategy: when it is required (true power-on reset), what it guarantees (RCC_CSR POR flag, cleared .noinit, drained RAM), and how it fails (refuses rather than silently doing a warm reset with no hub channel). What is missing is any statement of when not to use the tool at all, or which alternative to pick for a simpler warm reset.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_acceptanceA
Evaluate the loaded AcceptanceSpec against live silicon state and return a deterministic pass/fail/error verdict per check (the closed-loop judge). An unreadable target is reported as 'error', never a silent pass. A failing/errored check derived by synthesize_acceptance carries provenance.source — the init function + line that should satisfy it — so fixes are precision-guided. Run load_acceptance first; halt the target at the state you want to assert.
| Name | Required | Description | Default |
|---|---|---|---|
| session | No | Target session id (default 'default'). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, idempotentHint=false), the description discloses the error contract ('An unreadable target is reported as error, never a silent pass'), determinism of the verdict, and the provenance.source carried by failing/errored checks. These are non-obvious behavioral traits an agent needs before invoking it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core action and output, then error semantics, then prerequisites. Dense but every sentence carries information; the parentheticals are compact rather than redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description adequately covers the return contract (per-check pass/fail/error verdict, provenance.source). Combined with the stated prerequisite (load_acceptance) and target-state requirement, an agent has enough to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (session) with 100% schema description coverage, so the schema already documents the default 'default' value. The description adds nothing about the session parameter, which is acceptable given full coverage but not additive; baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Evaluate) and resource (loaded AcceptanceSpec against live silicon state) with a concrete output shape (deterministic pass/fail/error verdict per check). It self-labels as 'the closed-loop judge', which distinguishes it from siblings like run_scenario, run_acceptance_iteration, and start_acceptance_loop.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit prerequisites: 'Run load_acceptance first; halt the target at the state you want to assert.' This tells the agent the ordering and the required target state. It does not explicitly contrast itself with run_acceptance_iteration/start_acceptance_loop, so it falls short of naming the alternative condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_acceptance_iterationA
Run one bounded loop iteration: (optional build) → (optional flash+run-to) → evaluate the AcceptanceSpec against live silicon, then record the verdict and return a decision (converged / should_continue / exhausted / stalled) plus the checks to fix. A build or run-to failure is recorded as a phase_error, not a crash. Refuses to run a terminal loop unless force=true. start_acceptance_loop first.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Run even if the loop already converged/exhausted/stalled. | |
| session | No | Target session id (default 'default'). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, idempotentHint=false, and destructiveHint=false, so the safety profile is largely covered. The description adds genuinely useful behavioral detail beyond that: failures are recorded as a phase_error rather than a crash, and a terminal loop is refused unless force=true. It does not cover rate limits or auth, but the mutation/iteration semantics are well disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and the phase sequence, then the outcome/decision set, then the edge-case rules. It is dense but each clause carries actionable information; the parenthetical step notation is compact. Slightly clause-heavy, but no wasted sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, but the description explains the return value (a decision among converged/should_continue/exhausted/stalled plus checks to fix), covering what would otherwise be missing. With annotations and full parameter coverage, an agent has enough to invoke it correctly, though the loop lifecycle around start_acceptance_loop/acceptance_loop_status could be tied together more explicitly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters (force, session) are already documented in the schema. The description adds marginal meaning to force by tying it to the terminal-loop refusal, but offers nothing new for session. Baseline 3 is appropriate since the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb and resource ('Run one bounded loop iteration') and enumerates the exact pipeline phases (build → flash+run-to → evaluate AcceptanceSpec). It distinguishes itself cleanly from siblings like run_acceptance and start_acceptance_loop by framing this as a single iteration within an existing loop.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit prerequisite ('start_acceptance_loop first') and the terminal-loop/force condition, which tells the agent when it is and isn't allowed to call. It stops short of naming alternative tools or explicitly stating when not to use it versus run_acceptance, so it is clear context without full exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_and_waitA
Resumes the target and waits, returning a structured stop event (reason, symbolized frame, breakpoint id, signal) or a timeout. Use this instead of continue_execution + polling to close the debug loop.
| Name | Required | Description | Default |
|---|---|---|---|
| session | No | Optional debug-session name. Omit for the default target. | |
| timeout_sec | No | Max seconds to wait for a stop (default 10). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare this is a mutating control op (readOnlyHint=false) with no open-world or destructive side effects, lowering the bar. The description adds genuine value beyond annotations by disclosing the return shape (stop event fields) and the timeout outcome, and 'resumes the target' confirms the control action. It does not mention required session state or error modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler. The return contract is front-loaded and the usage directive follows, so the most decision-relevant information comes first.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations covering the safety profile, a fully documented two-param schema, and no output schema, the description appropriately explains the returned stop event and timeout. It is nearly complete, lacking only prerequisites (e.g., an active paused session) to be fully self-sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with two optional parameters, so the schema already documents 'session' and 'timeout_sec' (default 10). The description references the timeout outcome but adds no syntax or format detail beyond the schema; the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Resumes the target and waits') plus the return contract (structured stop event with reason, symbolized frame, breakpoint id, signal, or timeout). It also names the sibling it replaces ('continue_execution + polling'), so an agent can distinguish it from continue_execution, wait_for_stop, and run_to_line.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: 'Use this instead of continue_execution + polling to close the debug loop' names the alternative and the intent. It does not address when to prefer the other siblings (wait_for_stop, run_for_duration, debug_until) or when a plain resume is sufficient, so it falls short of full when/when-not coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_for_durationA
Runs the target freely for a wall-clock duration, halts it, and returns one structured report with final frame/context and optional expression captures. Useful for counters, telemetry buffers, polling loops, and timing-sensitive bus diagnostics without breakpoint perturbation.
| Name | Required | Description | Default |
|---|---|---|---|
| then | No | Action after duration (default halt). | |
| sample | No | Best-effort low-rate debugger polling while running; does not halt the target. | |
| capture | No | ||
| session | No | Optional debug-session name. Omit for the default target. | |
| duration_sec | Yes | Seconds to let the target run freely. | |
| resume_after | No | Resume execution after capture (default false). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and idempotentHint=false, and the description adds genuine context beyond them: it halts the target, produces one structured report, distinguishes 'best-effort low-rate polling while running' from post-halt 'capture', and notes the no-breakpoint-perturbation behavior. It omits failure/partial-capture behavior, so it isn't fully complete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences that front-load the core behavior and then the use case. No filler; every clause contributes (duration run, halt, structured report, capture, usage contexts).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-param tool with nested objects and no output schema, the description usefully sketches the return value ('final frame/context and optional expression captures') and the run/halt/capture flow. It leaves the sampling/capture parameter interplay to the schema, which is reasonable but not exhaustive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 83%, so the schema already carries most parameter meaning. The description only references 'optional expression captures' and the structured report, adding little to the schema's own descriptions of capture, sample, resume_after, and session. Baseline 3 applies for high-coverage schemas.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource with full lifecycle: 'Runs the target freely for a wall-clock duration, halts it, and returns one structured report.' This clearly separates it from siblings like run_to_line, debug_until, run_and_wait, and continue_execution, since the duration-bounded free-run is the distinguishing scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete usage contexts ('counters, telemetry buffers, polling loops, and timing-sensitive bus diagnostics') and a key selection rationale ('without breakpoint perturbation'). It does not, however, name when NOT to use it or point to specific alternatives such as run_and_wait or debug_until, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_pipelineA
Spec-to-silicon capstone (Pillar G): run the whole deterministic DESIGN half in one call. Chains the existing, individually verified tools in dependency order -- import_netlist? -> import_spec? -> design_framework -> solve_clock_tree? -> solve_timer? -> render_framework -> synthesize_acceptance -- turning a netlist plus a product spec into a flashable HAL skeleton and a machine-checked acceptance spec, then hands off to the build/verify loop. Optional stages (marked ?) run only when their input is present. Honest by construction: it GUESSES NOTHING -- it sequences verified tools and aggregates every stage's own unresolved/conflict gaps into one 'human decisions / data still needed' list. A required-stage hard error (no board, invalid input) stops with pipeline_status=blocked at that stage; expected gaps (an AF needing a pin DB, an unmodelled clock) surface as complete_with_unresolved; a clean run is complete. Operates on the session's board unless netlist= is supplied.
| Name | Required | Description | Default |
|---|---|---|---|
| spec | No | Product spec object to import and design from (import_spec). | |
| style | No | Render style for the framework skeleton (default hal). | |
| af_map | No | Alternate-function map for GPIO AF resolution {line_or_family: {port_pin: {'PERIPH_SIG': af}}}. | |
| design | No | Peripheral config overrides merged into the design {PERIPH: {..}}. | |
| source | No | Clock source for solve_clock_tree (e.g. hse/hsi). | |
| db_path | No | Path to a pin-capability DB for AF resolution (else STM32_GDB_MCP_PIN_DB). | |
| irq_map | No | IRQ-number map for NVIC acceptance checks {line_or_family: {irq_name: number}}. | |
| netlist | No | Netlist to import first: {path|text, format?}. Omit to use the board already in this session. | |
| session | No | Optional debug-session name. Omit for the default target. | |
| gpio_map | No | GPIO base-address map for pin acceptance checks {line_or_family: {port_letter: base_address}}. | |
| source_hz | No | Clock source frequency in Hz for solve_clock_tree. | |
| sysclk_hz | No | Target SYSCLK in Hz; presence enables the solve_clock_tree stage. | |
| need_48mhz | No | Require a 48 MHz domain (USB/SDMMC) in the clock solve. | |
| stopped_at | No | Symbol the acceptance spec should assert the core halts at. | |
| synthesize | No | Set false to stop after render_framework and skip acceptance synthesis (default true). | |
| register_map | No | Clock-enable register map for acceptance placement {line_or_family: {clock: {address, bit}}}. | |
| acceptance_name | No | Name for the derived acceptance spec. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover safety flags (readOnlyHint=false, destructiveHint=false, idempotentHint=false). The description adds substantial behavior beyond them: the status outcomes (pipeline_status=blocked, complete_with_unresolved, complete), the error-vs-gap distinction, and the guarantee that it 'GUESSES NOTHING' and aggregates unresolved gaps into one human-decision list.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and the chained-tool sequence are front-loaded, and every sentence carries operational content. It is dense rather than padded, though the 'Honest by construction' framing is slightly rhetorical and the run is long for a single description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 17-parameter, no-output-schema capstone tool, the description supplies what is otherwise missing: the stage order, the fallback behavior of netlist=, and the terminal status values an agent must interpret. Nothing critical to invoking or reading results is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3; the description adds conditional semantics by explaining that optional stages ('?') run only when their input is present and that omitting netlist= falls back to the session board. It does not go further into per-parameter interaction, so it sits just above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('run the whole deterministic DESIGN half in one call') and explicitly enumerates the chained stages, so an agent can distinguish it from the individually-verified siblings (import_netlist, design_framework, render_framework, synthesize_acceptance). It also names the output ('a flashable HAL skeleton and a machine-checked acceptance spec').
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context for when to use this over the individual tools ('run the whole deterministic DESIGN half in one call') and explains that optional stages run only when their input is present, plus the netlist= override for the session board. It stops short of explicitly naming when NOT to use it (e.g., when you only need one stage).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_scenarioADestructive
Replays a declarative scenario — a list of {tool, args} steps — deterministically and returns a per-step pass/fail report. Provide inline 'steps' or a 'path' to a JSON scenario file. The minimal-step way to re-run a complex bug repro.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Path to a JSON scenario file (alternative to inline steps). | |
| steps | No | Ordered steps, each {tool, args}. | |
| session | No | Optional debug-session name. Omit for the default target. | |
| stop_on_failure | No | Stop at the first failing step (default true). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive/openWorld/non-idempotent, so the safety profile is covered. The description adds genuinely new context: deterministic replay semantics and the fact that it returns a per-step pass/fail report, which matters because no output schema exists. It does not warn that composed steps may carry arbitrary side effects, but the destructiveHint covers that baseline.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences: purpose/return value first, input options second, use case last. Front-loaded and nearly waste-free, with only the slight redundancy of restating the inline-steps-or-path choice already in the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly takes on describing the return value (per-step pass/fail report). Input forms and intended use are covered. Missing only edge behavior such as what happens on failure beyond the stop_on_failure schema note, or how scenarios compose with the current session.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all four parameters (path, steps, session, stop_on_failure) are already documented in the schema. The description only restates that steps are {tool, args} and that path is an alternative, adding no syntax or format detail beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: replays a declarative scenario of {tool, args} steps and returns a per-step pass/fail report. The scope is concrete and an agent can picture the operation. However, it never distinguishes itself from sibling multi-step runners such as batch, run_pipeline, or run_acceptance, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"The minimal-step way to re-run a complex bug repro" gives a clear when-to-use context. There are no exclusions or named alternatives (e.g. run_pipeline, batch), which keeps it from a 5, but the intended use case is explicit rather than merely implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_to_lineB
Runs until a given location is reached (function, 'file.c:42', or '*0xADDR').
| Name | Required | Description | Default |
|---|---|---|---|
| session | No | Optional debug-session name. Omit for the default target. | |
| location | Yes | Where to run to. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already disclose that this is not read-only, not idempotent, and not destructive. The description adds that the operation runs until a target location is reached, which indicates blocking execution-control behavior. However, it omits important behavioral details such as timeout behavior, what happens if the location is never reached, and whether an active debug session is required.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no wasted words. It immediately states the core behavior and examples of valid location syntax.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a debug execution-control tool with annotations covering safety and a fully described schema, the definition is minimally viable. It still lacks usage differentiation from sibling tools and behavioral details such as timeout or failure behavior, but the safety-relevant traits are covered by annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds meaningful syntax examples for the required location parameter: a function, 'file.c:42', or '*0xADDR'. The optional session parameter is documented only in the schema, but the location guidance provides useful extra semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific execution-control action: run until a given location is reached. It also clarifies acceptable location formats such as a function name, file.c:42, or *0xADDR. It does not explicitly distinguish itself from close siblings like debug_until, run_and_wait, or continue_execution.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit guidance on when to use this tool instead of alternatives such as step, continue_execution, run_and_wait, or debug_until. The intended context is implied by the tool name and description, but no conditions, exclusions, or prerequisites are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sample_pcA
Statistical PC profiler: enables DWT and samples the program counter while the core RUNS (non-intrusive, over SWD — no SWO pin or firmware change). Returns a symbolized hot-spot histogram (top functions by %), not raw hex — the fast way to find where firmware spends time or what loop it is stuck in. A high 'unsampleable' count means the core is halted/asleep; a high 'zero_samples' count means nothing was profiled at all. Leave enable=true: GDB cannot write the enable bit while the core runs, so this halts briefly to set it and resumes, and only when it is not already set. Note some links cannot serve memory reads while the core runs at all (measured: OpenOCD + ST-Link + STM32L1) — there PC sampling is unavailable and the result says so rather than inventing a hot spot.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | Number of samples (default 128; more = better statistics, slower). | |
| enable | No | Enable DWT trace before sampling (default true). With false, a target whose trace unit is off yields nothing. | |
| session | No | Optional debug-session name. Omit for the default target. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the safety flags; the description adds the behaviors that matter: brief halt to set the DWT enable bit, non-intrusive SWD sampling with no SWO pin or firmware change, interpretation of 'unsampleable' vs 'zero_samples' results, and a documented link limitation where it reports unavailability instead of fabricating samples.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense and front-loaded: purpose, return format, and diagnostic interpretation come first, then the enable guidance and edge-case caveat. It is long for a 3-param tool, but each sentence carries distinct operational information rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries the return-value burden and does so: it names the symbolized hot-spot histogram, explains the diagnostic counters, and describes the failure mode. For a complex sampling tool with unusual failure states, nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning for 'enable' — that GDB cannot write the enable bit while the core runs, so it halts briefly and only when the bit is not already set. That is semantics beyond the schema text, though 'count' and 'session' add nothing new.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Statistical PC profiler … samples the program counter while the core RUNS') and immediately names its distinguishing output ('symbolized hot-spot histogram … not raw hex'). An agent can tell this apart from halt-based siblings like read_call_stack or halt_execution without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for when to reach for it ('the fast way to find where firmware spends time or what loop it is stuck in') and conditions that make it unusable (links that cannot serve memory reads while running). It stops short of explicitly naming the alternative profiling/halt tools it replaces, so it is clear but not fully routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
self_checkA
Validates the link right after connecting: reads CPUID and DBGMCU IDCODE and checks byte order, that a real Cortex-M is present, and that the device matches the expected family (from the profile MCU or the 'expected_family' arg). Run this first to catch endianness/config faults before debugging. Halts the core first (identity reads are unreliable while running); pass halt=false to skip.
| Name | Required | Description | Default |
|---|---|---|---|
| halt | No | Halt the core before reading (default true). | |
| session | No | Optional debug-session name. Omit for the default target. | |
| expected_family | No | Expected MCU/family, e.g. 'STM32L431'. Defaults to the profile MCU. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only carry generic safety hints, yet the description discloses concrete behavior: it halts the core first and explains why (identity reads are unreliable while running), plus the halt=false escape hatch. This is meaningful state-mutating context that explains the readOnlyHint=false flag; only the failure/return behavior is left unstated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose, then the run-first guidance, then the halt caveat in a logical order with no filler. The single dense paragraph is slightly heavy but every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still covers what is validated and the core-halting side effect, which is sufficient to call it correctly. It does not describe what a failure report looks like, a minor gap for a diagnostic tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both the halt default and the expected_family/profile-MCU default are already documented. The description largely restates these ("from the profile MCU or the 'expected_family' arg", "pass halt=false"), adding little beyond the schema; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb (validates) and precisely enumerates what is checked: CPUID, DBGMCU IDCODE, byte order, Cortex-M presence, and family match. An agent can immediately distinguish this identity/link sanity check from siblings like diagnose_fault, session_diagnostics, or validate_board.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Run this first to catch endianness/config faults before debugging" gives explicit ordering and intent. It stops short of naming a competing sibling or stating when NOT to use it, but the context for invocation is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_diagnosticsB
Session/transport diagnostics. what=health([reconnect]) | events | server_logs. events returns recent GDB/MI records; server_logs returns the GDB server's stderr.
| Name | Required | Description | Default |
|---|---|---|---|
| what | Yes | Which operation to perform. | |
| session | No | Optional debug-session name. Omit for the default target. | |
| reconnect | No | If true, try to reconnect the GDB client to the running server. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, idempotentHint=false, and destructiveHint=false, so safety is partially covered. Beyond that the description does add useful context by disclosing what 'events' (recent GDB/MI records) and 'server_logs' (GDB server stderr) return, but it never explains the 'health' operation or the side effect of reconnect.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the domain, then a compact enumeration, with two sentences of return-value context. Very little waste, though the 'what=health([reconnect]) | events | server_logs' notation is densely cryptic to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description is expected to convey return values; it covers events and server_logs but leaves the health result unexplained. For a 3-operation oneOf tool with 100% schema coverage, this is adequate but with a clear gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds a small amount by binding '[reconnect]' to the health operation, a linkage the oneOf branches don't encode, but it adds no format or semantic detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the domain ('Session/transport diagnostics') and enumerates its three concrete operations (health, events, server_logs), so the resource and scope are evident. It doesn't explicitly contrast itself with nearby siblings like get_session or self_check, keeping it from a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use / when-not guidance and no named alternative. The reader can infer that the three 'what' values are selectable operations, but nothing tells them when diagnostics is the right tool versus get_session or self_check.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_adapter_speedADestructive
Sets the SWD/JTAG adapter clock (kHz) at runtime. The default ST-Link speed is only ~480 kHz; raising it (e.g. 4000) speeds up flashing and memory reads ~8x. Lower it if reads/flash become unreliable.
| Name | Required | Description | Default |
|---|---|---|---|
| khz | Yes | Adapter clock in kHz, e.g. 4000. | |
| session | No | Optional debug-session name. Omit for the default target. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes meaningfully beyond the annotations by disclosing the default ST-Link speed (~480 kHz), the expected ~8x throughput gain, and the failure condition that should trigger a reduction. It does not explain persistence (session-scoped vs. global) or why the tool carries destructiveHint=true, leaving the flagged destructiveness unexplained.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with the action front-loaded and the performance/risk trade-off following. No filler; every sentence carries information an agent can act on.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter config tool with annotations covering the mutation profile and no output schema, the description supplies enough context to call it correctly. The only material omission is whether the setting persists across sessions or only affects the current target.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% — both khz and session are documented in the schema, including the 'e.g. 4000' example. The description reinforces the practical meaning of khz but adds no syntax or format detail beyond the schema, and never mentions the session parameter, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'Sets the SWD/JTAG adapter clock (kHz) at runtime' — with units and mechanism. No sibling tool changes adapter clock speed, so it is trivially distinguishable from the rest of the list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete when-to guidance in both directions: raise it (e.g. 4000) to speed flashing and memory reads, lower it if reads/flash become unreliable. It stops short of naming prerequisites or the alternative of leaving the default, but the tuning context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
setup_swoADestructive
One-call SWO/ITM printf setup. Configures the target's TPIU+ITM from the debugger (no firmware ITM-init needed) for the given core clock (hclk_hz) and SWO baud, and returns the OpenOCD capture commands + the firmware printf retarget snippet. Then capture with logging(action=start, channel='swo', file=). Requires the SWO pin (e.g. PB3) wired to the probe.
| Name | Required | Description | Default |
|---|---|---|---|
| port | No | ITM stimulus port for printf (default 0). | |
| output | No | OpenOCD ITM decode output file to tail (default 'swo_itm.log'). | |
| swo_hz | No | Desired SWO baud (default 2000000; ST-Link V2 max ~2 MHz). | |
| hclk_hz | Yes | Core clock (HCLK) in Hz, e.g. 80000000 for an L4 at 80 MHz. | |
| session | No | Optional debug-session name. Omit for the default target. | |
| tpiu_name | No | OpenOCD tpiu object name if not the default '$_CHIPNAME.tpiu'. | |
| apply_openocd | No | Also run the OpenOCD capture commands via monitor now (default false). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false, idempotentHint=false, so the safety profile is covered. The description still adds genuine context beyond the schema: no firmware ITM-init is required, it exercises the debugger, it returns OpenOCD capture commands plus a printf retarget snippet, and it needs hardware wiring. It does not explain the destructive aspect in words, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the one-line purpose, followed by the essential mechanics, the next-step routing, and the hardware prerequisite. Every sentence carries distinct information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description steps in to say what is returned (capture commands and firmware snippet), plus the workflow and prerequisite. That covers an agent's needs to call and chain it correctly; only a note on side effects on target state is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all seven parameters are already documented in the schema. The description references hclk_hz and SWO baud but adds no format or constraint detail beyond what the schema provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource immediately: 'One-call SWO/ITM printf setup.' It names exactly what is configured (target's TPIU+ITM from the debugger) and the inputs that drive it (hclk_hz, SWO baud), distinguishing it from generic setup or logging siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit usage routing: 'Then capture with logging(action=start, channel="swo", file=<output>)' names the follow-on tool and params, and it states the prerequisite (SWO pin wired to probe). It lacks an explicit 'do not use when' clause, so not a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
snapshotBRead-onlyIdempotent
One-shot diagnostic snapshot. scope=full([include_project,include_rtos,include_logs,log_limit,project_root]) | rtos. full bundles registers+stack+faults; rtos captures task/queue state.
| Name | Required | Description | Default |
|---|---|---|---|
| scope | Yes | Which operation to perform. | |
| session | No | Optional debug-session name. Omit for the default target. | |
| log_limit | No | Maximum number of RTT log entries to include. | |
| include_logs | No | Include captured RTT logs. | |
| include_rtos | No | Include FreeRTOS runtime context. | |
| project_root | No | Optional project root for discovery. | |
| include_project | No | Include project discovery context. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world, so the safety burden is lifted. The description adds that it is 'one-shot' and what each scope captures, but says nothing about session targeting, cost, or what the capture returns. Moderate additive context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in four words and the rest is dense with no filler. The telegraphic 'scope=full([...]) | rtos' notation is compact but slightly cryptic on first read.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter diagnostic tool with no output schema, the definition explains the scopes but leaves the return shape, the session parameter, and how the capture interacts with active sessions unexplained. Usable, but not fully self-contained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The parenthetical correctly associates include_project/include_rtos/include_logs/log_limit/project_root with the full scope, which adds a little ordering meaning, but it never mentions the session parameter and gives no format or default details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action (one-shot diagnostic snapshot) and enumerates the two scopes with what each collects (registers+stack+faults vs task/queue state). It does not distinguish itself from near-siblings like capture_state or session_diagnostics, which is the only thing keeping it off a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The scope semantics ('full bundles registers+stack+faults; rtos captures task/queue state') imply which mode to pick, but there is no explicit when-to-use/when-not guidance and no mention of the alternative snapshot-style siblings. Adequate implied usage only.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
solve_clock_treeA
Synthesize a concrete SystemClock_Config() for the session's FrameworkPlan (Pillar D Tier 3) - the last hand-written gap in generated init code. Given a clock source (HSE + crystal Hz, or HSI) and a target SYSCLK, it computes the exact PLL dividers (M/N/P or R, Q for 48 MHz USB), AHB/APB bus prescalers, and flash wait-states via pure datasheet math, then stores the result so the next render_framework emits real clock code instead of a TODO stub. Deterministic and honest: an unmodelled device or an infeasible target is surfaced, never guessed. Built-in profiles: STM32F401/F407/F411 and mainstream L4 (<=80 MHz); pass an explicit profile for others. Run design_framework first.
| Name | Required | Description | Default |
|---|---|---|---|
| load | No | Store the solution into the plan so render_framework uses it (default true). | |
| source | No | Clock source: 'HSE' or 'HSI' (default 'HSI'). | |
| profile | No | Optional explicit device profile; overrides the built-in table. | |
| session | No | Target session id (default 'default'). | |
| source_hz | No | HSE crystal frequency in Hz (required when source=HSE). | |
| sysclk_hz | No | Target SYSCLK in Hz (e.g. 168000000). | |
| need_48mhz | No | Require an exact 48 MHz PLL output for USB/SDIO/RNG (default false). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations mark this as a non-read-only, non-idempotent write, and the description adds real context beyond them: the result is stored into the plan unless load=false, the math is 'pure datasheet math', and infeasible or unmodelled targets are surfaced rather than guessed. It never contradicts the annotations. The only gap is that the shape of a 'surfaced' failure is not described, which matters since there is no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded paragraph that starts with the verb and the produced artifact, with zero bare filler. It is dense and carries some flavor phrasing ('the last hand-written gap in generated init code', 'Pillar D Tier 3') that slightly inflates length without adding invocation guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter tool with no output schema, the description covers workflow position, scope limits, determinism guarantees, and the side effect of storing into the plan. Return-value semantics are only implied ('is surfaced'), which is the main remaining hole given the absent output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is already 100%, so the baseline is 3; the description goes further by tying parameters together, explaining that HSE requires a crystal Hz value, that a 48 MHz target drives the R/Q branch, and what 'profile' overrides (the built-in device table). It adds cross-parameter meaning rather than restating field docs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and artifact: 'Synthesize a concrete SystemClock_Config()' for the session's FrameworkPlan, and spells out exactly what gets computed (PLL M/N/P or R/Q, AHB/APB prescalers, flash wait-states). This clearly distinguishes it from siblings like design_framework and solve_timer without needing to open any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the prerequisite ('Run design_framework first') and the follow-on consumer ('the next render_framework emits real clock code'), plus the scope boundary that built-ins cover F401/F407/F411 and mainstream L4 <=80 MHz with an explicit profile needed otherwise. There is no explicit statement of when NOT to use it, so it falls just short of the top band.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
solve_timerA
Solve a timer's Prescaler/Period (PSC/ARR) for a target update frequency (Pillar D Tier 3). Turns intent ('TIM3 at 1 kHz') into concrete register values using the timer input clock (TIMxCLK) derived from the solved clock tree. Record a target via design_framework(design={'TIM3': {'update_hz': 1000}}) then run solve_clock_tree first, or pass timer_clock_hz directly for a what-if. Deterministic and honest: an exact target yields zero-error PSC/ARR, an inexact one yields the closest pair plus the achieved frequency and ppm error, and an unrepresentable target or an unknown timer bus is surfaced, never guessed. Injects the result into the plan so render_framework emits concrete values instead of a TODO.
| Name | Required | Description | Default |
|---|---|---|---|
| bus | No | Override the timer's APB bus: 'apb1' or 'apb2'. | |
| load | No | Persist the solved PSC/ARR into the plan (default true). | |
| timer | No | Timer to solve, e.g. 'TIM3'. Omit to solve every timer that has a recorded target. | |
| session | No | Target session id (default 'default'). | |
| arr_bits | No | ARR width override: 16 or 32 (for 32-bit timers TIM2/TIM5). | |
| target_hz | No | Target update frequency in Hz; overrides the recorded design target (requires timer). | |
| timer_clock_hz | No | Explicit TIMxCLK in Hz; bypasses the clock-solution + bus derivation (pure what-if). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly=false), it discloses that the tool injects results into the plan (a mutation), how it handles exact/inexact/unrepresentable targets, and that unknown timers are surfaced rather than guessed. This is rich, non-obvious behavioral context that the structured fields do not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then workflow and behavior. Mostly earns its space, though minor jargon ('Pillar D Tier 3') adds little. Slightly dense but well-organized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so: it explains the result shape (zero-error PSC/ARR, closest pair with achieved frequency and ppm error) and the downstream effect on render_framework. Nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so parameters are already documented (baseline 3). The description adds the relationship between parameters, describing timer_clock_hz as a what-if bypass of clock derivation and target_hz as an override path, which sharpens usage beyond the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Solve a timer's Prescaler/Period'), names the exact intent-to-registers transformation, and clearly distinguishes itself from siblings solve_clock_tree and design_framework. An agent can tell immediately what this produces.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit sequencing: record a target via design_framework, run solve_clock_tree first, or pass timer_clock_hz directly for a what-if. This routes the agent between prerequisites and an alternative path with no inference required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_acceptance_loopA
Start a bounded spec-to-silicon acceptance loop (Pillar C) for the loaded AcceptanceSpec. Each run_acceptance_iteration does one build → flash → run-to-state → run_acceptance pass; the loop stops on convergence, on max_iterations, or on a stall (same checks failing repeatedly). Omit build/flash to run evaluate-only iterations (you flash manually). Load a spec first.
| Name | Required | Description | Default |
|---|---|---|---|
| build | No | Optional build_firmware config {kind, project|build_dir|directory, target, config, rebuild, command, cwd}. | |
| flash | No | Optional flash+run config {file_path, run_to (default 'main'), timeout_sec}. | |
| session | No | Target session id (default 'default'). | |
| max_iterations | No | Hard bound on iterations (default 10). | |
| stall_patience | No | Stop if the same checks fail this many times in a row (default 3). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only supply the safety profile (non-readonly, non-idempotent, non-destructive). The description adds real behavioral context beyond them: the three termination conditions (convergence, max_iterations, stall), what a stall means ('same checks failing repeatedly'), and the evaluate-only variant. It omits how to observe an in-flight loop or what the run emits, but this is strong disclosure for the core mechanics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, purpose and scope front-loaded, then loop mechanics, then the optional-stage variant. No filler; every sentence carries actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex, multi-object, no-output-schema tool with annotations covering safety, the description is nearly complete: it explains the loop, its stopping rules, the evaluate-only mode, and the spec prerequisite. It could go one step further by pointing to acceptance_loop_status for monitoring a running loop, but nothing required to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description earns above-baseline credit by explaining the semantic effect of omitting build/flash (evaluate-only, manual flash) rather than just restating them. max_iterations and stall_patience semantics are left to the schema, where they are already documented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Start a bounded spec-to-silicon acceptance loop') and scopes it to the loaded AcceptanceSpec. It distinguishes itself from siblings by explaining that each iteration is a composition of build/flash/run-to-state/run_acceptance via run_acceptance_iteration, which no other sibling combines into a loop.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clear when-to-use context: run it against a loaded spec, and the explicit prerequisite 'Load a spec first.' It also documents a meaningful usage mode ('Omit build/flash to run evaluate-only iterations'). It stops short of naming the monitoring/alternative siblings (acceptance_loop_status) that an agent might reach for instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_debug_sessionA
Starts the specified GDB Server (openocd, stlink, jlink) and connects the GDB Client to it. openocd REQUIRES server_args naming the probe and target, e.g. ['-f','interface/stlink.cfg','-f','target/stm32l4x.cfg'] — without them OpenOCD cannot find a config or adapter. Omitted values come from the active debug profile.
| Name | Required | Description | Default |
|---|---|---|---|
| probe | No | Optional OpenOCD probe type: stlink, jlink, or cmsis-dap. Falls back to the profile, then a unique detected probe. | |
| serial | No | Probe/ST-Link serial to select a specific board (for concurrent multi-target). Auto-added as 'adapter serial <serial>'. | |
| session | No | Optional debug-session name. Omit for the default target. | |
| speed_khz | No | OpenOCD adapter clock used when server_args are inferred (default 4000). | |
| hub_channel | No | Take the probe on this hub channel, using the usb_location recorded for it in the profile's hub.map. Falls back to hub.channel, then to the map entry whose label matches this session's name. | |
| server_args | No | Optional args for the server e.g. ['-f', 'interface/stlink.cfg', '-f', 'target/stm32f4x.cfg'] | |
| server_type | No | Type of debug server backend. | |
| usb_location | No | Select the probe by physical USB position, e.g. '1-1.4'. This is how to pick one of several probes that report NO serial number (most clone ST-Links), and unlike hub isolation it disconnects nobody -- two sessions can debug two boards at once. Added as 'adapter usb location <value>'. Usually you want hub_channel instead, which looks this up. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the non-read-only, non-idempotent, non-destructive profile, so the bar is lower; the description still adds value by disclosing a concrete failure mode (OpenOCD without server_args) and the fallback chain to the active profile. It does not say what happens to an already-running server/session, whether a process is spawned, or how failures surface, so it falls short of full disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first clause, followed by the one constraint an agent will most likely trip over and a formatting example. Three sentences, no restatement of the name and no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter, zero-required session-start tool with no output schema, the description covers the essential call-shaping information (backend choice, mandatory openocd args, profile fallbacks). It leaves unclear the interaction with stop_debug_session/close_session and whether a prior session must be closed first, which is the main remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description genuinely adds meaning beyond it: it flags that server_args are mandatory for openocd (the schema calls them merely 'optional'), names the required -f interface/target form, and explains that unspecified parameters are resolved from the active debug profile.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Gives a specific verb (starts) plus two concrete resources (the GDB server and the GDB client connection) and enumerates the supported backends (openocd, stlink, jlink). An agent immediately knows what the tool does, though it never names a sibling such as stop_debug_session or detect_probe to disambiguate the session lifecycle.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description supplies a real precondition — OpenOCD cannot run without server_args naming probe and target, with a concrete example — and notes that omitted values fall back to the active debug profile. However, it gives no guidance on when to prefer this over adjacent tools (suggest_server_args, detect_probe, hub, recover_session); usage is implied rather than routed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stepA
Single-steps the target: kind='over' (over the line), 'into' (into calls), 'out' (run until the function returns), or 'instruction' (one machine instruction; set over=true to step over a call).
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Step kind (default 'over'). | |
| over | No | For kind='instruction', step over a called function. | |
| session | No | Optional debug-session name. Omit for the default target. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the mutation/safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false), lowering the bar. The description adds the semantics of each step mode, which is genuine behavioral content, but does not state prerequisites (an active session must exist) or what happens on failure. Adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence, front-loaded with the verb, packing all four mode definitions without waste. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a step tool with full schema coverage, complete annotations, and no output schema, the description covers the mode space well. Minor gaps remain around session prerequisites and post-step state, but nothing critical for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real value the schema lacks: it documents each enum value of kind ('over', 'into', 'out', 'instruction') and explains the interaction of over=true with kind='instruction', which the schema's terse per-field descriptions do not cover.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Single-steps the target') and enumerates all four step kinds with their semantics. An agent immediately understands the operation. It does not name sibling alternatives like run_to_line, continue_execution, or debug_until, so it misses the top-tier sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The per-mode glosses ('into calls', 'run until the function returns') imply when each kind is appropriate, which gives usable context. But there is no explicit when-to-use-this vs alternatives guidance, e.g. versus run_to_line or debug_until. Usage is inferable rather than declared.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stop_debug_sessionB
Stops the GDB client/server, variable tracking, and all active RTT/SWO/UART readers.
| Name | Required | Description | Default |
|---|---|---|---|
| session | No | Optional debug-session name. Omit for the default target. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false), so the bar is lower; the description goes further by naming exactly which subsystems are terminated (GDB client/server, variable tracking, all active RTT/SWO/UART readers). This is useful context beyond the annotations, though it sits in mild tension with destructiveHint=false since live streams are being torn down.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One tightly written sentence with the action verb front-loaded and no redundant filler. It is efficient, though the trailing enumeration makes it slightly list-like rather than fully structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-required-param tool with annotations and no output schema, the description is adequate about what gets stopped, but it omits post-stop state (are sessions cleared or recoverable?), whether it acts on a named session vs default, and how it relates to close_session/recover_session.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single optional 'session' parameter is already documented as omitting to the default target. The description adds no additional parameter semantics, so the baseline 3 for a fully-covered schema is correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ("Stops") plus the resource ("debug session") and enumerates the concrete components torn down (GDB client/server, variable tracking, RTT/SWO/UART readers). That makes the operation's scope clear, but it does not differentiate itself from the sibling close_session, which appears to be an overlapping teardown concept.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use or when-not-to-use guidance is given, and the prominent sibling close_session is never mentioned, so an agent cannot tell which teardown tool applies to its situation. Only an implicit 'clean up after debugging' reading is available.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
suggest_server_argsARead-onlyIdempotent
Returns the correct OpenOCD server_args for an MCU family + probe (e.g. STM32L431 + stlink -> ['-f','interface/stlink.cfg','-f','target/stm32l4x.cfg']) and validates the config files exist in OpenOCD's bundled scripts dir. Call this to get start_debug_session args — do NOT search the disk for .cfg files.
| Name | Required | Description | Default |
|---|---|---|---|
| mcu | Yes | MCU or family, e.g. 'STM32L431' or 'STM32F4'. | |
| probe | No | Optional. Debug probe: stlink, jlink, or cmsis-dap. If omitted, uses debug profile probe. | |
| session | No | Optional debug-session name. Omit for the default target. | |
| speed_khz | No | Adapter clock in kHz (default 4000; 0 keeps the config default). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description adds real behavioral context beyond that: it validates that the referenced .cfg files exist in OpenOCD's bundled scripts dir, implying a possible failure mode, and shows the exact arg vector returned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences: the capability and its example come first, the routing instruction second. No filler, and the most actionable line (call this, don't scan disk) is kept intact.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully previews the return shape via example args and notes validation of config files. It is nearly complete, though it doesn't say what happens when validation fails or when the MCU/probe pair is unsupported.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and each parameter already has a description, so the baseline is 3. The worked example ('STM32L431 + stlink -> [...]') loosely illustrates how mcu and probe combine, but adds no syntax or default detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (returns OpenOCD server_args for an MCU family + probe) and illustrates it with a concrete input/output example. It also names its downstream consumer (start_debug_session args), which separates it from siblings like detect_probe or describe_board.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit call condition ('Call this to get start_debug_session args') plus a clear exclusion ('do NOT search the disk for .cfg files'). An agent knows both when to reach for it and what anti-pattern to avoid.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
synthesize_acceptanceA
Auto-derive a machine-checked AcceptanceSpec from the synthesized FrameworkPlan (Pillar D Tier 3) and load it as the session's acceptance judge — welding design synthesis to the acceptance loop. Always emits a no_fault check (init must not HardFault); adds a memory_u32 bits_set check per clock the plan enables (RCC enable bit), a memory_u32 bits_set check per interrupt the plan enables (arch-standard NVIC ISER bit, from the resolved IRQ number), and a masked memory_u32 eq check per configured pin (GPIO MODER = AF/analog; F1's CRL/CRH is skipped). Register/IRQ/port placements come from the session's loaded SVD or explicit register_map/irq_map/gpio_map; anything unresolvable is surfaced, never guessed. Each derived check also carries source provenance (the init function + line that should satisfy it), so a later failure points straight at the fix site. Run design_framework first; load an SVD (start_debug_session/set svd) for clock/NVIC/GPIO checks.
| Name | Required | Description | Default |
|---|---|---|---|
| load | No | Load the derived spec as the session acceptance judge (default true). | |
| name | No | Optional spec name. | |
| irq_map | No | Optional explicit IRQ numbers {line_or_family: {irq_name: number}} (name with or without _IRQn); overrides the SVD. | |
| session | No | Target session id (default 'default'). | |
| gpio_map | No | Optional explicit GPIO port bases {line_or_family: {port_letter: MODER_address}}; overrides the SVD. | |
| stopped_at | No | Optional symbol to also assert the PC reached after init (e.g. 'main'). | |
| include_gpio | No | Emit GPIO MODER checks for configured pins (default true). | |
| include_nvic | No | Emit NVIC ISER checks for enabled interrupts (default true). | |
| register_map | No | Optional explicit RCC placements {line_or_family: {clock: {address, bit}}}; overrides the SVD. | |
| include_no_fault | No | Emit the no_fault check (default true). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations only covering the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false), the description adds substantial behavioral detail: exactly which checks are emitted (no_fault, per-clock RCC bits_set, per-IRQ NVIC ISER, per-pin GPIO MODER), that unresolvable items are surfaced rather than guessed, and that each check carries source provenance pointing at the fix site. This is rich context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose in the first sentence, followed by the emitted checks, provenance behavior, and prerequisites. It is dense and jargon-heavy with long parentheticals, but every sentence carries distinct information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 10-parameter tool with no output schema, the description adequately explains what is produced (the derived check set and its provenance) and what setup is required. It does not detail the returned object's shape or failure semantics when nothing is resolvable, leaving a small gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all 10 parameters, giving a baseline of 3. The description adds the SVD-vs-explicit-map precedence relationship (register_map/irq_map/gpio_map override the SVD), which is useful but largely mirrors what the schema descriptions already state.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb and resource: auto-derive a machine-checked AcceptanceSpec from the synthesized FrameworkPlan and load it as the session acceptance judge. It even distinguishes itself from siblings by referencing design_framework (the input producer) and the acceptance loop, so an agent knows this is the synthesis bridge, not load_acceptance or run_acceptance.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit prerequisites: 'Run design_framework first; load an SVD (start_debug_session/set svd) for clock/NVIC/GPIO checks.' This names the ordering dependency and the setup alternative. It lacks an explicit when-not (e.g., 'if you already have a spec, use load_acceptance instead'), which keeps it from a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
timeoutsB
GDB operation timeouts. action=get | set(overrides). overrides={connect,reset,memory,...} in seconds.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Which operation to perform. | |
| session | No | Optional debug-session name. Omit for the default target. | |
| overrides | No | Map of timeout name -> seconds, e.g. {"memory": 4.0, "connect": 8.0}. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, destructiveHint=false and idempotentHint=false, so safety profile is partly covered. The description adds useful behavioral context by stating overrides are 'in seconds', but omits whether settings are session-scoped, persistent, or what happens to unlisted timeouts. With annotations present, a 3 fits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact fragments, front-loaded with the resource and operations. Nothing is wasted, though the telegraphic style leaves little room for the guidance an agent would benefit from.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter tool with full schema coverage and no output schema, the definition is minimally viable but does not explain what 'get' returns or how the overrides map behaves across sessions. Adequate, with clear gaps in behavioral framing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents action, session, and overrides. The description adds the hint that more keys exist beyond connect/reset/memory ('...') and reinforces the seconds unit, but this largely duplicates the schema's own example.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource ('GDB operation timeouts') and two explicit operations ('action=get | set(overrides)'), so an agent knows exactly what this tool manipulates. It does not name or differentiate itself from any sibling, but the resource is distinctive enough to stand apart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives syntax ('action=get | set(overrides)') but no guidance on when to use this tool, when not to, or what alternatives exist for adjusting debug behavior. An agent must infer the use case entirely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tool_helpARead-onlyIdempotent
Returns descriptions and complete schemas for full-surface tools, including tools hidden in compact mode.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Exact tool name. | |
| query | No | Case-insensitive name/description search. | |
| session | No | Optional debug-session name. Omit for the default target. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, so the safety/behavior profile is fully covered. The description adds a genuine piece of context—that tools hidden by compact mode surface here—but says nothing about return shape, size limits, or behavior on an unknown name.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler—appropriate for a simple discovery tool. Minor deduction because 'full-surface tools' is unglossed jargon an agent may not resolve without outside knowledge.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description does state what is returned (descriptions and complete schemas), covering the return-value burden, and annotations cover safety. It falls short only on operand interaction (name/query/session) and behavior for unmatched lookups.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters (name, query, session) are documented in the schema; baseline 3 applies. The description adds no meaning about the parameters—notably not clarifying whether name and query are mutually exclusive or combinable.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (returns descriptions and complete schemas for tools) and adds a distinguishing scope note ('including tools hidden in compact mode'). However, it does not name or differentiate itself from closely related siblings like mcp_info or call, which an agent browsing tool-discovery options would need.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the compact-mode reference hints at when this is needed (when a tool isn't visible), but there is no explicit when-to-use, when-not-to-use, or alternative (e.g., mcp_info) guidance. Nothing tells the agent how name vs query should be chosen.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
track_variableA
Background variable tracking: action='start' (needs variable + interval_ms), 'stop', or 'get' (returns the sampled data for trend/leak analysis).
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | What to do. | |
| session | No | Optional debug-session name. Omit for the default target. | |
| variable | No | For 'start': the variable/expression to sample. | |
| interval_ms | No | For 'start': polling interval in ms. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, idempotentHint=false and destructiveHint=false, so the agent knows this mutates state non-destructively. The description adds that tracking runs 'in the background' and that 'get' returns samples for trend/leak analysis, but is silent on resource cost, whether a running tracker must be stopped, or interval limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence that front-loads the tool's nature and then maps each action to its inputs/effect. No filler, and the most important scope statement leads.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does explain what 'get' produces (sampled data for trend/leak analysis). It omits what 'stop' or 'start' return and the default-session behavior, leaving minor gaps for a 4-parameter tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the baseline is 3, and the description adds conditional parameter meaning: 'start' specifically requires variable + interval_ms, and 'get' returns sampled data. This clarifies where the schema just says 'For start: ...' without linking the pairing requirement.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Background variable tracking') and enumerates the three actions with their effects, so an agent understands this is a polled-sampler rather than a one-shot read. It does not explicitly name sibling read_variable, so the differentiation from a simple read is only implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The per-action semantics (start/stop/get) imply the workflow of starting a tracker, stopping it, and then fetching samples. However, there is no explicit guidance on when to prefer this over read_variable or how the background tracking interacts with the debug session lifecycle.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
typed_memoryBDestructive
Typed (struct-aware) memory access. action=read(address,width_bits,count) | write(address,value,width_bits). width_bits=8|16|32|64.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | Number of elements to read. | |
| value | No | Value to write, e.g., '0x12345678'. | |
| action | Yes | Which operation to perform. | |
| address | No | Hex address to read from, e.g., '0x20000000'. | |
| session | No | Optional debug-session name. Omit for the default target. | |
| width_bits | No | Element width in bits. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=false and openWorldHint=false, so the safety profile is carried by structured data. The description adds the typing constraint ('struct-aware', width_bits values) but says nothing about write semantics, alignment requirements, or the optional session parameter's effect, so it adds only modest behavioral context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short, front-loaded sentences with no filler: purpose first, then the allowed signatures and value constraint. The pipe/equals notation is compact though slightly terse for reading, keeping it just below maximally clear.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter, dual-mode tool with no output schema, the description covers the required-parameter model but omits return values, error behavior on misaligned/out-of-range addresses, and how 'typed' semantics differ from the raw memory tools. Annotations cover the safety side, so this is adequate but visibly incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description restates the read/write parameter signatures and the width_bits enumeration, both of which are already expressible from the oneOf branches and the enum, so it adds little meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives specific verbs and resource ('Typed (struct-aware) memory access') plus the concrete signatures for read and write, so an agent knows exactly what operations it performs. However, it never distinguishes itself from the sibling tools read_memory and write_memory; the only differentiation is the vague parenthetical 'struct-aware', which the agent must interpret on its own.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use guidance, no statement of preconditions (a live debug session is implied by the sibling set but not stated), and no comparison to the raw read_memory/write_memory alternatives. Usage is only inferable from the action syntax, which the schema already provides.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_boardARead-onlyIdempotent
Validate the imported BoardDescription: detect a package pin wired to multiple nets (short), a peripheral signal routed to multiple pins, a port pin driven by multiple nets, and missing power/ground/debug/reset nets. With a pin-capability DB (db_path or the STM32_GDB_MCP_PIN_DB env) it also checks alternate-function legality; unknown pins degrade to 'unverified', never a false conflict. Run import_netlist first.
| Name | Required | Description | Default |
|---|---|---|---|
| db_path | No | Optional JSON pin-capability DB (CubeMX-derived) for AF-legality checks. | |
| session | No | Target session id (default 'default'). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations' read-only/idempotent/non-destructive profile, the description explains detailed validation behavior and fallback semantics: unknown pins degrade to 'unverified' rather than being reported as conflicts. That is exactly the kind of behavioral context an agent needs to interpret results correctly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first clause, validation specifics follow in a compact list, and the prerequisite is placed at the end. Despite covering several checks and a fallback rule, every clause carries useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description thoroughly explains what is validated and how the optional DB affects results. It does not describe the return format or how findings are reported, which is a minor remaining gap for a validation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented. The description still adds meaning for db_path by noting the STM32_GDB_MCP_PIN_DB environment fallback, which the schema does not mention. The session parameter receives no extra description, keeping this from a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (Validate) and resource (imported BoardDescription), then enumerates the exact conflict classes it detects: package-pin shorts, peripheral fanout, port-pin conflicts, and missing power/ground/debug/reset nets. It clearly distinguishes itself from import_netlist by naming the prerequisite.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit prerequisite: 'Run import_netlist first.' It also clarifies the optional DB condition for AF-legality checks. It does not name a direct alternative or state when not to use this tool, but the operational context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_flashARead-onlyIdempotent
Verifies that target flash matches an ELF (GDB compare-sections). Compares read-only sections, which is what lives in flash; writable sections hold the ELF's initial RAM values and always differ once the firmware has run, so including them would fail every healthy target. Pass include_writable=true only right after a load, before the target has executed.
| Name | Required | Description | Default |
|---|---|---|---|
| session | No | Optional debug-session name. Omit for the default target. | |
| file_path | Yes | Path to the ELF to verify against. | |
| include_writable | No | Also compare writable (RAM) sections. Only meaningful immediately after a load. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false. The description adds real context beyond that: it discloses which sections are compared, why writable sections are excluded (they always differ post-execution), and the failure mode of including them. It stops short of describing the result/failure output, but the behavioral disclosure is well above the annotation baseline.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences with the core purpose front-loaded, followed by the key default-behavior decision and the exception. Every sentence carries information; none restate the schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a verification tool with no output schema, the description covers the operation, defaults, and the critical parameter decision thoroughly. Its one gap is not indicating what the verification returns (pass/fail shape, mismatch reporting), which the absent output schema leaves to the description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters (baseline 3). The description adds genuine semantic value by explaining what comparing read-only vs writable sections means and precisely when include_writable is meaningful, going beyond the schema's terse 'Only meaningful immediately after a load.'
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Verifies that target flash matches an ELF') and grounds it in a known mechanism (GDB compare-sections). This clearly distinguishes it from sibling write operations like flash_firmware and flash_erase.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when the default behavior applies (read-only sections always) and gives a precise when-to-use and when-not-to-use rule for include_writable: 'only right after a load, before the target has executed.' The rationale for exclusion is spelled out rather than left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wait_for_stopARead-onlyIdempotent
Waits for the next stop event WITHOUT resuming the target, returning a structured stop event or a timeout.
| Name | Required | Description | Default |
|---|---|---|---|
| session | No | Optional debug-session name. Omit for the default target. | |
| timeout_sec | No | Max seconds to wait for a stop (default 10). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly, idempotent, and non-destructive behavior. The description adds genuinely useful context beyond them: it does not resume the target and yields either a structured stop event or a timeout. It stops short of explaining what conditions trigger a stop or whether the call blocks.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the critical non-resuming constraint placed first and zero wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does name the two outcomes (structured stop event or timeout). For a 2-param, fully annotated, all-optional tool this is nearly complete, though the exact stop-event shape remains unspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with both parameters documented (session and timeout_sec). The description adds no syntax or default details beyond the schema's own '(default 10)' and 'Omit for the default target', so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (waits) and resource (next stop event), and the key differentiator 'WITHOUT resuming the target' separates it from resuming siblings like continue_execution or run_and_wait. It does not name a specific sibling, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'WITHOUT resuming the target' implies when this tool is appropriate (observing a stop without advancing execution), but there is no explicit when-to-use, when-not-to-use, or named alternative among the many run/step siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
write_guardC
Memory-write guardrail. action=policy([mode,add_allow,add_protected]) | audit([limit]). mode=enforce|dry_run.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Guard mode. | |
| limit | No | Return only the most recent N entries. | |
| action | Yes | Which operation to perform. | |
| session | No | Optional debug-session name. Omit for the default target. | |
| add_allow | No | Regions to explicitly allow, overriding protection. | |
| add_protected | No | Additional regions to protect from writes. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, destructiveHint=false, and idempotentHint=false, so the safety profile is covered structurally. The description adds almost nothing behavioral beyond restating the dry_run/enforce enum, already present in the schema — no mention of persistence of added regions, session scope, or what audit returns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then a compact action/parameter map. It is efficient, though the telegraphic notation trades clarity for brevity and could be slightly more readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter configuration tool with full schema coverage and no output schema, the definition covers the action-parameter relationship but omits return-value expectations, whether policy changes persist, and how session scoping interacts with the default target. Adequate but with clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description meaningfully maps parameters to actions (policy takes mode/add_allow/add_protected; audit takes limit), which the oneOf schema does not disambiguate. This is genuine added value beyond the structured data.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states 'Memory-write guardrail', which conveys the general domain, and it names two operations (policy, audit). However, it never says in plain language what 'policy' or 'audit' actually do — the purpose is expressed only through compressed notation, and it does not differentiate this tool from siblings like write_memory or configure_debug_freeze.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to choose policy vs audit, no prerequisites, and no mention of alternative tools. The action list implies two modes of operation but leaves all selection logic to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
write_memoryCDestructive
Writes a value to a specific memory address.
| Name | Required | Description | Default |
|---|---|---|---|
| value | Yes | Value to write, e.g., '0xFF' or '1234'. | |
| address | Yes | Hex address to write to, e.g., '0x20000000'. | |
| session | No | Optional debug-session name. Omit for the default target. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false, and idempotentHint=false, covering the safety profile. The description adds nothing further: it doesn't state that existing memory is overwritten, whether the write is verified, or any failure behavior. For a destructive hardware write, this is a meaningful gap beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no wasted words. Efficient, though its brevity borders on under-specification rather than deliberate conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive memory-mutation tool with no output schema, the description should address write confirmation, alignment/addressing constraints, or guarded alternatives like write_guard. None are mentioned, leaving the definition incomplete for a low-level write operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so address, value, and session are fully documented in the schema with format examples. The description adds no additional parameter meaning. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear specific verb+resource: 'Writes a value to a specific memory address.' An agent understands it mutates target memory. However, it does not differentiate from close siblings like typed_memory (typed writes) or write_guard (guarded writes), so scope against alternatives is unstated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use, prerequisites, or alternatives. With read_memory, typed_memory, and write_guard as siblings, the description never indicates which to choose, when writes are unsafe, or whether verification is needed. Pure absence of guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
86 tool updates
v0.15.1- First observed
acceptance_loop_status - First observed
analyze_stack - First observed
batch - First observed
breakpoint - First observed
build_firmware - First observed
call - First observed
call_read - First observed
capture_state - First observed
clear_session_journal - First observed
close_session - First observed
configure_debug_freeze - First observed
continue_execution - First observed
coredump - First observed
debug_config - First observed
debug_profile - First observed
debug_until - First observed
decode_peripheral_register - First observed
describe_acceptance - First observed
describe_board - First observed
describe_framework - First observed
design_framework - First observed
detect_probe - First observed
detect_rtos - First observed
diagnose_fault - First observed
disassemble - First observed
export_debug_report - First observed
expressions - First observed
flash_and_run - First observed
flash_erase - First observed
flash_firmware - First observed
frame - First observed
get_session - First observed
halt_execution - First observed
hub - First observed
import_netlist - First observed
import_spec - First observed
inspect_project - First observed
inspect_symbol - First observed
list_sessions - First observed
load_acceptance - First observed
load_device_pack - First observed
load_svd - First observed
load_symbols - First observed
logging - First observed
mcp_info - First observed
read_call_stack - First observed
read_freertos - First observed
read_memory - First observed
read_peripheral_register - First observed
read_registers - First observed
read_variable - First observed
reconstruct_fault_context - First observed
recover_session - First observed
render_framework - First observed
report_issue - First observed
reset_target - First observed
run_acceptance - First observed
run_acceptance_iteration - First observed
run_and_wait - First observed
run_for_duration - First observed
run_pipeline - First observed
run_scenario - First observed
run_to_line - First observed
sample_pc - First observed
self_check - First observed
session_diagnostics - First observed
set_adapter_speed - First observed
setup_swo - First observed
snapshot - First observed
solve_clock_tree - First observed
solve_timer - First observed
start_acceptance_loop - First observed
start_debug_session - First observed
step - First observed
stop_debug_session - First observed
suggest_server_args - First observed
synthesize_acceptance - First observed
timeouts - First observed
tool_help - First observed
track_variable - First observed
typed_memory - First observed
validate_board - First observed
verify_flash - First observed
wait_for_stop - First observed
write_guard - First observed
write_memory
TDQS
Scored across 86 tools
Many tools overlap in the run/stop/context-capture space (run_and_wait, wait_for_stop, continue_execution, run_for_duration, run_to_line, capture_state) and multiple meta-call tools (call, call_read, batch, tool_help) create selection ambiguity. Descriptions are detailed enough to mostly disambiguate, but with 86 tools an agent can still easily misselect.
Most names follow a predictable snake_case verb_noun pattern (start_debug_session, read_memory, flash_firmware, solve_clock_tree). A minority are single-noun mega-tools (hub, breakpoint, expressions, logging, frame, snapshot), which is a minor deviation but still readable and internally consistent within that subset.
86 tools is far beyond the well-scoped 3-15 range and is too many even for this broad server. Although it spans debug, build, board design, acceptance loops, and USB hub control, the surface is unwieldy and likely to overwhelm clients and agents; consolidation into more action-parameter mega-tools is needed.
The tool surface covers the embedded debug lifecycle comprehensively: sessions, flashing, symbols, memory/registers, breakpoints, RTOS, SVD, fault/stack recovery, logging, profiling, coredump, acceptance loops, netlist-to-framework design, clock/timer solving, and hub power control. No obvious domain gap remains for the stated STM32 GDB/debug-and-build purpose.
Maintenance
Related MCP Connectors
Run, build, and validate firmware on virtual hardware from your AI agent. Hardware knowledge corpus.
Code intelligence platform for AI agents. 20 tools for architecture, security & impact analysis.
Deterministic reasoning stack for AI agents: simulate, decide & compute, plus cross-domain tools.
Drive real devices from your AI Coding tool. Embed a client SDK (Unity, Godot, Flutter, iOS/macOS, Android, React Native, Web) in your app, then capture screenshots, traverse the UI tree, inject taps and key events, and run automated test tasks on the physical device over a secure relay.
Related MCP Servers
- FlicenseAqualityDmaintenanceEnables AI agents to debug embedded systems by providing a comprehensive interface for GDB operations across multiple architectures like ARM and x86. It supports remote debugging via gdbserver or QEMU, allowing for detailed inspection of memory, registers, stack frames, and variables.31-
- AlicenseAqualityDmaintenanceEnables AI assistants like Claude to directly debug microcontrollers via JLink, supporting breakpoints, single-step, memory/register access, variable inspection, RTT logging, and firmware flashing.257MIT
- AlicenseAqualityCmaintenanceEnables AI tools to perform full-featured embedded microcontroller debugging via pyOCD and CMSIS-DAP probes, including probe management, flashing, breakpoints, register/memory access, fault analysis, and RTT communication.581MIT

sbl-debuggerofficial
AlicenseNot gradedqualityDmaintenanceEnables AI assistants to debug ARM Cortex-M targets via GDB and OpenOCD, supporting attach, breakpoints, stepping, register/memory inspection, and SVD peripheral decoding.MIT