Skip to main content
Glama

serial-console-mcp

AI for the configuration of telecommunication equipment, through the console port it already has.

build PyPI  MIT licensed  ·  Python 3.10+  ·  status: 0.3.2, verified live on a Juniper EX2200 console

serial-console-mcp connects an AI assistant such as Claude to the serial console of the equipment that runs networks and radio stations, and of anything else with a serial port:

  • Routers and switches. Juniper (Junos) and Cisco (IOS, IOS-XE) console and craft ports: log in, read state, change configuration with a safety net (commit confirmed on Junos, reload in on IOS), and leave the console as it was found.

  • Radio transceivers. Icom and Xiegu over CI-V; Kenwood, Yaesu and Elecraft over their text CAT protocols: identify the rig, read and set frequency and mode.

  • Antenna rotators. Yaesu GS-232 and the many controllers that speak it: read the heading, turn, stop.

  • Anything else with a serial port. Nothing is tied to telecom: the server talks raw bytes, cleans up ANSI output, or keeps a full VT100/xterm screen, so IoT gateways, alarm and access-control panels, UPS and PDU menus, lab instruments, industrial controllers, Linux and BIOS consoles and microcontrollers work too.

You say what you want in plain language. The assistant drives the console through this server, Claude Desktop asks you to approve each step, and bundled operating skills teach it the Junos and IOS basics: which mode a prompt means, how to get in and out, which show commands answer everyday questions.

Juniper support is verified on a real EX2200 console. Cisco, CI-V, CAT and rotator support follows the vendors' protocol references and has not yet met hardware on this bench. The other device types use the generic tools rather than device-specific helpers.

You do not need to know any programming. After it's installed you talk to Claude normally:

You: What serial ports do you see? Claude: I found two. One looks like a Silicon Labs CP210x on COM4 — that's probably your device.

You: Connect to COM4 at 9600 baud. Claude: Connected.

You: Log in and show me the version.

How it works (the important part)

