OpenBaud
OpenBaud
Turn serial hardware into reusable, auditable tools for coding agents.
OpenBaud gives Codex structured access to local serial devices. Inside an agent task, it makes hardware actions visible and auditable, returns structured results instead of byte dumps, and turns verified exploration into durable tools. It combines an MCP server with device profiles, typed commands, workflows, lossless captures, byte-exact replay, and a hardware-exploration skill.

Watch the 46-second PV · Try without hardware · Install for Codex
Why OpenBaud
A serial terminal can send bytes. An ad-hoc script can make one device work. OpenBaud keeps the evidence that makes the result repeatable:
Explore safely: identify ports by USB metadata, frame responses, audit writes, and require explicit acknowledgement for dangerous commands.
Sediment knowledge: turn verified behavior into typed, reviewable YAML commands and fixed workflows with provenance.
Parse real protocols: validate checksums and decode scalars, bit fields, split lists, and record arrays into structured results — including data a device pushes on its own, checked frame by frame.
Refuse what would be wrong: a command declares the device state it depends on (
requires), and is refused before a byte is sent when the session has not established that state — instead of returning a valid frame that means something else.Replay without hardware: record every RX/TX byte in
.obcap, then rerun the same command and parser against the capture.
serial device → lossless capture → checksum → typed parse → command → replayRelated MCP server: sbl-probe
Real ESP32 demo
The product video uses a physical ESP32-S3 development board running a new binary protocol, OBP/1. OpenBaud recorded eight hardware exchanges and decoded every 196-byte response into 36 polar points with CRC-16 verification.
The USB transport, board timestamps, frames, captures, and parsing are real.
The radar scene is generated by the test firmware, and that fact is declared on
the wire as simulated_scene: 1.
Run the exact parser against the included real-device capture:
cargo run --locked -p openbaud -- run openbaud-pv-board/obp1_radar_scan \
--workspace examples/pv-demo \
--port replay:captures/obp1-radar-seq42.obcap \
--set seq=42Expected result: outcome: normal, seq: 42, point_count: 36, and 36
decoded {angle_deg, distance_mm, intensity} records. The
example workspace includes the command, protocol layout,
and lossless capture.
Install the Codex plugin
Register this Git repository as the openbaud-marketplace marketplace and
install its plugin:
codex plugin marketplace add Leonezz/openbaud --ref stable
codex plugin add openbaud@openbaud-marketplaceStart a new Codex task, connect a serial device, then ask:
Use OpenBaud to identify this serial device. Start read-only, preserve a
capture, and turn verified behavior into reusable commands.The stable marketplace plugin bundles all five native MCP runtimes and selects the matching one locally at startup. Users need Node.js 18 or newer for the portable launcher, but do not need Rust, Cargo, Homebrew, an install hook, or a runtime download. The supported hosts are macOS ARM64/Intel, Linux x64/ARM64, and Windows x64. macOS binaries are ad-hoc signed for preview distribution but are not yet Apple-notarized.
The stable branch advances only after every native package and the aggregated
plugin pass their smoke tests. To refresh it immediately, run:
codex plugin marketplace upgrade openbaud-marketplaceStart a new task after an update. For an immutable installation, download the versioned universal or host-specific marketplace archive from GitHub Releases and register its extracted local path.
See plugins/openbaud/README.md for platform archives, upgrade instructions, packaging details, and smoke tests.
Knowledge format
An OpenBaud workspace keeps device knowledge next to the project:
devices/<device>/profile.yaml
devices/<device>/commands/*.yaml
devices/<device>/workflows/*.yaml
devices/<device>/notes.md
captures/*.obcap
.openbaud/audit.jsonl
reports/ # derived analysis for people, citing the captures it came from
scripts/ # one-off analysis helpers; device behavior belongs in commandsThe schema MCP tool and openbaud schema CLI command are the authority for
the current profile, command, and workflow formats.
Build and verify
cargo test --workspace
python3 scripts/validate-package.py
python3 -m unittest scripts/test_package_plugin.py
node --test scripts/test-plugin-launcher.mjs
plugins/openbaud/scripts/build-runtime
plugins/openbaud/scripts/smoke-testGitHub Actions runs Clippy, package validation, native builds, tests, archive
verification, and real MCP smoke tests on macOS ARM64/Intel, Linux x64/ARM64,
and Windows x64. Stable vMAJOR.MINOR.PATCH tags publish all five platform
archives, one universal marketplace archive, and SHA-256 files. The release
workflow then advances the stable marketplace branch to that verified
universal bundle.
The Remotion source and real capture used to produce the public video live in
media/pv. Regenerate its data with pnpm extract, preview with
pnpm studio, and render with pnpm render.
Safety
Serial writes can reconfigure or actuate physical hardware. OpenBaud marks raw
writes and device commands as potentially destructive MCP operations, keeps an
append-only audit, and requires explicit acknowledgement for commands declared
with risk: danger. Commands that declare requires are refused until the
session has established that device state; overriding with
assume_preconditions is recorded in the result and the audit. Start unknown
devices read-only and preserve a recovery path before changing state.
License
MIT
Available Tools
18 toolsask_portARead-only
Ask the user which serial port to use, on hosts that can render it (elsewhere the candidate list comes back as text for you to relay). Use it when several ports could plausibly be the device and the choice is the user's to make — not for your own discovery, which is what list_ports is for. This does not touch hardware: the user's choice arrives in your context, and you then call open yourself.
| Name | Required | Description | Default |
|---|---|---|---|
| device | No | Workspace device you are looking for a port for | |
| reason | No | Why you are asking, shown to the user |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/openWorld annotations, it discloses three non-obvious behaviors: no hardware is touched, the fallback rendering path returns the candidate list as text to relay, and the agent must call `open` itself afterward. This is exactly the kind of control-flow context annotations cannot 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?
Three sentences, each load-bearing: the action, the host-dependent fallback, the selection criterion, and the follow-up call. Scoping and the alternative are front-loaded.
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-param tool with no output schema and full annotation coverage, this covers purpose, fallback behavior, decision criteria, and the required next step. 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 description coverage is 100% and both parameters are documented there; the description adds no per-parameter syntax or format detail. 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?
States a specific verb and resource ('ask the user which serial port to use') and immediately distinguishes itself from list_ports, so an agent can route between them 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?
Explicit when-to-use ('when several ports could plausibly be the device and the choice is the user's to make') and explicit when-not ('not for your own discovery, which is what list_ports is for'), naming the alternative tool directly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
capture_framesARead-only
Re-frame a recorded capture's byte stream: tx and rx each run through a deframer and come back as timestamped frames, paginated by cursor/max_frames. Framing comes from the explicit framing object or the named device's profile — one of the two is required, nothing is assumed. Idle-gap framing is driven by the recorded timestamps, so boundaries match what a live session would have produced. Reads captures/.obcap — no hardware. The result declares view:{kind:"capture"} for show_result.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Capture file directly under captures/ | |
| to_ms | No | Only frames at or before this wall-clock ms | |
| cursor | No | Continue a previous page: the next_cursor it returned | |
| device | No | Workspace device whose profile framing to deframe with | |
| framing | No | One of {delimiter}|{idle_ms}|{length_prefix:{header_len,len_at,len_size,endian,extra}}; overrides device | |
| from_ms | No | Only frames at or after this wall-clock ms | |
| max_frames | No | ||
| max_inline_bytes | No | Result JSONs longer than this many bytes are written in full to .openbaud/out/ and returned as a summary carrying a full_result path — keeps huge payloads out of your context. Raise it to force large results inline. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/non-destructive annotations: it discloses pagination (cursor/max_frames), that idle-gap boundaries mirror a live session, that framing is required and never assumed, and that oversized JSON is offloaded to .openbaud/out/ with a summary plus full_result path. It also declares the view:{kind:"capture"} routing for show_result.
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 but front-loaded, leading with the core operation before constraints. Every sentence carries information (framing requirement, no hardware, timestamp-driven boundaries, view routing), though the density borders on terse for an 8-parameter tool.
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 nested-object, 8-param tool with no output schema, the description covers the key return behaviors (paginated timestamped frames, offload-to-file summaries, view hint) and the framing resolution rule. A little more on the shape of each frame could help, but the essential calling context is present.
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 88% schema coverage the baseline is 3, but the description adds real value: the framing-overrides-device precedence, the idle-gap/timestamp semantics that drive from_ms/to_ms boundaries, and the cursor-based pagination intent. These clarify how the documented params interact rather than merely restating them.
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: re-framing a recorded capture's byte stream into timestamped frames, split by tx and rx. This clearly distinguishes it from capture_start/capture_stop (live capture) and diagnose_frame (single frame analysis). An agent knows exactly what operation this is.
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 strong context: it reads captures/<file>.obcap with no hardware, and requires either an explicit framing object or a named device profile ('one of the two is required, nothing is assumed'). This tells the agent when it applies (post-capture, file-based) but stops short of explicitly naming which sibling to use instead for live capture.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
capture_startA
Start lossless timestamped capture of all rx/tx on a session into captures/*.obcap (JSONL). Returns the workspace-relative path (captures/ — pass it verbatim to capture_frames, session_timeline, or replay:) plus abs_path.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | ||
| session_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare it is a non-readonly, non-destructive, closed-world operation, but the description adds real substance: capture is lossless and timestamped, covers all rx/tx, writes JSONL into captures/*.obcap, and returns both a workspace-relative and absolute path. It still doesn't say how the capture terminates or any storage/overhead implications, so it is good 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?
Two dense sentences with no filler, behavior front-loaded and return/chaining details second. The parenthetical path-routing list is compact but slightly crammed, keeping it just under ideal.
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 correctly carries the return payload (relative path + abs_path). For a stateful capture-start tool it covers what is captured and how to consume the result, but omits parameter meaning and the lifecycle relationship with capture_stop.
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 0% for both parameters, and the description never explains session_id (only alludes to 'a session') or the optional note field. With two undocumented parameters, the description fails to compensate for the schema gap.
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 (Start) and resource (lossless timestamped capture of all rx/tx on a session), names the output artifact (captures/*.obcap, JSONL), and is clearly distinguishable from siblings capture_stop and capture_frames.
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 concrete downstream usage — pass the returned path verbatim to capture_frames, session_timeline, or replay:<path> — which orients the agent on when this tool fits in a workflow. It stops short of stating when NOT to use it or explicitly contrasting with capture_stop/other starting points, so it lacks full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
capture_stopA
Stop the active capture on a session; returns stats plus the workspace-relative path (captures/ — directly usable with capture_frames, session_timeline, and replay:) and abs_path.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish the safety profile (readOnlyHint=false, destructiveHint=false, openWorldHint=false), so the bar is lower. The description adds real post-condition context that annotations lack: it returns stats plus a workspace-relative path and abs_path, and confirms the captured artifact persists and is reusable by other tools.
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; the core action leads and the return-value detail follows. The nested parenthetical with three tool names is dense but every clause carries usable 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 correctly carries the return-value burden, describing stats and both path forms. Annotations cover safety, so the only gap is not stating the precondition failure mode when no capture is active.
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 0%, so the description must compensate for the single session_id parameter. It only says 'on a session' and never names or qualifies session_id (e.g., that it is the id from capture_start), so it adds little beyond the schema's type declaration.
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 ('Stop') and resource ('the active capture on a session'), which cleanly distinguishes it from the sibling capture_start. An agent can tell what it 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?
Usage is clearly implied by 'the active capture' (i.e., use after capture_start while a capture is running), and the description routes the agent downstream by naming capture_frames, session_timeline, and replay:<path>. It does not state what happens if no capture is active, so no explicit exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
closeB
Close a session and release the port.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description usefully adds that the port is released, a real side effect not visible in annotations, but says nothing about whether session data persists, whether closing an already-closed session errors, or what the result looks like.
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, front-loaded with the action and resource, with the side effect following. 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 minimal one-parameter tool with no output schema this is close to adequate, but it omits the error/edge behavior (double close, invalid id) and any indication of what the caller should do after closing, leaving gaps for an agent sequencing sessions.
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 0% and the single session_id parameter has no schema documentation. The description implicitly identifies which session is affected ('a session'), which is self-evident for a one-parameter close tool, but adds no format, source, or validity 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 verb (close) and resource (session) plus the side effect of releasing the port. It is clearly the counterpart to the 'open' sibling, but it never names or contrasts with that sibling 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?
No when-to-use or when-not-to-use guidance, no prerequisites, and no mention of alternatives such as leaving a session open or reusing it. Usage is only implied by the word 'close'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
diagnose_frameARead-only
Diagnose one raw frame, pure computation — no hardware, no audit entry. Every checksum algorithm x value encoding is verified at the default tail position (checksum_matrix); each row's at is the byte offset where the stored checksum starts (frame_len - stored_len; stored_len is the algorithm's byte count for raw, twice that for ascii_hex), and a row whose algorithm cannot apply to this frame carries only kind/encoding/error, no at. With expected:{device,command} the command's response.parse is also attempted at byte offsets -2..=+2 (parse_attempts) to expose off-by-N framing — parsed: true only means the bytes are structurally decodable at that offset; the offsets are mutually exclusive hypotheses, so judge which (if any) is the real alignment yourself. The result declares view:{kind:"diagnostics"} for show_result.
| Name | Required | Description | Default |
|---|---|---|---|
| hex | Yes | The frame bytes, e.g. "01 04 02 08 9B FA 8D" | |
| expected | No | {device, command}: the workspace command whose response.parse the frame was expected to satisfy |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, non-destructive, closed-world), and the description adds substantial semantics beyond them: what each checksum_matrix row contains, why a row may omit `at`, and a crucial warning that `parsed: true` only means structural decodability at a mutually exclusive hypothesis offset. This directly prevents misreading the output.
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 core purpose and constraint, then layers the output semantics in one dense but purposeful paragraph. Some nested parentheticals (stored_len computation) are heavy, 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?
With no output schema, the description carries the burden and does it well: it names the result sections (checksum_matrix, parse_attempts), the row fields, and the view declaration for show_result. Only a few edge details (frame size limits, error result shape) 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 the baseline is 3, but the description goes further by spelling out how `expected:{device,command}` behaves (response.parse attempted at byte offsets -2..=+2) and by explaining the hex-frame coming from the byte offsets rather than the schema's 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?
Opens with a specific verb+resource ('Diagnose one raw frame') and immediately scopes it against the hardware-touching siblings ('pure computation — no hardware, no audit entry'). An agent can tell this apart from send/capture_start/capture_frames without opening another 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?
Clearly establishes the use context (offline, no hardware, no audit entry) and explains when to supply `expected` (to trigger parse_attempts for off-by-N framing). It does not explicitly name alternative siblings to use instead, but the contrast with hardware tools makes the routing condition inferable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_portsARead-only
List serial ports (USB metadata included) plus the always-available mock:echo loopback.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description adds real but modest behavioral context: returned results include USB metadata and always contain the mock:echo loopback entry. It says nothing about ordering, sampling, or what happens if no hardware is present.
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; the resource is stated first and the two payload caveats follow. Nothing is wasted and nothing important is buried.
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-parameter read tool with no output schema and annotations covering safety, the description supplies what an agent needs: what is listed, that USB metadata comes along, and that the mock loopback is guaranteed. Minor gaps remain (no detail on the metadata fields or ordering), but nothing blocks correct invocation.
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?
The tool takes zero parameters, which is the baseline-4 case. The description correctly implies a no-argument, ambient-environment call rather than inviting parameters that do not exist.
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: 'List serial ports'. It even scopes the payload ('USB metadata included') and calls out the always-present mock:echo loopback. It does not name or differentiate itself from likely siblings such as open or ask_port, 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?
Usage is only implied: a list-ports tool is obviously a discovery step before opening a connection, and mentioning the always-available mock:echo loopback suggests a no-hardware test path. But there is no explicit when-to-use, when-not-to-use, or named alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openA
Open a serial port session. If device names a workspace device, its profile supplies transport defaults and framing; explicit arguments override. port may be omitted when the device profile declares a selector (vid/pid/serial_number/product) — exactly one live match is required. replay:<capture path> (relative to the workspace) replays a recorded .obcap. Returns a session_id.
| Name | Required | Description | Default |
|---|---|---|---|
| baud | No | ||
| port | No | Port path from list_ports, mock:echo, or replay:<capture>. Optional when the device profile has a selector | |
| device | No | Workspace device name supplying defaults | |
| parity | No | ||
| framing | No | One of {delimiter}|{idle_ms}|{length_prefix:{header_len,len_at,len_size,endian,extra}} | |
| data_bits | No | ||
| stop_bits | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare not-read-only, open-world, non-destructive, so the bar is lower; the description still adds genuine context — profile defaults vs explicit overrides, the exactly-one-live-match constraint for selectors, workspace-relative replay paths, and the session_id return. It omits that the returned session is a stateful handle needing `close`, 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 core action, then three dense sentences covering override semantics, selector matching, and replay. No filler, though the selector clause is packed enough to slow parsing slightly.
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 states the return value (session_id) and covers the three distinct invocation modes. Missing only failure behavior when no selector match exists and whether channel settings are mandatory without a device profile.
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 only 43% (baud, parity, data_bits, stop_bits are undocumented), so the description has to compensate. It does: the profile-supplies-defaults/arguments-override rule explains every optional parameter, and the selector and replay notations add meaning beyond the schema for `port`.
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 ('Open a serial port session'), which unambiguously separates it from close/send/list_ports. It never names a sibling or explicitly contrasts itself, so it lands at clear-but-undifferentiated rather than 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?
Gives real conditional guidance: `device` supplies defaults, explicit args override, `port` may be omitted only when the profile declares a selector, and `replay:<capture path>` triggers replay mode. It stops short of stating when-not-to-use or naming alternatives (e.g. close/read), so no 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
readARead-only
Cursor-based framed read: returns frames received since your previous read (waits up to timeout_ms for the first frame). Reports dropped_bytes if the buffer overflowed.
| Name | Required | Description | Default |
|---|---|---|---|
| max_frames | No | ||
| session_id | Yes | ||
| timeout_ms | No | ||
| max_inline_bytes | No | Result JSONs longer than this many bytes are written in full to .openbaud/out/ and returned as a summary carrying a full_result path — keeps huge payloads out of your context. Raise it to force large results inline. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, non-destructive, open-world). The description adds genuinely new behavior: it blocks up to timeout_ms for the first frame, and it surfaces dropped_bytes when the buffer overflows. These are non-obvious traits an agent needs. It stops short of describing frame ordering or what happens on a fully empty buffer.
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 the core behavior front-loaded, followed by the blocking-wait parenthetical and the overflow-report clause. Every clause carries information; nothing is 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?
There is no output schema, so the description should carry more of the return shape. It names dropped_bytes but does not describe what a frame contains or how the .openbaud/out full_result fallback (documented only in the schema) interacts with reads. Adequate for invocation, thin for interpreting results.
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 only 25% (only max_inline_bytes is documented in the schema). The description partially compensates by explaining timeout_ms's wait semantics and implying frame-count returns, and the overflow reporting relates to buffer behavior. However max_frames and session_id carry no added meaning, so the compensation is incomplete.
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 with scope: 'returns frames received since your previous read', plus the cursor-based semantics. This is much more than a restatement of the name 'read'. It does not, however, explicitly contrast itself with siblings like stream_poll or capture_frames, so an agent must infer the difference.
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 by the cursor semantics ('since your previous read') and the blocking behavior, which tells the agent this is the incremental-consumption tool. But no when/when-not guidance or named alternative (stream_poll, capture_frames) is given, leaving the selection between the several polling/reading siblings to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
requestBDestructive
Send bytes and await the response (audited). match decides when the response is complete: {length:N} | {delimiter:"..."} | {idle_ms:N}; default is a 50 ms idle gap.
| Name | Required | Description | Default |
|---|---|---|---|
| hex | No | ||
| text | No | ||
| match | No | ||
| session_id | Yes | ||
| timeout_ms | No | ||
| max_inline_bytes | No | Result JSONs longer than this many bytes are written in full to .openbaud/out/ and returned as a summary carrying a full_result path — keeps huge payloads out of your context. Raise it to force large results inline. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a destructive, open-world write operation, so the safety profile is covered. The description adds that calls are "audited" and precisely defines completion semantics via `match`, but says nothing about what state `send` mutates, whether it blocks session use, or what happens on timeout.
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 followed by the one parameter that genuinely needed prose. No filler, though the match syntax is dense enough that it reads as terse rather than optimally 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 6-parameter mutation tool with no output schema and low schema coverage, the definition covers the trickiest parameter but omits the return shape, timeout behavior, and the hex/text distinction. The `max_inline_bytes` note about .openbaud/out/ partially compensates on result handling.
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 only 17%, so the description must carry weight. It does an excellent job decoding the undocumented `match` object with three concrete forms and a stated default, but leaves `hex` vs `text` selection, `session_id`, and `timeout_ms` unexplained despite being key to correct invocation.
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 resource ("Send bytes and await the response"), making the blocking-call nature clear. However, it does not differentiate itself from close siblings like `send` or `ask_port`, leaving the agent to guess which one is intended for a request/response exchange.
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 exclusions, and no mention of when to prefer this over `send`, `ask_port`, or `read`. The only usage hint is the parenthetical "(audited)", which is stated without explaining its consequences.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_commandADestructive
Execute a named command from devices//commands/ with typed params: builds the frame, awaits the response and classifies the outcome (normal | exception | silence | timeout | checksum_error | malformed) against the command's declared expect (audited; an unmet expectation is an error carrying the full result JSON). Give session_id for an open session, or port to open an ephemeral one with the device's profile transport — port may be omitted when the profile declares a selector, and accepts replay:. Commands with risk=danger additionally require acknowledge_risk=true.
| Name | Required | Description | Default |
|---|---|---|---|
| port | No | Optional when session_id is given or the device profile has a selector | |
| device | Yes | ||
| params | No | ||
| command | Yes | ||
| session_id | No | ||
| acknowledge_risk | No | ||
| max_inline_bytes | No | Result JSONs longer than this many bytes are written in full to .openbaud/out/ and returned as a summary carrying a full_result path — keeps huge payloads out of your context. Raise it to force large results inline. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare non-readOnly/destructive/openWorld; the description goes well beyond by enumerating the outcome taxonomy (normal | exception | silence | timeout | checksum_error | malformed), explaining `expect` auditing and that unmet expectations return an error with full result JSON, and disclosing the risk gate (acknowledge_risk=true for risk=danger). That is substantive behavioral context an agent cannot get from 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 action, and every clause carries information about outcomes, session model, or risk gating. The middle sentence packs session_id, port, selector omission, and replay syntax into one long clause chain, which is dense though not wasteful.
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, open-world tool with 7 params, a nested object, no output schema, and low schema coverage, the description supplies the outcome model, audit/error semantics, session-vs-ephemeral choice, and the risk acknowledgement gate. It stops short of describing how per-command `params` are shaped or how results are summarized by max_inline_bytes beyond the schema's own note.
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 only 29%, so the description has to compensate, and it largely does: session_id vs port semantics, the selector-based port omission rule, the replay:<capture path> syntax, and the acknowledge_risk requirement are all description-only. The nested `params` object and `device`/`command` remain only lightly characterized ('typed params'), leaving one meaningful gap.
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 ('Execute a named command from devices/<device>/commands/') and immediately explains the mechanism (builds the frame, awaits response, classifies outcome). This is clearly distinct from lower-level siblings like send/request or the orchestration tool run_workflow, even though no sibling is named.
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 real usage context: use session_id for an existing session, or port for an ephemeral transport, with port optionally omitted when the profile declares a selector, and replay:<capture path> accepted. It does not, however, tell the agent when to prefer this over alternatives such as run_workflow or send, so there is no explicit when-not/alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_workflowADestructive
Execute a workflow from devices//workflows/: its steps run in order on one session (step params override command defaults); the first failing step skips the rest, then every finally step is attempted regardless. Returns {ok, steps, finally, skipped}; ok=false is an error carrying the full result JSON. Workflow risk is the maximum of its commands' risk — danger requires acknowledge_risk=true. Session resolution is the same as run_command (session_id, port, or profile selector).
| Name | Required | Description | Default |
|---|---|---|---|
| port | No | Optional when session_id is given or the device profile has a selector | |
| device | Yes | ||
| workflow | Yes | ||
| session_id | No | ||
| acknowledge_risk | No | ||
| max_inline_bytes | No | Result JSONs longer than this many bytes are written in full to .openbaud/out/ and returned as a summary carrying a full_result path — keeps huge payloads out of your context. Raise it to force large results inline. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true and openWorldHint=true, but the description adds far more: ordered execution, first-failure skips remaining steps, every `finally` step is still attempted, the exact return shape {ok, steps, finally, skipped}, ok=false meaning an error carrying the full result JSON, risk being the max of constituent commands, and the acknowledge_risk gate. This is well beyond annotation coverage.
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?
Execution semantics, failure handling, return shape, and risk gating are front-loaded in a tight sequence with no filler. It is a dense single block, and the session-resolution clause is appended rather than integrated, but every sentence carries 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 destructive, multi-step executor with no output schema, the description supplies the return shape, the error convention, the finally-step guarantee, and the risk-acknowledgment requirement. Nothing essential to 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 only 33%, so the description must compensate, and it does for the risky params: acknowledge_risk semantics (danger requires true) and session resolution via session_id, port, or device profile selector. It implies device and workflow meaning via the path 'devices/<device>/workflows/', though it doesn't explicitly define the workflow identifier format.
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 — execute a workflow located at devices/<device>/workflows/ — and immediately distinguishes the behavior from a plain command run by describing ordered steps on one session. 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?
Gives clear conditions: workflows are execution units whose step params override command defaults, and danger-level workflows require acknowledge_risk=true. It also anchors session resolution to run_command (session_id, port, or profile selector), which is actionable routing guidance. It never explicitly says when to prefer run_command or a single command over a workflow, 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.
schemaARead-only
The authoritative JSON Schema (or, with example=true, an annotated YAML example) of the openbaud knowledge formats — profile, command, workflow. Call this before writing or modifying any YAML under devices/: it is generated from the exact types that parse those files and includes the semantic rules the schema grammar cannot express.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | ||
| example | No | Return an annotated YAML example instead of the JSON Schema |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safe read-only profile, so the description is not obligated to restate it. It adds genuinely useful behavioral context: the schema is generated from the actual parsing types and encodes semantic rules the grammar cannot express, which tells the agent this is authoritative rather than a hand-written reference.
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 what is returned and immediately followed by the trigger for calling it. Every clause — authority, generation source, semantic-rule coverage — earns its place; there is 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 takes on the burden of describing returns (JSON Schema vs. annotated YAML example) and the safety profile is already carried by annotations. It is essentially complete; only minor details like schema size or versioning are absent, which are not 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 50% — the 'kind' enum has no inline description, but the description names all three valid values in prose. 'example' is defined in the schema and the description reinforces its effect ('with example=true, an annotated YAML example'), so both parameters carry meaning beyond the raw types.
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 with scope: the authoritative JSON Schema for the three openbaud knowledge formats (profile, command, workflow), plus the example=true mode. Nothing in the sibling list (list_ports, run_workflow, capture_*) overlaps, so an agent can identify this tool immediately 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?
Gives an explicit trigger — 'Call this before writing or modifying any YAML under devices/' — plus the reason (it is generated from the exact types that parse those files). It does not name a when-not condition or an alternative, but no sibling competes for this role, so the missing exclusion is low-cost.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sendBDestructive
Write raw bytes (audited). Provide exactly one of hex ('01 A0 FF') or text (control chars as-is, e.g. "AT\r\n").
| Name | Required | Description | Default |
|---|---|---|---|
| hex | No | ||
| text | No | ||
| session_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true and openWorldHint=true, so the write/destructive profile is covered. The description adds one genuinely new trait, '(audited)', indicating the write is logged. It does not disclose return behavior, error handling, or whether the write is blocking.
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, no filler, with the core action front-loaded ahead of the input-format rules. Every clause earns its place; the examples are the minimum needed to convey format.
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 low-complexity 3-param tool with annotations covering the safety profile and no output schema, the description covers input format adequately. It is still missing sibling differentiation and any note on failure/return behavior, which an agent writing raw bytes would benefit from.
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 0%, so the description must carry the load, and it does for two of three params: it explains hex format ('01 A0 FF'), text semantics (control chars passed as-is, with an 'AT\r\n' example), and the mutual-exclusivity constraint that the schema does not encode. session_id remains undocumented.
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 ('Write raw bytes'), which cleanly separates it from read/request siblings in the same family. It never says what it writes to (a session/serial port), relying on the session_id param and sibling context to imply the target.
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 parameter-selection rule ('exactly one of hex or text') but no guidance on when to use send versus request, run_command, or run_workflow. An agent gets no routing help for choosing this tool over its write-capable siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_statsARead-only
Live counters for open sessions: port, framing, opened_ms, buffered/dropped bytes, chunks seen, rx/tx byte totals, last_rx_ms, the transport settings the port was opened with, the active capture (path and live counters), and the session error when the port died. Pass session_id for one session; default is all.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true and destructiveHint=false, so the safety profile is covered. Beyond that, the description usefully discloses that counters are live, that the transport settings the port was opened with are included, and that the session error is surfaced when the port died — real behavioral context not present in 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?
One long but front-loaded sentence: the resource and scope come first, the field enumeration second, and the session_id guidance last. It is dense but every clause names actual returned data, so little is wasted; a minor readability cost from the run-on list structure.
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 explain return values, and it does by enumerating the counters, capture info and error field. Combined with the default-scope rule and the annotations covering safety, an agent has enough to invoke it correctly; only the treatment of non-open/unknown sessions 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?
The schema documents nothing for session_id (0% coverage), so the description carries the burden and does so: it states that passing session_id scopes to one session and that omitting it defaults to all sessions. That is exactly the semantics the agent needs, though it doesn't clarify id format or behavior for an unknown/closed id.
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 opens with a concrete noun phrase, 'Live counters for open sessions', and then enumerates exactly which counters are reported, so an agent knows precisely what this returns. It is distinguishable from sibling tools like session_timeline or list_ports, though it never explicitly names a sibling it is not.
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 sentence 'Pass session_id for one session; default is all' gives clear operational context for scoping the call, which is genuine usage guidance. However, there is no when-to-use vs. when-not-to-use framing and no mention of the sibling tools (session_timeline, list_ports) that an agent might confuse it with.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_timelineARead-only
Lay a recorded capture out as a session timeline: rx/tx byte density folded into buckets, plus the capture session's audited operations (commands, raw writes, workflow steps, denials) as events. Reads captures/.obcap and .openbaud/audit.jsonl — no hardware. The result declares view:{kind:"timeline"}, so its full_result path (or the result itself) renders via show_result.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Capture file directly under captures/, e.g. captures/cap-….obcap | |
| to_ms | No | Window end; default: the last record or event | |
| buckets | No | How many density buckets the window folds into (empty buckets are omitted) | |
| from_ms | No | Window start (wall-clock ms, the clock record ts_ms uses); default: everything known | |
| max_inline_bytes | No | Result JSONs longer than this many bytes are written in full to .openbaud/out/ and returned as a summary carrying a full_result path — keeps huge payloads out of your context. Raise it to force large results inline. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and closed-world, so safety is covered. The description adds real value beyond that: it names the exact files read (captures/<file>.obcap, .openbaud/audit.jsonl), confirms no hardware is touched, and discloses the view:{kind:"timeline"} output contract plus the show_result rendering path.
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, front-loaded with the core purpose, then inputs, then the output/rendering contract. Every sentence carries information, though the third sentence's phrasing is slightly convoluted.
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 usefully explains what the result declares (view.kind) and how it reaches the user via show_result, and it documents the two data sources. A mutation-heavy tool would need more, but for a read-only analysis tool this is close to 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 every parameter (path, from_ms, to_ms, buckets, max_inline_bytes) is already fully documented in the schema. The description mentions bucket folding and windowing only in passing and 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 and resource: it lays a recorded capture out as a session timeline, combining rx/tx density buckets with audited operations as events. This is clearly distinguishable from sibling tools like session_stats or capture_frames, since it names both the input artifacts and the output shape.
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 clear context for use: it operates on an existing capture file plus the audit log and explicitly notes 'no hardware', which tells the agent this is an offline analysis tool rather than a live one. It does not, however, explicitly name when to prefer session_stats or diagnose_frame over this.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
show_resultARead-only
Show a saved tool result to the user, rendered (a polar plot for angular scans, a field table otherwise) on hosts that support it. Pass path from an earlier result's full_result — the viewer then reads the complete payload directly, so the full data never enters your context. A result is charted only when it declares how (the command's view, or an encoding you pass here); otherwise it renders as a field table. Use it when the user would rather see the data than read it.
| Name | Required | Description | Default |
|---|---|---|---|
| data | No | The result itself, for small results that were never spilled to disk | |
| path | No | full_result path from an earlier tool result, e.g. .openbaud/out/res-….json | |
| encoding | No | How to draw it: {kind, data, angle, radius, intensity?} naming the fields that feed each visual channel. Only needed when the result carries no `view` of its own — e.g. you decoded the bytes yourself. Overrides the result's `view` when both are present. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only, non-destructive, closed-world profile, and the description adds real context: it notes the viewer reads the payload from disk so full data never enters the agent's context, and that rendering only happens on supporting hosts. It does not describe error behavior if the path is stale or the host lacks viewer support.
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 sentences, front-loaded with the action and rendering mode, then the data-flow rationale, then the charting condition, then the usage trigger. Dense but each sentence carries distinct information; only slightly verbose.
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, but the description explains the rendering outcomes (polar plot vs field table) well enough that an agent knows what to expect. With 3 nested/optional params, coverage is adequate though it could note what happens with the `data` param for unspilled results.
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 genuine semantics: `path` is tied to an earlier full_result, and `encoding` overrides the result's own `view` when both exist and is only needed when no view is present. This is decision-relevant information 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+resource (show a saved tool result to the user) plus the rendering modes (polar plot vs field table). The final sentence distinguishes it from the read/session siblings by framing it as a display action rather than a data-retrieval one.
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 says when to use it ("when the user would rather see the data than read it") and implies the when-not by pointing to reading via its framing. It does not explicitly name the alternative tool (read/session_timeline) as the routing target, so it stops short of 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stream_pollARead-only
Per-consumer incremental frame poll on an open session — a private cursor with its own deframer, fully independent of read (the two never steal frames from each other). Call with session_id to create a subscription: the result carries its subscription_id plus any frames already buffered. Call with that subscription_id to fetch what arrived since; frames carry a monotonic per-subscription seq, and next_seq is the seq the next frame will get. since_seq acknowledges delivery: frames with seq < since_seq are released — ack with the last delivered frame's seq + 1, not next_seq (next_seq can run ahead of a max_frames-capped page, and acknowledging frames never delivered is a loud error). Each page also stops at max_inline_bytes of rendered payload (default 4096, metered as each frame's hex length + text length; page_bytes reports the page's actual total) — whole frames only, in seq order; a first frame alone beyond the budget is still delivered, alone, with oversized_frame: true, so delivery always makes progress. Omit since_seq and the unacknowledged frames are redelivered unchanged (idempotent re-read, so a lost response costs nothing). A consumer that lags loses the oldest retained frames beyond 1024, counted cumulatively in dropped_frames; a subscription the session's byte buffer overflowed past counts the gaps in dropped_chunks — never silently. close: true releases the subscription (result carries closed: true). At most 8 subscriptions per session; ones idle beyond 120 s are swept by later stream_poll calls, and closing the session releases them all. Every result folds in the session's live counters as stats. Returns immediately with whatever is available — never waits; a poll with nothing left to deliver on a dead port errors loudly instead of looking healthy. Optionally pass parse: {device, command} when CREATING a subscription (never on a follow-up poll — that is a loud error) to parse every frame server-side with that workspace command's response.parse: each frame then carries parsed (the field values) or parse_error (the per-frame reason; one bad frame never stops the stream), parsed once at arrival so redelivery repeats the identical outcome, and every result echoes parse: {device, command} plus the command's units (same semantics as run_command). A device or command that does not exist, or a command without a response.parse block, fails subscription creation loudly.
| Name | Required | Description | Default |
|---|---|---|---|
| close | No | Release the subscription instead of polling it | |
| parse | No | Only when creating a subscription (with session_id): parse every frame server-side with this workspace command's response.parse — frames carry parsed or parse_error; a follow-up poll passing parse is a loud error | |
| since_seq | No | Acknowledge delivery: release frames with seq < since_seq — pass the last delivered frame's seq + 1; omit to redeliver the unacknowledged frames | |
| max_frames | No | ||
| session_id | No | Open session to subscribe to; required when no subscription_id is given | |
| subscription_id | No | Subscription from an earlier stream_poll; required for follow-up polls and for close | |
| max_inline_bytes | No | Byte budget for one page's inlined frames, metered as each frame's rendered hex length + text length; whole frames only, except a single first frame beyond the budget (delivered with oversized_frame: true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/destructiveHint/openWorld, but the description adds substantial behavior beyond them: at-least-once gap accounting (dropped_frames, dropped_chunks 'never silently'), idempotent redelivery via omitted since_seq, loud failure on a dead port, retention limit of 1024 frames, 8-subscription cap, 120 s idle sweep, and parse-error isolation per frame. This is unusually rich 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?
Front-loaded correctly with purpose before mechanism, and most sentences carry unique operational information. However, it is one ~450-word run-on paragraph with deeply nested parentheticals and some restatement of schema-level details (parse, max_inline_bytes), making it dense to parse where sub-structuring would help.
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 full burden of explaining return values and does so thoroughly: subscription_id, frames with monotonic seq, next_seq, page_bytes, oversized_frame, dropped_frames/dropped_chunks, stats counters, and parsed/parse_error. For a 7-parameter nested-schema tool this leaves nothing an agent needs 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 description coverage is 86%, so the baseline is 3, but the description genuinely adds meaning: why to ack with 'last delivered frame's seq + 1, not next_seq' (next_seq can run ahead of a max_frames-capped page) and how max_inline_bytes is metered. The only real gap is max_frames, which is never explained in prose and has no schema description.
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 ('per-consumer incremental frame poll on an open session') and immediately distinguishes itself from the sibling read tool ('fully independent of `read` (the two never steal frames from each other)'). An agent can select this over read/capture_frames 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?
Spells out the two call modes ('Call with session_id to create a subscription' vs 'Call with that subscription_id to fetch what arrived since'), when close:true applies, and exactly when parse is legal ('when CREATING a subscription ... never on a follow-up poll — that is a loud error'). Alternatives and exclusions are explicit rather than implied.
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.
18 tool updates
v0.3.0- First observed
ask_port - First observed
capture_frames - First observed
capture_start - First observed
capture_stop - First observed
close - First observed
diagnose_frame - First observed
list_ports - First observed
open - First observed
read - First observed
request - First observed
run_command - First observed
run_workflow - First observed
schema - First observed
send - First observed
session_stats - First observed
session_timeline - First observed
show_result - First observed
stream_poll
TDQS
Scored across 18 tools
Descriptions go out of their way to delineate boundaries (send=raw fire-and-forget, request=send+await, run_command=named typed command; read=cursor read, stream_poll=independent per-consumer subscription; ask_port 'not for discovery, that's list_ports'). This is unusually explicit, though three byte-sending tools and two frame-reading tools still require careful reading to pick correctly.
Most names are a clean verb_noun or noun_noun pattern (list_ports, run_command, run_workflow, capture_start, session_timeline, diagnose_frame, show_result, stream_poll), and the capture_*/session_* prefixes group cleanly. A handful of bare verbs (open, close, read, send, request) deviate slightly, but the overall scheme stays predictable.
18 tools is slightly heavy but justified by the breadth of a serial-toolkit domain: discovery, session lifecycle, three send modes, capture, re-framing, diagnostics, stats, streaming, plus schema and viewer helpers. Each tool maps to a distinct capability rather than being redundant.
The surface covers the full lifecycle: discovery (list_ports), open/close, multiple send/execute modes (send, request, run_command, run_workflow), lossless capture (capture_start/stop) with offline analysis (capture_frames, session_timeline, diagnose_frame), live stats and streaming, plus schema and result rendering. No obvious dead ends for the stated purpose.
Maintenance
Related MCP Connectors
Persistent memory, hybrid search and a goal graph for AI agents, over stdio or remote HTTP.
- mcpOAuthio.artifacta
Artifact store for AI agents. Hosted OAuth at mcp.artifacta.io/mcp; local stdio via npm/PyPI.
Governed personal world model and memory for your AI agent. Pair once, connect over MCP.
Real-time chat for AI agents. Claude Code, Cursor, Cline and Codex join channels over MCP.
Related MCP Servers
- AlicenseAqualityAmaintenanceMCP server that lets LLMs talk to serial devices: microcontrollers, routers, modems, embedded Linux, anything with a UART.2385 PyPI7MIT

sbl-probeofficial
AlicenseNot gradedqualityDmaintenanceSerial communication and protocol analysis MCP server that gives AI coding assistants direct access to serial ports for reading, writing, decoding, and capturing embedded device output.MIT- AlicenseAqualityAmaintenanceEnables AI agents to interact with physical embedded target boards over a dual-CDC USB bridge using MCP tools. It exposes console reading, pattern waiting, command sending, reboot/login state machines, and in-RAM MicroPython execution while a single-owner daemon safely arbitrates access to the serial devices.64Apache 2.0
- AlicenseNot gradedqualityCmaintenanceLets any MCP-capable AI and a human share a single serial port through one resident daemon, so the AI can read device output, send commands, and drive embedded boards alongside an engineer. It also performs atomic expect→send matching to win sub-second races such as U-Boot countdowns and login prompts, while keeping reads bounded for context hygiene.1MIT