A serial console isn't a simple question-and-answer channel. It echoes what you type, prints unsolicited messages on its own (logs, interface flaps), and can dump pages of output. So the moment a port is open, a background reader keeps draining it into a buffer. That means Claude can:

  • send a command (writes only — doesn't guess when the reply is done), then

  • read until a prompt appears (# , > , login: …) to capture the whole reply — even a long one — without cutting it off, or

  • read whatever's waiting for streaming/unsolicited output.

This is the same model minicom and expect use, which is why it handles interactive CLIs properly.

The tools

Tool

What it does

list_serial_ports

Enumerate ports with description and USB hardware id; marks ones open here

list_presets

Usual settings per device family: Cisco/Juniper/Linux consoles, Kenwood/Elecraft/Yaesu CAT, Icom CI-V, rotators, Arduino, NMEA GPS

connect / reconnect_last / disconnect

Open a port by name. Defaults 9600 8N1, no flow control; baud, data bits, parity, stop bits, RTS/CTS, XON/XOFF, line ending and prompt are all settable, or loaded from a preset. Several ports at once

send_keys / screen

Press Ctrl-C, Esc, Tab, arrows, F-keys by name; view the VT100/xterm screen of a full-screen console (BIOS, BMC, menu switches, vi)

send_text / send_hex

Write an ASCII line (CR / LF / CRLF / none) or raw hex bytes. Write-only

read_until_prompt

Return buffered output up to a literal or regex prompt, leaving the rest; auto_reply pages through --More--

read_available

Return whatever has arrived, as text and hex

query_text

Clear, send, then read until the prompt or until the line goes idle

expect

A scripted list of send-and-wait steps in one call: logins, command sequences

set_lines / pulse_line / send_break

Drive DTR and RTS (PTT, Arduino reset), send BREAK

capture_start / capture_stop / get_transcript

Log a session to a file (raw or timestamped TX/RX); re-read the rolling transcript

port_in_use_by / detect_baud

Which program holds a port; which baud rate produces readable text

cat_build / cat_parse

Kenwood, Elecraft and Yaesu ; commands: build a frequency set, decode ID, FA, MD, IF and error replies

civ_build / civ_parse / civ_freq

Icom CI-V frames: build, decode (echo vs reply, BCD frequency, mode, PTT), convert

rotator_build / rotator_parse

GS-232 rotator commands (read, move, stop, speed) and position replies

clear_buffer / status

Housekeeping; status shows every open port with control-line states

Ports are opened by name ("rig", "rotator"); tools default to the most recently used one. Each connection has a terminal mode: dumb (raw bytes, the default), ansi (colours and escape sequences stripped, CR/backspace overwrites applied, prompts matched on the line as displayed even after a device redraws it with spaces and backspaces; used by the console presets), or xterm/vt100 (a real screen you can read with screen; needs pip install 'serial-console-mcp[screen]', included in the installers). The receive buffer is capped at 4 MB per port; if a device streams for hours unread, the oldest bytes are dropped and status says how many.

Operating skills

Three skill files in skills/ teach an agent the discipline, the way the fldigi-mcp skills do; copy them into ~/.claude/skills/ or a project's .claude/skills/:

Skill

What it teaches

serial-console

The console model, the six rules, terminal modes, keys, presets

junos-operating

Junos modes from the prompt (% shell, > operational, # configure), out of the BSD shell and back, configure exclusive, show | compare, commit confirmed, rollback, cli -c and start shell, health and interface show commands verified on an EX2200 (show chassis routing-engine, show interfaces terse/brief)

ios-operating

IOS modes (>, #, (config)#), enable/configure terminal/end, reload in 10 as the safety net, write memory, everyday show commands (show ip interface brief, show processes cpu sorted)

Environment variables

Variable

Effect

SERIAL_CONSOLE_READ_ONLY=1

Refuse writes except read-style commands (show, ID;, CI-V reads) and refuse control-line changes

SERIAL_CONSOLE_ALLOW=<regex>

Override the read-only allowlist

SERIAL_CONSOLE_IDLE_MINUTES=15

Auto-close a port idle that long (default: never)

Set them in the server's entry in claude_desktop_config.json under "env".

Related MCP server: MCP Remote Access

Installing

  1. Download the installer for your computer from the Releases page (the .exe on Windows, or the .pkg on a Mac) and click through it like any normal program. It sets everything up for you. The installers are unsigned for now, so expect a Gatekeeper / SmartScreen warning.

  2. Completely quit Claude Desktop — not just closing the window. On Windows, right-click the Claude icon near the clock and choose Quit. On a Mac, press ⌘Q or choose Claude → Quit.

  3. Open Claude Desktop again.

  4. In a new chat, type: "What serial ports do you see?" If Claude lists your ports, you're done.

That's the whole thing. There's no separate program to keep open and nothing to configure by hand.

Installing from PyPI

If you already have Python 3.10+ and uv or pipx, you don't need the installer:

uvx serial-console-mcp --version                                   # fetches and runs it
uvx serial-console-mcp configure --command uvx --arg serial-console-mcp

or

pipx install serial-console-mcp
serial-console-mcp configure --command "$(which serial-console-mcp)"

configure writes a serial-console entry into claude_desktop_config.json (merging with whatever is already there and backing the old file up first). Quit and reopen Claude Desktop. serial-console-mcp configure --remove undoes it. Any other MCP client can launch the same command over stdio.

Installing from source (developers)

git clone https://github.com/sbrunner-atx/serial-console-mcp.git
cd serial-console-mcp
uv sync                       # or: python3 -m venv .venv && . .venv/bin/activate && pip install -e . pytest
uv run pytest                 # fake serial port, no hardware needed
uv run serial-console-mcp configure --command "$PWD/.venv/bin/serial-console-mcp"

The package lives in src/serial_console_mcp/: server.py is the MCP server, configure.py the Claude Desktop registrar. See BUILD.md for the installers.

Using it

Plain-English requests work. Some examples:

  • "List my serial ports."

  • "Connect to the console on /dev/cu.usbserial-10 at 9600 baud."

  • "Connect to /dev/cu.BLTH at 38400, 8 data bits, no parity, 1 stop bit, XON/XOFF flow control."

  • "Connect to the Kenwood with the kenwood-cat preset and call it rig; connect the rotator on the other port."

  • "Log in as admin and run show version" (one expect call: return, login, password, command).

  • "What baud rate is this thing?" (detect_baud).

  • "Key the rig for two seconds" (pulse_line("RTS", 2000), after you confirm).

  • "Ask the IC-7300 for its frequency" (civ_build, send_hex, read_available, civ_parse).

  • "What is the TS-590 tuned to?" (query_text("FA;"), cat_parse).

  • "Turn the rotator to 45 degrees and confirm" (rotator_build, query_text, rotator_parse).

  • "Record this console session to a file."

  • "Hit Ctrl-C, that ping is still running." (send_keys)

  • "Open the BIOS console at 115200 and show me the screen; go down two and press Enter." (screen-console preset, screen, send_keys)

  • "Reconnect to the same port as last time." (it remembers)

  • "Send a return, then read until the login prompt."

  • "Log in as admin and run show interfaces terse, then show me all of it."

  • "Just read whatever the device is printing right now."

  • "Disconnect when you're done."

For a router/switch console, tell Claude the prompt it should wait for (often # for enable mode or > for user mode) and it will read until it sees it. For an Icom radio (CI-V), tell Claude — it can send the hex commands those radios expect.

If something doesn't work

"No serial ports found."

  • Is the device turned on?

  • Is the USB cable a real data cable, not a charge-only one? (A very common gotcha.)

  • On Windows, open Device Manager and look under Ports (COM & LPT). If nothing's there, Windows needs the cable's driver (often FTDI, CP210x, or CH340).

"Could not open the port" / "access denied."

  • A serial port can only be used by one program at a time. Close anything else that might be holding it: a terminal (PuTTY/minicom/screen), WSJT-X, your contest logger, the device's own software.

Claude says it can't access serial ports at all.

  • Make sure you fully quit and reopened Claude Desktop after installing.

  • Start a brand-new chat and ask "What serial ports do you see?" again.

It connected but a command gets no reply.

  • Almost always the baud rate is wrong, or the line ending is wrong for your gear. Most Unix-style consoles want a plain newline (LF); most rigs want a carriage return (CR). Ask Claude to send a return first to draw a fresh prompt.

A word on safety

These tools send exactly what you (through Claude) ask them to send, to whatever device is on the cable. Claude Desktop asks you to approve each tool call, so you see every command before it runs. Read it. A console session on a router or a rig can reconfigure, reboot, or transmit, and this server does not try to guess which commands are dangerous. If something looks wrong, decline it, and keep a real terminal handy for anything you would not want an assistant to type.

License

MIT. See LICENSE.

73!

Available Tools

30 tools
capture_startA

Start writing this connection's traffic to a file until capture_stop.

Args: path: File to write. Empty = an auto-named file in the app's captures folder. A bare name goes in that folder; an absolute path is used as is. Existing files are appended to. format: "raw" writes received bytes exactly as they arrive (a terminal log; echo included). "annotated" writes timestamped lines marked TX or RX, which is better for protocol debugging. connection: Which open connection (name). Default: the current one.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNo
formatNoraw
connectionNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral burden and does so well: it discloses that existing files are appended to, that 'raw' includes echoed received bytes, that 'annotated' adds TX/RX timestamps, and how path resolution works. This goes well beyond the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is tightly structured: one succinct purpose sentence followed by a compact Args section. Every sentence adds needed information—no filler, repetition, or vague phrasing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description fully covers what the tool does, how to invoke it, what side effects occur (appending to files), and the key parameter semantics. The presence of an output schema means return-value details are not required here. Nothing essential is missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must fully compensate, and it does. It explains the path default, bare-name versus absolute-path behavior, append semantics, the meaning of each format enum value, and the default for connection. Every parameter is meaningfully documented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb-resource pair: 'Start writing this connection's traffic to a file until capture_stop.' This clearly distinguishes it from siblings like capture_stop, get_transcript, and send_text, and names the exact resource affected.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description makes clear that this is the tool to begin a capture session and implicitly identifies capture_stop as the paired termination tool. It does not explicitly enumerate when not to use it, but the context is clear enough for an agent to select it correctly.

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 capture started by capture_start and report the file and size.

ParametersJSON Schema
NameRequiredDescriptionDefault
connectionNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses the action (stop capture) and the return (file and size), which is useful. However, it doesn't mention side effects (e.g., whether the capture is saved or deleted), error conditions if no capture is active, or whether the operation is reversible. The return format is partly covered by the output schema, but behavioral caveats are missing.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is one concise sentence that front-loads the core action and result. It contains no fluff and communicates everything needed for the tool's primary function efficiently.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple with one optional parameter and an output schema, which covers return values. The description explains the main use case and pairing with capture_start. However, it lacks any detail about the connection parameter, error handling, or edge cases (e.g., calling it without an active capture). Given the tool's simplicity, this is a moderate gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description makes no mention of the single 'connection' parameter. The parameter is optional with a default, but the description adds no meaning about what it should contain or how it affects the operation. The description entirely 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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific verb ('Stop') and resource ('the capture started by capture_start'), and it mentions the output ('report the file and size'). It distinguishes itself from sibling tools by pairing with capture_start, making its purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is used after capture_start by referencing it, giving clear context. It doesn't explicitly list alternatives or exclusions, but the sibling set includes capture_start, and this tool's purpose is obvious. Slight gap: no mention of prerequisites or when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

cat_buildA

Build a ';'-terminated text CAT command (Kenwood, Elecraft, Yaesu) for query_text or send_text with line_ending="NONE".

Common commands: ID (rig id), FA/FB (VFO A/B frequency; empty value = read), MD (mode; read, or set with the family's code), IF (full status), PS (power), TX/RX, AI0 (silence auto-info), SM0 (S-meter), PC (output power).

Args: command: Two letters, e.g. "FA". value: Digits/letters to append for a set, e.g. "2" for MD2 (USB). Empty = read. frequency_mhz: For FA/FB sets: the frequency; formatted as 11 digits of Hz (Kenwood/Elecraft) or 9 (Yaesu). flavor: Which family's conventions: "kenwood" (default), "elecraft", "yaesu".

ParametersJSON Schema
NameRequiredDescriptionDefault
valueNo
flavorNokenwood
commandYes
frequency_mhzNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden and does a solid job: it discloses the ';' terminator, the line_ending='NONE' usage, the empty-value-means-read convention, and family-specific frequency formatting (11 vs 9 digits). It does not cover edge cases like unknown commands, but the key formatting behaviors are clearly exposed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well organized: purpose in the first sentence, a helpful common-command reference, then a clean Args section. Nothing feels redundant, and the most important information is front-loaded before the parameter details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 4-parameter builder with no schema descriptions, the description is nearly complete: it covers all inputs, the output terminator, family variants, and how to pair it with query_text/send_text. The only minor gap is not explicitly listing alternatives/exclusions, but the parameter coverage and usage context are strong enough for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must fully compensate, and it does. It explains all four parameters: command is two letters, value is an empty-read or set-append, frequency_mhz is formatted per family, and flavor is the convention choice with defaults. The MD2 example adds useful concrete meaning beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: "Build a ';'-terminated text CAT command" for Kenwood, Elecraft, and Yaesu rigs. It also clarifies the relationship to companion tools by saying the result is for query_text or send_text, distinguishing it from parsing or CIV-building siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly implies when to use the tool: when constructing a CAT text command to pass to query_text or send_text. However, it never explicitly states when not to use it or names alternatives such as civ_build or cat_parse, so the agent must infer the boundary from siblings and context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

cat_parseA

Decode ';'-terminated text CAT replies: rig id to model, FA/FB to MHz, MD to mode name, IF to frequency/mode/VFO/split/TX state, and the ?; E; O; error answers. Pass the text returned by query_text.

ParametersJSON Schema
NameRequiredDescriptionDefault
replyYes
flavorNokenwood

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden. It discloses that the tool parses specific formats and handles error answers (?; E; O), which is a behavioral trait – users know it can return errors. It doesn't mention side effects (likely none), but for a decode tool this is sufficient. It does not contradict annotations (none exist), so no contradiction flag.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence, efficient and front-loaded with the main verb and object. It lists details (FA/FB to MHz, MD to mode name) that are useful but could be considered slightly dense. It earns its place with no fluff, though the parameter details could be trimmed. It is appropriately sized for the complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is moderate complexity with 2 params and an output schema exists. The description covers what the tool does and where the input comes from. It doesn't fully explain the flavor parameter's effect on parsing, but with the output schema present, return values are covered. The main gap is the flavor semantics, so a 4 is suitable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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. It explains the 'reply' parameter implicitly: it is the text returned by query_text, which gives semantic meaning beyond the schema's bare 'string' type. However, the 'flavor' parameter is not explained in the description (though the schema has an enum), so there is a small gap. This is otherwise good compensation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description has a specific verb and resource: 'Decode ';'-terminated text CAT replies.' It lists what the tool parses (rig id, FA/FB to MHz, etc.) and the answer types, clearly distinguishing it from siblings like 'civ_parse' and 'rotator_parse'. It is not a tautology and provides concrete details.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description says to pass 'the text returned by query_text', which gives a clear caller context. It implies this is the decode step for text CAT replies but does not explicitly say 'when not to use' it or mention alternatives like 'civ_parse' for binary protocols. Still, the explicit connection to query_text provides good guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

civ_buildA

Build an Icom CI-V frame as hex, ready for send_hex.

Args: command: Command byte(s) as hex, e.g. "03" read frequency, "04" read mode, "05" set frequency, "06" set mode, "1C 00" PTT, "19 00" read rig address. data: Data bytes as hex. For frequencies use civ_freq: set 14.070 MHz is command "05" with data "00 00 07 14 00" (BCD, low byte first). rig: The rig's CI-V address (IC-7300 94, IC-7610 98, IC-9700 A2, IC-705 A4). controller: Our address, conventionally E0.

ParametersJSON Schema
NameRequiredDescriptionDefault
rigNo94
dataNo
commandYes
controllerNoE0

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the behavioral burden. It clearly frames this as a pure construction operation that produces hex and does not send it. It does not discuss error handling or validation, but for a simple frame builder this is a minor omission rather than a misleading gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with a one-line purpose and then uses a compact argument list. Every sentence adds practical value, and the examples are dense but not padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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 annotation coverage and no schema descriptions, this definition is complete: all parameters are covered, the output's intended consumer is named, and the relationship to civ_freq is explained. The exact CI-V frame framing is not spelled out, but the 'ready for send_hex' contract makes that unnecessary.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description fully compensates by explaining every parameter with concrete hex examples, domain conventions, and defaults. The command examples, BCD frequency example, rig address table, and controller default give an agent everything needed to fill the arguments correctly.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Build'), a specific resource ('Icom CI-V frame'), and the exact output form ('as hex, ready for send_hex'). This clearly differentiates it from siblings like send_hex (which sends), civ_parse (which parses), and cat_build/rotator_build (which build other protocols).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description establishes the intended pipeline: build a frame, then pass it to send_hex. It also gives an explicit alternative for frequency conversion ('For frequencies use civ_freq'). It does not explicitly enumerate when not to use cat_build or rotator_build, but the CI-V-specific framing makes the use case clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

civ_freqA

Convert between a frequency in MHz and CI-V BCD data bytes.

Give mhz to get the 5 data bytes for a set-frequency command (05), or bcd_hex (5 bytes from a reply) to get the frequency.

ParametersJSON Schema
NameRequiredDescriptionDefault
mhzNo
bcd_hexNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral disclosure burden. It transparently explains the conversion direction, the exact byte count (5), and the command context (set-frequency command 05). It doesn't cover edge cases like both parameters being provided, but for a pure conversion tool this is sufficient.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact, front-loaded with the main purpose, and every sentence earns its place. It avoids boilerplate and directly explains the two usage modes in just a few lines.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a simple two-parameter conversion tool with an output schema present. The description covers both parameters, the exact conversion behavior, and the byte counts, so an agent has enough to select and invoke the tool correctly. Nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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. It does by explaining that mhz is the frequency input and bcd_hex is the 5-byte reply data, adding meaning beyond the bare property names and types. It stops short of specifying the exact hex string format for bcd_hex, but the core semantics are clear.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Convert') and clearly identifies the resource: frequency in MHz and CI-V BCD data bytes. It also distinguishes this tool from siblings like civ_build and civ_parse by framing it as the frequency-to-BCD conversion utility.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear instructions for both directions: supply mhz to get bytes, or supply bcd_hex to get frequency. It doesn't explicitly mention when not to use this tool or name alternatives, but the usage context is clear for a simple converter.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

civ_parseA

Decode Icom CI-V frames from hex (as returned by read_available).

Splits the bytes into frames, tells our own echoed command apart from the rig's reply, and decodes frequencies (BCD), modes, OK/NG and PTT state.

ParametersJSON Schema
NameRequiredDescriptionDefault
hex_bytesYes
controllerNoE0

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden, and it does well: it discloses that it splits bytes into frames, disambiguates the tool's own echoed command from the rig's reply, and decodes BCD frequencies, modes, OK/NG and PTT state. It omits error behavior for malformed frames, but the core operational traits are disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight paragraphs, zero filler. The purpose line is front-loaded with verb, resource and input source, and the second paragraph lists behaviors in a compact bullet-like flow. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The output schema exists, so return format is covered externally, and the description handles the core decode behaviors and input origin. The gap is the undocumented controller parameter and the absence of any note on malformed input handling — noticeable but not crippling for a decode tool with a defined output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

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. It covers hex_bytes implicitly ('from hex') but never explains the controller parameter (default 'E0') — its meaning, when to override it, or how it relates to the echoed-command disambiguation the description mentions. Half the parameter surface is left undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Decode) plus a concrete resource (Icom CI-V frames) and names the input source (hex as returned by read_available). It differentiates from sibling parsers (cat_parse, rotator_parse) by being explicitly CI-V protocol scoped, and from civ_build by being the decode/inverse operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'as returned by read_available' gives the agent a clear pipeline signal: feed this tool the output of read_available. This routes usage without opening the schema. It doesn't explicitly name when-not-to-use it or mention civ_build as the encode alternative, 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.

clear_bufferA

Discard any buffered received data. Handy right before sending a command so the next read starts clean (drops old echo, prior output, or syslog noise).

ParametersJSON Schema
NameRequiredDescriptionDefault
connectionNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of alerting the agent that this is a data-destructive operation: it discards received data and drops old echo, prior output, or syslog noise. It also clarifies the expected consequence for subsequent reads. Minor gaps remain around irreversibility and whether the operation applies globally or per connection.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tightly written sentences with the action front-loaded first; every clause adds useful context and there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple utility, the core behavior and recommended placement in a workflow are clear. However, the optional connection parameter is undocumented, and the description doesn't explain how buffer/connection addressing works, so an agent with multiple connections could invoke it incorrectly. The existence of an output schema covers return values in principle.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The sole parameter, 'connection,' has no schema description (0% coverage), and the tool description never mentions it or explains how it selects the buffer to clear. The word 'any' even creates ambiguity about whether the buffer is global or connection-specific.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: 'Discard any buffered received data.' It also distinguishes itself from read/send siblings by explaining the side effect of clearing stale data, so the agent knows exactly what this tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit timing: 'handy right before sending a command,' and explains why—so the next read starts clean and drops old echo/output/noise. It does not name alternative tools or state when not to use it, 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.

connectA

Open a serial port and start its background reader.

Defaults are 9600 baud, 8 data bits, no parity, 1 stop bit, no flow control ("9600 8N1"), CR line ending, which is what most console/craft ports expect. Give preset (see list_presets) to load a device family's usual settings, and override any field explicitly, e.g. "38400 with XON/XOFF" -> baud=38400, xonxoff=True. Several ports can be open at once; each gets a name and later tools default to the most recently used one. Nothing is specific to telecom gear: any device on a serial port works, including IoT gateways, alarm and control panels, UPS and PDU menus and lab instruments; choose terminal by what the device prints.

Args: port: System port name, e.g. "COM4" (Windows), "/dev/cu.usbserial-10" (macOS), or "/dev/ttyUSB0" (Linux). Get exact names from list_serial_ports. preset: Device preset name such as "cisco-console", "juniper-craft", "kenwood-cat", "icom-civ", "yaesu-rotator", "arduino", "nmea-gps". name: Nickname for this connection ("rig", "rotator"). Defaults to the port's short name. Use it in other tools' connection argument. baud: Baud rate. Common values: 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200. Unknown? Use detect_baud first. bytesize: Data bits: 5, 6, 7, or 8. Almost always 8. parity: "N" none, "E" even, "O" odd. Almost always "N". stopbits: 1, 1.5, or 2. Almost always 1. rtscts: Hardware (RTS/CTS) flow control. Off unless the manual says so and the cable carries those lines. xonxoff: Software (XON/XOFF) flow control. Off by default. Never for binary protocols (it swallows 0x11 / 0x13 bytes). line_ending: Default line ending for send_text/query_text on this connection: "CR" (most rigs, consoles), "LF" (Unix, Arduino), "CRLF", or "NONE" (Kenwood-style CAT ending in ';'). prompt: Default prompt for read_until_prompt/query_text on this connection, e.g. "# ", "> ", ";" (CAT replies). Say what the device shows, with its trailing space. prompt_regex: Treat prompt as a regular expression. terminal: How to interpret what the device sends. "dumb" (default): raw bytes, right for CAT, CI-V, rotators and most CLIs. "ansi": strip colour/escape sequences and apply CR/backspace overwrites so shells and coloured prompts read cleanly (the console presets use it); prompts are also matched on the last line as displayed, so a line redrawn with spaces and backspaces (Junos after ? or Ctrl-U) still ends in its prompt. "vt100"/"xterm": additionally keep a real screen for full-screen menus, BIOS/BMC consoles, vi/top; read it with the screen tool, navigate with send_keys. cols: Screen width for vt100/xterm (default 80). rows: Screen height for vt100/xterm (default 24).

ParametersJSON Schema
NameRequiredDescriptionDefault
baudNo
colsNo
nameNo
portYes
rowsNo
parityNo
presetNo
promptNo
rtsctsNo
xonxoffNo
bytesizeNo
stopbitsNo
terminalNo
line_endingNo
prompt_regexNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden, and it is exceptionally transparent: it discloses the background reader, default serial settings, multiple concurrent connections, MRU selection, flow-control caveats (e.g., XON/XOFF swallowing 0x11/0x13 bytes), and detailed terminal emulation behaviors.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Although long, the length is justified by 15 parameters and complex serial semantics. The description front-loads the core action and defaults, then organizes parameters in a clear Args list where each sentence adds practical value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with this many parameters and no annotations, the description is complete: it covers defaults, parameter interdependencies, related tools, behavioral effects, and how connections are referenced later. Nothing an agent needs to open a port correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description documents every parameter with concrete values, defaults, platform examples, and caveats. For example, port names for Windows/macOS/Linux, common baud rates, and the semantics of terminal modes go far beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence states a specific verb and resource: 'Open a serial port and start its background reader.' It also distinguishes itself from sibling tools by explaining that this is the setup step for later send/read tools, and it explicitly broadens scope beyond telecom gear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives concrete when-to-use guidance: get exact port names from list_serial_ports, load device settings via preset from list_presets, and use detect_baud when baud is unknown. It also explains how to choose terminal mode based on what the device prints, and how connection naming affects subsequent tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

detect_baudA

Try common baud rates on a closed port and rank them by how readable the reply is. Use when the user doesn't know the device's rate.

Each candidate is opened briefly, probe (default: a bare return) is sent, and whatever comes back is scored by its share of printable text. The right rate yields clean text; wrong rates yield garbage or nothing. Note: opening a port resets many Arduinos (DTR), and some devices (Kenwood CAT) only answer a real command, so pass e.g. probe="ID;" with probe_line_ending="NONE".

Args: port: The port to probe (must not be open here). probe: Text to send at each rate. Empty sends only the line ending. probe_line_ending: Line ending appended to the probe ("NONE" for CAT). candidates: Rates to try. Default: 9600, 115200, 19200, 38400, 57600, 4800, 2400, 1200, 230400. settle: Seconds to wait for a reply at each rate.

ParametersJSON Schema
NameRequiredDescriptionDefault
portYes
probeNo
settleNo
candidatesNo
probe_line_endingNoCR

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With zero annotations, the description carries the full burden and does well: it discloses the DTR side effect ('opening a port resets many Arduinos'), the scoring heuristic (share of printable text), that candidates are opened briefly, and that wrong rates yield garbage or nothing. Minor gaps remain — it never explicitly states the port is closed afterward or what happens when no rate succeeds — but the truly hazardous behavior is surfaced.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The structure is well front-loaded: purpose sentence, then mechanics, then caveats, then a compact arg list. It is on the longer side, but nearly every sentence earns its place — the Arduino reset and CAT caveats are non-obvious and critical. Only slight redundancy (the default rates are stated in prose and implied by the schema's null default) keeps it from a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-shape documentation is not required, and the description covers purpose, side effects, parameter semantics, and defaults thoroughly. The main omissions are failure behavior (what happens if no candidate produces readable text) and worst-case runtime (settle × candidate count), which an agent scheduling a call might want to know. For a 5-parameter tool with no annotations, this is still a strong, near-complete definition.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

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 — and it does for all five parameters. It adds the crucial 'must not be open here' precondition to port, clarifies probe's empty-sends-line-ending behavior, explains the enum values' purpose ('NONE' for CAT), and enumerates the actual default candidate rates, which the schema hides behind null. Every parameter gains meaning beyond the raw schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence names a specific verb/resource/outcome — 'try common baud rates on a closed port and rank them by how readable the reply is.' This clearly separates it from all 28 siblings, none of which perform baud detection, so an agent can select it unambiguously.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives an explicit trigger condition: 'Use when the user doesn't know the device's rate.' It also adds a strong precondition ('port must not be open here') and device-specific usage advice (Kenwood CAT needs probe="ID;" with probe_line_ending="NONE"). It doesn't name alternatives, but no sibling covers this function, so exclusions are unnecessary.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

disconnectA

Close a serial port and free it for other programs.

Args: connection: Which connection to close (name from connect). Default: the current one. all_connections: Close every open port.

ParametersJSON Schema
NameRequiredDescriptionDefault
connectionNo
all_connectionsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden for behavioral disclosure. It mentions that closing frees the port for other programs, but it does not disclose side effects such as terminating ongoing communication, whether the action is reversible, or what happens if no connection exists. This is minimal for a mutation-like operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is succinct and well-structured. The main purpose is stated upfront, and the argument explanations are concise with no filler or redundant content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the parameters and the primary effect, but it lacks usage guidance and behavioral nuance. It doesn't mention error conditions or how to recover, though the output schema exists so return values aren't needed. For a simple disconnect operation, it is adequate but not comprehensive given the absence of annotations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has zero per-parameter descriptions, so the tool description must compensate. It clearly explains both parameters: 'connection' identifies the specific connection and defaults to the current one, and 'all_connections' closes every open port. This adds meaningful semantics beyond the schema's bare properties.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action and resource: 'Close a serial port and free it for other programs.' This is specific and distinguishes the tool from siblings like 'clear_buffer' (which clears data) and 'connect' (which opens a port).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not explicitly state when to use this tool versus alternatives. It only implies usage when you want to close a port, but it lacks conditions, prerequisites, or guidance on when not to use it. No alternative tools are mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

expectA

Run a scripted sequence of send-and-wait steps in one call, like expect.

Use it for login flows and multi-step commands instead of one tool call per line: [{send: "", expect: "login: "}, {send: "admin", expect: "Password:"}, {send: "", expect: "> "}, {send: "show version", expect: "> "}]. Each step's output is returned. A step with no send just waits; one with no expect just sends.

Args: steps: The steps, in order. auto_reply: Triggers answered automatically while waiting, e.g. {"--More--": " "}. stop_on_timeout: Stop at the first step whose expect isn't seen. connection: Which open connection (name). Default: the current one.

ParametersJSON Schema
NameRequiredDescriptionDefault
stepsYes
auto_replyNo
connectionNo
stop_on_timeoutNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral disclosure burden. It explains what each step does, that each step's output is returned, how no-send/no-expect steps behave, and what auto_reply and stop_on_timeout do. It does not cover failure/error behavior or side-effect safety, but the core interaction model is transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and economical: purpose first, a compact illustrative example, then clear imperative notes on step semantics followed by an Args list. Every sentence adds useful information without repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the main usage scenario, step structure, parameter semantics, and defaults, while the schema handles nested field details and an output schema exists for return values. Minor gaps remain: behavior when stop_on_timeout is false and how failures are surfaced to the agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Top-level schema coverage is 0%, and the description compensates by explaining all four top-level parameters, including defaults and a concrete JSON example. Nested step fields are left to the schema, which already provides descriptions for them.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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 a scripted sequence of send-and-wait steps in one call.' It also distinguishes the tool from one-call-per-line approaches and from siblings like send_text/read_until_prompt by framing it as a batched, scripted flow.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says to use this for 'login flows and multi-step commands instead of one tool call per line,' which gives clear context for when it applies. It does not name alternative sibling tools explicitly or state when not to use it, so it stops short of full exclusion guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_transcriptA

Return the tail of everything received on a connection since it was opened.

This is a rolling record (last 256 KB) kept regardless of what the read tools consumed, so you can re-read output that an earlier call already returned or that arrived between calls. Also available as the MCP resource serial://transcript/{name}.

ParametersJSON Schema
NameRequiredDescriptionDefault
connectionNo
last_bytesNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It reveals that the tool is a non-destructive, rolling 256 KB record, and that it does not consume data (unlike read tools). It also notes the resource alias. It doesn't mention side effects, permissions, or error behavior, but the core behavior is 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short paragraphs, with the primary purpose front-loaded. It provides necessary detail about the rolling buffer and the alternative resource without redundancy. It could be slightly more compact, but it is efficient and well organized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description explains the tool's behavior and use case well, but it omits parameter semantics and any prerequisites (e.g., a connection must exist). An output schema exists, so return format is covered, but the missing parameter documentation leaves the tool incomplete for an agent to call correctly without additional inference.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

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. It does not explain what 'connection' refers to (e.g., the connection name from connect) or how 'last_bytes' relates to the returned tail. The description implies a tail but leaves the parameters ambiguous. This is a significant gap given no schema-level documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Return') and resource ('tail of everything received on a connection'), and clearly differentiates itself from read tools by highlighting the rolling buffer that persists regardless of consumption. This distinguishes it from siblings like read_available and read_until_prompt 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains the primary use case: re-reading output that was already consumed or arrived between calls. It contrasts with 'read tools' generically but doesn't explicitly name alternatives or provide exclusion conditions. It also mentions an alternative access method via a resource, which adds useful context. However, it could be more explicit about when to use this over specific siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_presetsA

Show the device presets connect(preset=...) understands, with their settings.

A preset supplies baud, data bits, parity, stop bits, flow control, the line ending the device expects, and the prompt that ends a reply. Anything you pass explicitly to connect overrides the preset. Families: network consoles (Cisco, Juniper, Linux), text CAT radios (Kenwood, Elecraft, Yaesu), Icom CI-V, rotators, Arduino, NMEA GPS.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral disclosure burden. It explains what a preset includes, that explicit connect arguments override presets, and which device families are covered. It does not explicitly state side-effect-free behavior, but 'Show' plus the detailed contents sufficiently indicates a read-only listing.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and then adds concise supporting detail about preset contents, override behavior, and supported families. Every sentence earns its place, and there is no redundant repetition of the tool name or schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter listing tool with an output schema, the description is complete: it explains what presets are, what settings they supply, how connect interacts with them, and what families are available. No critical context is missing for selecting and invoking this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and the schema shows an empty object, so there is no parameter semantics to document. The description instead adds value by explaining what the returned preset data contains and how it relates to connect, which is appropriate for a no-argument tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: "Show the device presets `connect(preset=...)` understands, with their settings." The description distinguishes it from other tools by focusing on presets and explicitly relating them to connect. This is unambiguous and not a tautology of the tool name.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context: this tool is meant to reveal what presets connect accepts and what each preset configures. It does not explicitly state when not to use it or name alternatives, but the relationship to connect and the list of families makes the intended use obvious.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_serial_portsA

List every serial port the computer can currently see.

Call this FIRST whenever the user wants to connect to a device but hasn't given an exact port name, or when a connection fails. Returns each port's system name (what you pass to connect), a human description, and the USB hardware id, so you can guess which one is the user's gear. Ports already open here are marked.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral burden. It discloses what the tool returns—system name, human description, USB hardware id—and that already-open ports are marked. This goes well beyond the tool name and gives the agent useful expectations about the output and how to interpret it.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the core action, followed by usage guidance and output details. Every sentence adds value, and there is no redundant or filler content. It is appropriately sized for the simplicity of the tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the zero-parameter interface, the available output schema, and the presence of sibling tools, the description provides everything needed to select and invoke the tool correctly. It explains when to call it, what it returns, and how to interpret the results. Nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the baseline is 4; the description accurately reflects that no arguments are needed. It adds context about how the returned values are meant to be used, such as passing the system name to `connect`. No parameter-level documentation is needed here.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'List every serial port the computer can currently see.' It also differentiates the tool from sibling tools like connect and status by defining its role as the first step before connecting. The purpose is immediately understandable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance: 'Call this FIRST whenever the user wants to connect to a device but hasn't given an exact port name, or when a connection fails.' It also explains how the returned data supports the next step, making the tool's place in the workflow unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

port_in_use_byA

Report which program currently holds a serial port (macOS/Linux, via lsof).

Use when connect says the port is in use, or before asking the user to close something. On Windows the OS doesn't expose this; the usual suspects are a terminal (PuTTY), WSJT-X, a logger, or the Arduino Serial Monitor.

ParametersJSON Schema
NameRequiredDescriptionDefault
portYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden. It usefully reveals that it relies on lsof and that Windows does not support the underlying introspection, but it does not mention potential permission issues, behavior when no process holds the port, or whether the command has side effects. It is adequate but not fully transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences with no wasted words. The core purpose is front-loaded, usage guidance follows, and the Windows caveat is concise. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple, has one required parameter, and an output schema is present, so return-value documentation is not the description's responsibility. The missing port-format guidance is a minor gap; overall the context is sufficient for an agent to invoke the tool appropriately.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description only clarifies that the argument is a serial port. It does not provide expected port formats (e.g., /dev/ttyUSB0) or connect it to the output of list_serial_ports. The description adds only marginal meaning beyond the schema's 'Port' title.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('Report which program currently holds a serial port') with a clear resource and platform scope ('macOS/Linux, via lsof'). This is immediately distinguishable from sibling tools like list_serial_ports or connect.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says when to use it: 'Use when connect says the port is in use, or before asking the user to close something.' This is clear contextual guidance, though it does not name alternative tools or explicitly state when not to use the tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pulse_lineA

Drive DTR or RTS to level for ms milliseconds, then restore it.

Uses: reset an Arduino (DTR, 100 ms), enter a bootloader, or key a rig's PTT for a timed transmission (RTS or DTR per the interface's wiring). The line is always restored, even if the wait is interrupted. Refused in read-only mode.

ParametersJSON Schema
NameRequiredDescriptionDefault
msNo
lineYes
levelNo
connectionNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

There are no annotations, so the description must disclose behavior on its own. It explicitly states that the line is always restored even if interrupted and that the tool is refused in read-only mode, which are important side-effect and safety details. It does not cover connection-related behavior, but the core behavioral contract is clear.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: the core behavior appears in the first sentence, followed by practical uses and important caveats. Every sentence adds value and there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the lack of return-value detail is acceptable. The main gap is the undocumented connection parameter, but the description otherwise provides enough operational context for an agent to select and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, yet the description explains line, level, and ms in context: DTR/RTS choices, boolean level, and millisecond duration. The connection parameter is not explained, so the parameter semantics are strong but incomplete.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence states a precise operation: drive DTR or RTS to a level for a specified duration, then restore it. This clearly distinguishes pulse_line from siblings like set_lines or send_break, which involve sustained or different line manipulation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The Uses section gives concrete scenarios (Arduino reset, bootloader entry, PTT timing) and even suggests typical parameters such as DTR and 100 ms. It does not explicitly say when not to use the tool or name alternatives, 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.

query_textA

Convenience: clear the buffer, send an ASCII command, and read the reply.

For the common "ask the device something and read its answer" case. Reads until prompt (or the connection's prompt) appears; with no prompt anywhere, or prompt="", reads until the device goes idle for a short beat (best for line-based rigs/CAT that reply with a terminated string and no shell prompt).

Args: data: Command text, e.g. "show version" or "ID". line_ending: "CR", "CRLF", "LF", or "NONE" (see send_text). Default: the connection's line ending. prompt: Literal prompt to read until, e.g. "# " or ";". "" forces an idle-terminated read even if the connection has a prompt. read_timeout: How long to wait overall, in seconds. connection: Which open connection (name). Default: the current one.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataYes
promptNo
connectionNo
line_endingNo
read_timeoutNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does well: it discloses that the buffer is cleared first, that reads continue until a prompt or idle period, and the special behavior when prompt is empty or no prompt exists. It does not describe timeout/error behavior, but the output schema likely covers the result.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with a one-line summary, then a concise use-case paragraph, then a tight Args list. Every sentence adds operational detail and no filler is present.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given five parameters and a convenience composition, the description explains the workflow, parameter semantics, and edge cases thoroughly. It leaves timeout behavior and return formatting to the output schema, which is acceptable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but the Args section documents every parameter with type, defaults, examples, and special values (e.g., prompt='' forces idle-terminated read). It even clarifies line_ending choices and connection default, fully compensating for the schema's bare titles.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description opens with a precise three-step verb sequence—clear buffer, send ASCII command, and read reply—and names itself a convenience wrapper. This clearly separates it from siblings like send_text, clear_buffer, and read_until_prompt, which each handle only part of the workflow.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly scopes the tool to the common 'ask the device something and read its answer' case and explains when idle-terminated reading is best. It does not enumerate exclusions or name alternative tools for non-convenience cases, though the 'see send_text' reference hints at related primitives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_availableA

Drain and return whatever the device has sent, without transmitting anything.

Use for unsolicited/streaming output (syslog on a console, GPS, a sensor, a rig in auto-info mode), or to grab a binary reply after send_hex. Waits up to read_timeout for the first bytes, then briefly settles so a full chunk is captured, then returns everything buffered, as text and as hex.

ParametersJSON Schema
NameRequiredDescriptionDefault
connectionNo
read_timeoutNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden and does well: it discloses that nothing is transmitted, that it waits up to read_timeout for first bytes, that it settles briefly to capture a full chunk, and that it returns data as both text and hex. This gives an agent a solid model of runtime behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, tightly packed, with the core behavior front-loaded and no filler. Every sentence earns its place: what it does, when to use it, and how it behaves.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is strong for a no-annotation tool: it covers purpose, use cases, timeout behavior, and return format, and an output schema exists to detail the response. The main gap is the unexplained connection parameter and the lack of explicit exclusions versus related tools, but these are minor and do not prevent correct invocation for the stated use cases.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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. It adds real meaning for read_timeout ('Waits up to read_timeout for the first bytes'), but the connection parameter is never explained and is only represented by its name and default. This is a partial, not complete, semantic contribution.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Drain and return whatever the device has sent, without transmitting anything.' It clearly distinguishes this read-only drain operation from sibling send/query/expect tools, and gives concrete example uses like syslog, GPS, sensors, and binary replies after send_hex.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states explicit use cases: unsolicited/streaming output and grabbing a binary reply after send_hex. It does not explicitly list when not to use it or name alternatives like read_until_prompt, but the guidance is clear enough for an agent to select it appropriately.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_until_promptA

Read accumulated output until a prompt appears, or until timeout.

This is the right tool for interactive CLI sessions (routers, switches, shells). It reads from the background buffer until prompt is seen, then returns everything up to and including it, leaving anything after the prompt in the buffer for the next read. Because the reader runs continuously, large multi-page outputs are captured in full rather than being cut off by a fixed delay.

Typical flow: send_text("show version", clear_buffer_first=True) read_until_prompt(prompt="# ")

Args: prompt: The text that marks the end of output. Literal by default, e.g. "# ", "> ", "login: ", "$ ", "Password:". Prefer a prompt with its trailing space over a bare "#": the match is searched in everything received, including the echo of your own command. Default: the connection's prompt (from connect/preset), else "ends with #, >, $ or %". timeout: Max seconds to wait for the prompt to appear. regex: Treat prompt as a Python regular expression (e.g. r"[\w.-]+[#>] ?$" for a hostname-style prompt). auto_reply: Text to send automatically when a trigger shows up while waiting, e.g. {"--More--": " "} to page through long output, or {"[confirm]": "\r"}. Each occurrence is answered once. connection: Which open connection (name). Default: the current one.

ParametersJSON Schema
NameRequiredDescriptionDefault
regexNo
promptNo
timeoutNo
auto_replyNo
connectionNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It explains buffer behavior (returns up to and including the prompt, leaves the rest), continuous reading for full multi-page capture, and auto_reply handling. It also details prompt matching semantics, including the literal-match default and echo caveat. This is comprehensive for a non-annotated tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured: opens with the core function, then adds context, then a typical flow, then per-parameter details. Every sentence adds value, no fluff. The length is justified by the tool's complexity, and the most important usage guidance is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (5 optional parameters, auto_reply dict, connection handling) and no annotations, the description covers all necessary aspects: what it returns, buffer semantics, timeout, prompt matching details, and auto_reply. An agent has enough to invoke it correctly without external context. The presence of an output schema further reduces the need to describe return structure.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must fully document parameters. It explains prompt (with examples and default behavior), timeout (seconds), regex (with example), auto_reply (with trigger examples), and connection (with default). Each parameter gains meaning beyond the bare schema type, making this a model of parameter documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Read accumulated output until a prompt appears, or until timeout.' It then specifies it's for interactive CLI sessions, which distinguishes it from sibling tools like send_text, read_available, or expect. The purpose is unambiguous and not a tautology.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says 'This is the right tool for interactive CLI sessions (routers, switches, shells)' and provides a typical flow with send_text. However, it does not name specific alternative tools or state when NOT to use it, leaving some inference to the agent. Still, the context is clear enough for correct selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reconnect_lastA

Reconnect to a remembered port with the same settings as last time.

Every successful connect is remembered by name across sessions (port, baud, flow control, line ending, prompt, preset). With no name, reopens the most recently used one. Handy at the start of a chat so the user doesn't repeat the port and baud rate. If nothing is remembered, says to use connect instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It transparently explains that connections are remembered across sessions, that no name reopens the most recent, and that it advises using 'connect' when no remembered connection exists. It does not cover edge cases like port unavailability, but the core behavior is 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, with the main purpose front-loaded. Every sentence adds value: the core action, the memory feature, the optional name behavior, the typical use case, and the fallback. No redundancy or unnecessary detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with one optional parameter and no annotations, the description fully covers when to use it, what it does, and how it behaves in edge cases. The output schema is present, so return values are presumably documented elsewhere. Nothing essential is missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single parameter 'name' is fully explained: with no name, it reopens the most recent connection. This goes beyond the schema's default value and gives the agent clear meaning for the parameter, compensating for the 0% schema description coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool reconnects to a remembered port with the same settings, using a specific verb ('reconnect') and resource ('remembered port'). It also differentiates from sibling 'connect' by explaining the fallback when nothing is remembered, making its purpose distinct.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit guidance is provided: it is handy at the start of a chat to avoid repeating port and baud settings, and if nothing is remembered, it directs the user to use 'connect' instead. This clearly states when to use this tool versus the alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

rotator_buildA

Build a Yaesu GS-232A/B rotator command for send_text (CR) or query_text.

Actions: "azimuth" (C, read), "position" (C2, read az+el), "elevation" (B), "move" (M), "move_azel" (W ), "stop"/"stop_azimuth"/ "stop_elevation", "left"/"right"/"up"/"down" (run until stop), "speed" (X1..X4), "help". Reads reply immediately; moves reply nothing, so read the position afterwards to confirm.

ParametersJSON Schema
NameRequiredDescriptionDefault
speedNo
actionYes
azimuthNo
elevationNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral burden, and it delivers: it explains that read actions return replies immediately, move actions return nothing, and that the agent should confirm by reading position afterward. It also frames the tool as a command builder rather than an executor, which sets correct expectations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact, front-loaded with the core purpose, and every sentence adds operational value. The action list is dense but efficiently encodes command syntax and reply behavior without unnecessary prose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a builder tool with four parameters and no annotations, the description covers purpose, action semantics, protocol commands, and response expectations. It could add explicit ranges for azimuth/elevation, but the provided protocol syntax and output schema presence make it sufficiently complete for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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. It maps action enum values to their wire commands (C, C2, B, M<az>, W<az> <el>, X1..X4), thereby giving meaning to azimuth, elevation, and speed parameters. It does not formally describe parameter ranges, but the protocol syntax is sufficiently illustrative.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Build a Yaesu GS-232A/B rotator command' for send_text or query_text. The action list with protocol codes makes it immediately distinguishable from sibling builders like civ_build and cat_build.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly states the target functions (send_text with CR, query_text) and gives practical guidance, such as reading position after move actions because moves reply nothing. It does not explicitly name alternatives or exclusion conditions, but the context is clear enough for an agent to select this tool appropriately.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

rotator_parseA

Decode a GS-232 reply into azimuth/elevation degrees ("+0180", "+0180+0045", "AZ=180 EL=045") or the ?> rejection.

ParametersJSON Schema
NameRequiredDescriptionDefault
replyYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure. It states accepted reply formats and the rejection signal, but does not describe exact return shape, handling of unrecognized input, or normalization. The output schema may help, but behavioral details are minimal.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single focused sentence with substantive examples and no filler. It is concise and front-loaded, though the example formats could have been more clearly separated for readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter parser with an output schema, the description covers the important input formats and the rejection case. It lacks explicit edge-case guidance, but nothing essential is missing for selecting and calling the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema provides no parameter description beyond the name 'reply', so the description compensates by listing concrete valid formats: '+0180', '+0180+0045', and 'AZ=180 EL=045'. This gives meaningful guidance for constructing a valid reply string, though whitespace or trimming rules are not specified.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies a specific verb ('decode'), a resource ('GS-232 reply'), and the output ('azimuth/elevation degrees' or rejection). The included format examples make it easy to distinguish from sibling parsers like civ_parse and cat_parse.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The intended context is implied by the GS-232 protocol mention, but there is no explicit when-to-use guidance or comparison with alternatives such as cat_parse or civ_parse. An agent must infer that other parse tools handle different protocols.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

screenA

Show the current terminal screen of a vt100/xterm connection: what a person at a real terminal would see right now, as rows of text, plus the cursor position. This is how to read full-screen interfaces (BIOS setup, RAID/BMC consoles, menu-driven switches, vi, top): press keys with send_keys, then look at the screen again.

Args: reset: Clear the screen model first (after garbage, or a resize). connection: Which open connection (name). Default: the current one.

ParametersJSON Schema
NameRequiredDescriptionDefault
resetNo
connectionNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral burden. It discloses that the tool returns a row-of-text representation with cursor position, and that reset clears the screen model after garbage or resize. This gives an agent a good sense of side effects and state, though it does not discuss connection-level effects or failure modes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-structured: main purpose first, then use-case context, then parameter explanations. Every sentence contributes useful information, with no repetition of schema fields.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has an output schema, so return-value details are already covered. The description supplies the necessary behavioral context, usage pattern, and parameter semantics, making it complete for an agent to select and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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. It does: reset is explained as clearing the screen model after garbage or resize, and connection is explained as an open connection name with a default. This adds meaningful semantics beyond the raw boolean/string schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description states a specific verb ('Show') and resource ('current terminal screen of a vt100/xterm connection'), and adds concrete detail about what is displayed (rows of text, cursor position). It clearly distinguishes the tool from siblings like read_available or status by framing it as the way to read full-screen interfaces.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says this is how to read full-screen interfaces and gives a concrete usage pattern: press keys with send_keys, then look at the screen again. It does not explicitly compare against alternatives, but the guidance is clear enough to know when to use screen versus simpler text-reading tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

send_breakA

Send a BREAK condition (TX held low) for ms milliseconds.

Some consoles use BREAK to enter ROMMON or interrupt boot; some serial devices use it as an attention signal. Refused in read-only mode.

ParametersJSON Schema
NameRequiredDescriptionDefault
msNo
connectionNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses the physical behavior (TX held low), the duration parameter, and the read-only mode refusal. Since no annotations are provided, the description carries the full burden, and it does so well. It doesn't mention side effects like whether the connection must be active or what happens if ms is 0, but the core behavioral traits are covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: the first sentence states the action and key parameter, the second provides usage context, and the third states a critical constraint. Every sentence earns its place with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter tool with an output schema, the description covers the essential behavioral context, usage scenarios, and a key restriction. The only notable gap is the undocumented 'connection' parameter, but the tool's simplicity and the output schema reduce the need for more detail.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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. It explains 'ms' as the duration in milliseconds, which adds meaning beyond the schema's bare integer type. However, it doesn't explain the 'connection' parameter at all, leaving the agent to infer that it identifies which serial connection to use. The description partially compensates but leaves a gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Send') and resource ('BREAK condition (TX held low)') and explains the purpose with concrete examples (ROMMON, attention signal). It clearly distinguishes this from sibling tools like send_text, send_hex, and pulse_line by focusing on the BREAK condition.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when to use it ('Some consoles use BREAK to enter ROMMON or interrupt boot; some serial devices use it as an attention signal') and explicitly states a key exclusion: 'Refused in read-only mode.' It doesn't name alternative tools, but the context is sufficient for an agent to decide when this is the right tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

send_hexA

Send raw bytes given as hex. Writes to TX only; does NOT read.

Use for binary protocols — notably Icom CI-V, which is all hex (e.g. "FE FE 94 E0 03 FD"; civ_build makes these). Spaces in the hex string are ignored. To see a binary reply, call read_available afterward and hand the hex to civ_parse (binary replies rarely have a text prompt, so read_until_prompt usually isn't the right tool for these).

Args: hex_bytes: Bytes as hex, e.g. "FE FE 94 E0 03 FD". clear_buffer_first: Discard buffered RX before sending. connection: Which open connection (name). Default: the current one.

ParametersJSON Schema
NameRequiredDescriptionDefault
hex_bytesYes
connectionNo
clear_buffer_firstNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses key behavioral traits: 'Writes to TX only; does NOT read', spaces in hex are ignored, and clear_buffer_first discards buffered RX. This goes well beyond the schema. It stops short of stating behavior on invalid hex or whether the call blocks, but the core behaviors an agent needs are transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core behavior and uses a compact paragraph for context followed by a clean bullet-style Args list. Every sentence serves a purpose: scope, example, usage guidance, parameter explanations. No filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite the tool's complexity (binary protocol handling), the description gives an agent everything needed to invoke it correctly: input format, connection default, buffer-clearing behavior, and the recommended read path. The output schema exists to explain return values, so the description's omission of that is acceptable. Even without annotations, the instructions are complete for correct use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

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 all three parameters. It does: hex_bytes format with an example, clear_buffer_first meaning ('Discard buffered RX before sending'), and connection semantics ('Which open connection (name). Default: the current one.'). This fully bridges the schema gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States the action as 'Send raw bytes given as hex' and immediately notes 'Writes to TX only; does NOT read,' which distinguishes it from read tools. The mention of binary protocols and Icom CI-V differentiates it from send_text and other text-oriented siblings. It is specific, unambiguous, and an agent can select it 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Use for binary protocols — notably Icom CI-V', gives an example, and contrasts with read_until_prompt: 'binary replies rarely have a text prompt, so read_until_prompt usually isn't the right tool for these.' It also recommends the correct follow-up pair (read_available + civ_parse), giving clear when-to-use and when-not-to-use direction.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

send_keysA

Press keys by name, encoded the way a VT100/xterm terminal sends them.

Use it for what send_text can't type: Ctrl-C to interrupt a running command (ping, monitor, a stuck process), Ctrl-Z, Esc, Tab (completion), arrows (history, menus), Enter alone, function keys, Page Up/Down. Each item is a key name ("ctrl-c", "esc", "tab", "enter", "up", "down", "left", "right", "home", "end", "pgup", "pgdn", "backspace", "delete", "f1".."f12", "space"), a single character, or "text:..." for a literal run. Nothing is read; follow with read_until_prompt, read_available, or screen.

ParametersJSON Schema
NameRequiredDescriptionDefault
keysYes
connectionNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It discloses that the tool only sends keys and does not read any output ('Nothing is read'), which is a critical behavioral trait. It also hints at the encoding format. While it doesn't mention permissions or rate limits, these are less relevant for a terminal key sender, and the key behavioral aspect (non-reading) is clearly stated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and then provides essential examples and usage details. Every sentence adds value: the encoding note, the use cases, the list of valid key names, and the post-action guidance. It is appropriately sized for a tool with a rich input format, and the structure is logical.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is complete for an agent to use the tool correctly. It covers the key input format, the types of keys, the encoding, and the fact that it doesn't read output. It also mentions follow-up actions and distinguishes from send_text. The output schema exists (though not shown) so return values need not be described. The only minor omission is the 'connection' parameter, but it is optional and likely clear from context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has only a generic array of strings for 'keys', but the description extensively explains the allowed values: key names ('ctrl-c', 'esc', 'tab', etc.), single characters, and 'text:...' for literal runs. This adds significant semantic meaning beyond the schema. The 'connection' parameter is not explained, but it is optional and likely self-explanatory, so the main parameter is well covered.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific verb ('Press keys') with a precise resource ('keys by name') and encoding standard ('VT100/xterm terminal'). It explicitly distinguishes itself from send_text by listing what send_text cannot type, which differentiates it from sibling tools like send_text and send_hex.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance: 'Use it for what send_text can't type' and provides concrete examples (Ctrl-C, Ctrl-Z, Esc, Tab, arrows, etc.). It also mentions what to do after ('Nothing is read; follow with read_until_prompt, read_available, or screen'), which clarifies the workflow and alternative tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

send_textA

Send an ASCII command to the device. Writes to TX only; does NOT read.

On an interactive console the device will ECHO this text back and then print its output; call read_until_prompt (or read_available) afterward to see it. Use clear_buffer_first=True to discard any stale/unsolicited output so the next read starts clean.

Args: data: The command text, e.g. "show version", "FA014250000", or "ID". Non-ASCII characters are sent as "?"; use send_hex for raw bytes. line_ending: What to append — "CR" (\r, most rigs), "CRLF" (\r\n), "LF" (\n, most Unix-style consoles), or "NONE". Default: the connection's line ending (from connect or its preset). clear_buffer_first: Discard buffered RX before sending. connection: Which open connection (name). Default: the current one.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataYes
connectionNo
line_endingNo
clear_buffer_firstNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden and does so thoroughly. It discloses TX-only behavior, device echo behavior, stale-buffer handling, non-ASCII replacement with '?', default connection line ending, and default connection selection.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is detailed but every sentence earns its place: purpose, behavioral notes, then a clearly structured Args section. It front-loads the most important distinction (TX only, does not read) and keeps parameter explanations compact.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is complete for an agent to invoke this tool correctly. It covers all four parameters, the read-after-send workflow, the sibling tool to use for raw bytes, and buffer-clearing behavior; the existing output schema covers return-value expectations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema provides 0% description coverage, so the description must compensate, and it does. It explains data with concrete examples, defines each line_ending value including default behavior, clarifies clear_buffer_first semantics, and states the connection default.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Send an ASCII command to the device' and immediately distinguishes itself from read operations with 'Writes to TX only; does NOT read.' This clearly differentiates it from siblings like read_until_prompt, read_available, and send_hex.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit usage guidance: after sending, call read_until_prompt or read_available to see output, use clear_buffer_first=True to discard stale output, and use send_hex for raw bytes or non-ASCII data. These are concrete when-to-use and when-not-to-use instructions referencing sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_linesA

Set the DTR and/or RTS output lines and hold them.

Uses: key a transmitter whose PTT is wired to RTS or DTR (set it True to transmit, False to stop; pulse_line is safer for that), hold an Arduino in reset (DTR False), or tell a modem you're present. Leave a line at None to keep it unchanged. Refused in read-only mode.

ParametersJSON Schema
NameRequiredDescriptionDefault
dtrNo
rtsNo
connectionNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral burden and does so well: it discloses that the lines are held, that None leaves a line unchanged, that True/False drive the output, and that the tool is refused in read-only mode. This goes beyond the bare schema and gives the agent accurate state-change expectations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The main action is front-loaded in a single sentence, followed by compact use cases and caveats. Every sentence adds information; there is no filler or repetition of schema fields.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a three-optional-parameter tool with an output schema, the description is nearly complete: intent, dtr/rts semantics, safety guidance, and read-only behavior are all covered. The only notable gap is the connection parameter, which is left to be inferred rather than explained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description compensates for zero schema-description coverage by explaining dtr and rts semantics ('set it True to transmit, False to stop', 'DTR False' for reset, None to keep unchanged). However, the connection parameter is never explained, so a third of the parameters still lack semantic guidance.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: 'Set the DTR and/or RTS output lines and hold them.' It also distinguishes itself from pulse_line by noting that pulse_line is safer for keying a transmitter, so the agent can tell it apart from a sibling 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives concrete when-to-use scenarios: keying a PTT wired to RTS/DTR, holding an Arduino in reset, and signaling a modem. It also gives an exclusion by recommending pulse_line as safer for PTT use, and explicitly warns 'Refused in read-only mode.'

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

statusA

Report every open port: settings, reader state, buffered bytes, control-line states, capture, and which connection is current. With nothing open, lists what reconnect_last remembers.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full behavioral burden and largely succeeds: it discloses the comprehensive read-only scope across ALL open ports, the specific state domains covered, and the empty-state behavior. It stops short of explicitly confirming non-mutation or data freshness, but the verb 'Report' plus the disclosed edge case gives solid coverage for a status tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with zero waste. The core verb-action is front-loaded ('Report every open port'), the content enumeration is compact yet informative, and the edge-case sentence earns its place by covering the nothing-open scenario. Every clause adds information an agent needs.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Complete for a no-argument diagnostic tool. Zero parameters remove the parameter-documentation burden, an output schema exists to cover return values, and the description handles every remaining question an agent could have: what is reported, over what scope, and what happens with no open ports. 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.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Zero parameters, so the baseline is 4. The description reinforces the no-argument global-report nature ('every open port') consistent with the empty input schema, and adds that no target/port selection is needed. There is nothing more the description could meaningfully add about parameters that do not exist.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb 'Report' plus resource 'every open port', followed by an enumerated list of content categories (settings, reader state, buffered bytes, control-line states, capture, current connection). The second sentence adds scope precision by describing the no-connection case. This clearly differentiates it from siblings like list_serial_ports (hardware discovery), connect/disconnect (lifecycle changes), and read_available (data reading) — it is unambiguously the connection-state reporting tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The diagnostic use case is implied rather than stated: 'Report every open port' signals this is the tool to call when you need current connection state, and the edge-case sentence tells the agent it still returns useful information when nothing is open. However, among 29 siblings, the description never explicitly names alternatives (e.g., screen, read_available, port_in_use_by) or states when NOT to use it, so routing 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.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 28 tool updatesv0.3.2
    • Addedcapture_start
    • Addedcapture_stop
    • Addedcat_build
    • Addedcat_parse
    • Addedciv_build
    • Addedciv_freq
    • Addedciv_parse
    • Changedclear_buffer1 field changed
      • addedInput schema / properties / connection
        Added value: +{
        +  "default": "",
        +  "title": "Connection",
        +  "type": "string"
        +}
    • Changedconnect28 fields changed
      • addedInput schema / properties / baud / anyOf
        Added value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / baud / default
        Previous value: -9600New value: +null
      • removedInput schema / properties / baud / type
        Removed value: -"integer"
      • addedInput schema / properties / bytesize / anyOf
        Added value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / bytesize / default
        Previous value: -8New value: +null
      • removedInput schema / properties / bytesize / type
        Removed value: -"integer"
      • addedInput schema / properties / cols
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Cols"
        +}
      • addedInput schema / properties / line_ending
        Added value: +{
        +  "anyOf": [
        +    {
        +      "enum": [
        +        "CR",
        +        "CRLF",
        +        "LF",
        +        "NONE"
        +      ],
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Line Ending"
        +}
      • addedInput schema / properties / name
        Added value: +{
        +  "default": "",
        +  "title": "Name",
        +  "type": "string"
        +}
      • addedInput schema / properties / parity / anyOf
        Added value: +[
        +  {
        +    "enum": [
        +      "N",
        +      "E",
        +      "O"
        +    ],
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / parity / default
        Previous value: -"N"New value: +null
      • removedInput schema / properties / parity / enum
        Removed value: -[
        -  "N",
        -  "E",
        -  "O"
        -]
      • removedInput schema / properties / parity / type
        Removed value: -"string"
      • addedInput schema / properties / preset
        Added value: +{
        +  "default": "",
        +  "title": "Preset",
        +  "type": "string"
        +}
      • addedInput schema / properties / prompt
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Prompt"
        +}
      • addedInput schema / properties / prompt_regex
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Prompt Regex"
        +}
      • addedInput schema / properties / rows
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Rows"
        +}
      • addedInput schema / properties / rtscts / anyOf
        Added value: +[
        +  {
        +    "type": "boolean"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / rtscts / default
        Previous value: -falseNew value: +null
      • removedInput schema / properties / rtscts / type
        Removed value: -"boolean"
      • addedInput schema / properties / stopbits / anyOf
        Added value: +[
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / stopbits / default
        Previous value: -1New value: +null
      • removedInput schema / properties / stopbits / type
        Removed value: -"number"
      • addedInput schema / properties / terminal
        Added value: +{
        +  "anyOf": [
        +    {
        +      "enum": [
        +        "dumb",
        +        "ansi",
        +        "vt100",
        +        "xterm"
        +      ],
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Terminal"
        +}
      • removedInput schema / properties / timeout
        Removed value: -{
        -  "default": 1,
        -  "title": "Timeout",
        -  "type": "number"
        -}
      • addedInput schema / properties / xonxoff / anyOf
        Added value: +[
        +  {
        +    "type": "boolean"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / xonxoff / default
        Previous value: -falseNew value: +null
      • removedInput schema / properties / xonxoff / type
        Removed value: -"boolean"
    • Addeddetect_baud
    • Changeddisconnect2 fields changed
      • addedInput schema / properties / all_connections
        Added value: +{
        +  "default": false,
        +  "title": "All Connections",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / connection
        Added value: +{
        +  "default": "",
        +  "title": "Connection",
        +  "type": "string"
        +}
    • Addedexpect
    • Addedget_transcript
    • Addedlist_presets
    • Addedport_in_use_by
    • Addedpulse_line
    • Changedquery_text8 fields changed
      • addedInput schema / properties / connection
        Added value: +{
        +  "default": "",
        +  "title": "Connection",
        +  "type": "string"
        +}
      • addedInput schema / properties / line_ending / anyOf
        Added value: +[
        +  {
        +    "enum": [
        +      "CR",
        +      "CRLF",
        +      "LF",
        +      "NONE"
        +    ],
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / line_ending / default
        Previous value: -"CR"New value: +null
      • removedInput schema / properties / line_ending / enum
        Removed value: -[
        -  "CR",
        -  "CRLF",
        -  "LF",
        -  "NONE"
        -]
      • removedInput schema / properties / line_ending / type
        Removed value: -"string"
      • addedInput schema / properties / prompt / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / prompt / default
        Previous value: -""New value: +null
      • removedInput schema / properties / prompt / type
        Removed value: -"string"
    • Changedread_available1 field changed
      • addedInput schema / properties / connection
        Added value: +{
        +  "default": "",
        +  "title": "Connection",
        +  "type": "string"
        +}
    • Changedread_until_prompt8 fields changed
      • addedInput schema / properties / auto_reply
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Auto Reply"
        +}
      • addedInput schema / properties / connection
        Added value: +{
        +  "default": "",
        +  "title": "Connection",
        +  "type": "string"
        +}
      • addedInput schema / properties / prompt / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / prompt / default
        Previous value: -"#"New value: +null
      • removedInput schema / properties / prompt / type
        Removed value: -"string"
      • addedInput schema / properties / regex / anyOf
        Added value: +[
        +  {
        +    "type": "boolean"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / regex / default
        Previous value: -falseNew value: +null
      • removedInput schema / properties / regex / type
        Removed value: -"boolean"
    • Changedreconnect_last1 field changed
      • addedInput schema / properties / name
        Added value: +{
        +  "default": "",
        +  "title": "Name",
        +  "type": "string"
        +}
    • Addedrotator_build
    • Addedrotator_parse
    • Addedscreen
    • Addedsend_break
    • Changedsend_hex1 field changed
      • addedInput schema / properties / connection
        Added value: +{
        +  "default": "",
        +  "title": "Connection",
        +  "type": "string"
        +}
    • Addedsend_keys
    • Changedsend_text5 fields changed
      • addedInput schema / properties / connection
        Added value: +{
        +  "default": "",
        +  "title": "Connection",
        +  "type": "string"
        +}
      • addedInput schema / properties / line_ending / anyOf
        Added value: +[
        +  {
        +    "enum": [
        +      "CR",
        +      "CRLF",
        +      "LF",
        +      "NONE"
        +    ],
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / line_ending / default
        Previous value: -"CR"New value: +null
      • removedInput schema / properties / line_ending / enum
        Removed value: -[
        -  "CR",
        -  "CRLF",
        -  "LF",
        -  "NONE"
        -]
      • removedInput schema / properties / line_ending / type
        Removed value: -"string"
    • Addedset_lines
  2. 11 tool updatesv0.1.0
    • First observedclear_buffer
    • First observedconnect
    • First observeddisconnect
    • First observedlist_serial_ports
    • First observedquery_text
    • First observedread_available
    • First observedread_until_prompt
    • First observedreconnect_last
    • First observedsend_hex
    • First observedsend_text
    • First observedstatus

TDQS

A4.1/5.0

Scored across 30 tools

Disambiguation5/5

Each tool targets a distinct operation: connection management, data sending/receiving, key presses, line control, capture, and protocol-specific build/parse helpers. Even closely related tools like send_text, send_hex, and query_text have clear boundaries (send-only vs. send+read), and read_until_prompt, read_available, screen, and get_transcript serve different reading modes.

Naming Consistency4/5

Names are mostly snake_case and follow a verb-first pattern (list_serial_ports, clear_buffer, read_available, capture_start). A few exceptions exist: 'status' and 'screen' are bare nouns, 'reconnect_last' uses an adverb, and 'port_in_use_by' is a noun phrase, but these are still understandable and don't undermine predictability.

Tool Count3/5

At 30 tools, the server is on the heavier side and exceeds the 15-tool sweet spot. However, the count is justified by the broad domain: general serial I/O, terminal emulation, line control, capture, and three separate radio/rotator protocol families each have dedicated builders/parsers. It's borderline but each tool serves a concrete purpose.

Completeness5/5

The tool surface thoroughly covers serial console workflows: discovery, connection, reconnection, baud detection, text/hex/key input, multiple read modalities, prompt-based reading, scripting, line control, break, capture, transcript access, and port conflict checks. The protocol helpers for CI-V, CAT, and rotators are complete with build/parse and frequency conversion, leaving no obvious dead ends.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    Enables AI assistants to communicate with serial port devices, supporting port management, data transmission in text/binary modes, interactive terminal sessions, and automatic reconnection.
    14
    12
    MIT
  • A
    license
    B
    quality
    A
    maintenance
    Enables SSH and UART/serial port access for Claude Code to directly control remote devices like Raspberry Pi, embedded systems, and IoT devices. Supports command execution, file transfers via SFTP, and serial communication.
    24
    1
    AGPL 3.0
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI tools like Claude Code and Codex CLI to read and write serial port data, facilitating embedded development workflows such as coding, flashing, and debugging.
    23 npm
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Enables AI agents to control serial port devices (modems, instruments, embedded boards) via MCP tools for listing ports, connecting, and sending/receiving commands.
    3
    1
    MIT