Skip to main content
Glama
ikatkov
by ikatkov

JDS2800 MCP

MCP server and JSON scripting CLI for a JUNTEK JDS2800 over USB serial.

Uses the existing Kristoff Bonne Python driver with per-operation serial ownership, line framing, parameter checks and verified readback. The legacy source and MIT license are vendored, so the server does not require another checkout or computer. Built with the official MCP Python SDK, pinned to version 1.30.0. Supports macOS and Linux with Python 3.11 or newer.

Install and run

git clone https://github.com/ikatkov/jds2800-mcp.git
cd jds2800-mcp
uv sync --locked
./jds2800 info
./jds2800 state

Run these commands from the checkout. The jds2800 and run-mcp launchers use the virtual environment created by uv sync. An installed package also provides jds2800 and jds2800-mcp console commands.

No port setting is required. The driver tries available USB serial ports, prioritizing JDS descriptions and CH340 adapters. It identifies a compatible generator by reading its model, serial number and channel states, without changing output settings. Probes have short timeouts and use the same serial lock as normal operations. Bluetooth/headset and debug-console ports are excluded.

If no generator answers, the CLI exits with status 2 and an error listing the ports it tried. If multiple generators answer, it asks you to select one explicitly using --port or JDS2800_PORT. An explicit port always overrides discovery.

Related MCP server: dwf-mcp-server

Manual reference for agents

Read JDS2800-reference.md before controlling the instrument. It summarizes the supplied manufacturer's 18-page English manual (Rev 1.0, June 2018), with page references, specifications, operating procedures, documented ambiguities, 50-ohm power calculations, and separately labeled protocol details and measured hardware findings.

The same Markdown is bundled in the Python package and available without a generator connection through the MCP get_manual tool or the jds2800://manual resource (text/markdown). Server instructions direct agents to it. The CLI ./jds2800 manual returns it as a JSON string; ./jds2800 call get_manual also works.

MCP connection

Install the console commands so an MCP client can launch the server from any directory:

uv tool install .

Copy .mcp.example.json into the client's MCP settings:

{
  "mcpServers": {
    "jds2800": {
      "command": "jds2800-mcp"
    }
  }
}

Ensure the installed console command is on the client's PATH. For development, ./run-mcp launches the checkout's environment; configure the client with the path to your own checkout rather than a path from someone else's machine.

Server startup and tool discovery do not open the generator or enable outputs. The server implements 17 tools:

Tool

Purpose

get_manual

Bundled specifications, operating notes and verified limitations

get_calibration

Per-channel measured 50-ohm sine power table and valid ranges

preview_power

Check device identity and calculate voltage for requested dBm

set_power

Configure calibrated sine power into a physical 50-ohm load

list_ports

Find USB serial ports without opening them

list_waveforms

Built-in names/IDs and arbitrary slots

get_device_info

Model code, serial, port and frequency limit

get_state

Read both channels or one channel, mode and phase

configure_channel

Frequency, waveform, amplitude, offset, duty and enable

set_outputs

Independently enable/disable either output

set_phase

Inter-channel phase; negative values normalized modulo 360

set_mode

Explicitly select mode and stop active actions

configure_sweep

Sweep parameters, readback, optional start

stop_outputs

Stop actions and disable both outputs

read_register

Read protocol registers, including counter/measurement data

read_arbitrary

Read 2048 samples from a stored waveform

upload_arbitrary

Overwrite a stored waveform and verify all samples

Scripting CLI

Successful commands print one JSON value to stdout. Failures print JSON to stderr and exit with status 2. Help/argument parsing uses the standard argparse interface. The port is discovered automatically. To override it, supply --port before the subcommand or set JDS2800_PORT.

# 1 kHz triangle, 2 Vpp, +1 V offset on channel 1.
./jds2800 configure 1 --waveform TRIANGLE --frequency-hz 1000 \
  --amplitude-vpp 2 --offset-v 1 --enabled on

# 2 kHz, 1 Vpp, 30% duty on channel 2.
./jds2800 configure 2 --waveform PULSE --frequency-hz 2000 \
  --amplitude-vpp 1 --offset-v 0 --duty-percent 30 --enabled on

./jds2800 outputs --ch1 off
./jds2800 phase -90
./jds2800 stop

# Every MCP tool is also available through `call`.
./jds2800 call get_state --args '{"channel":2}'
./jds2800 call configure_sweep --args \
  '{"channel":1,"start_hz":1000,"end_hz":2000,"time_s":1,"start":false}'
./jds2800 mode WAVE_CH1

# Multiple operations, one serial lease. This example enables both outputs.
./jds2800 batch examples/dual-channel.json
./jds2800 stop

batch also accepts - to read a JSON array from stdin. Entries contain an operation (the MCP tool name) and an optional arguments object. Operations run sequentially and stop on the first failure. Earlier operations are not rolled back; the error includes their results and the failing entry's zero-based index.

Device behavior and units

  • Frequency is in Hz, amplitude in V peak-to-peak, offset in V, duty in percent, and phase in degrees. Frequency readback uses the actual quantized device value.

  • The connected unit reports model code 15, serial 1816400000. Its sine limit is 15 MHz. The driver detects the limit instead of assuming the original JDS6600 library's 60 MHz maximum.

  • Pulse/CMOS/arbitrary frequency is limited to 6 MHz. Other non-sine waveforms are limited to the smaller of the model limit and 25 MHz.

  • Amplitude and offset limits are checked together. Maximum amplitude decreases above 10 MHz and 30 MHz; non-sine amplitude is conservatively capped at 5 Vpp above 10 MHz. The allowed offset range also depends on amplitude. The actual load affects physical voltage. The tested wiring used direct coax into the scope's high-impedance inputs, with probe attenuation 1×.

  • Device synchronization can make selected CH2 parameters follow CH1 (manual p. 18). This server does not read or change synchronization settings; check the front-panel SYS menu before relying on independent channel parameters.

  • SQUARE is physically 50% duty on this unit. The duty register can say 30% while the square wave stays at 50%. Use PULSE for adjustable duty. Requests to set a non-50% SQUARE duty are rejected before writing.

  • Channel configuration requires WAVE_CH1 or WAVE_CH2 mode. It validates the complete target configuration, temporarily disables the target channel, writes and reads back all its parameters, then restores its previous enable state unless enabled was supplied. It preserves the other channel's enable state.

  • A failed configuration requests the target channel off and reports an error. Unplugging can prevent that request from reaching the device. There are no automatic write retries or claims of rollback; read state before continuing.

  • Each operation releases the serial connection after completion. CLI commands can coexist with a running MCP server. A shared file lock serializes operations across processes, including a complete batch. External legacy programs do not participate in this lock and should not run against the same port concurrently.

  • configure_sweep selects sweep mode and stops prior actions. It preserves output enable state; start=true starts the action. Return explicitly to wave mode before ordinary configuration. Arbitrary uploads overwrite device storage; they do not select the slot or enable output.

Calibrated sine output in dBm

The bundled power calibration is for this 15 MHz generator, serial 1816400000, with separate tables for CH1 and CH2. It uses external 50-ohm terminations at Rigol CH1/CH3 through the existing direct coax cables. These loads must be present at the receiving end when using dBm settings. Scope-referenced power includes the measured cable loss.

./jds2800 calibration
./jds2800 preview-power 1 --frequency-hz 5500000 --dbm 0
./jds2800 power 1 --frequency-hz 5500000 --dbm 0 --enabled on
./jds2800 power 2 --frequency-hz 14500000 --dbm -10 --enabled on
./jds2800 stop

set_power / power explicitly sets SINE, zero DC offset, 50% duty, frequency, and calibrated amplitude. It preserves output enable state unless enabled is supplied. It requires wave mode, verifies the generator serial and register readback, and refuses requests outside the measured frequency/level ranges. It does not remeasure power on every call. The returned predicted_power_dbm accounts for the generator's 1 mV amplitude increments.

Calibration covers 1–15 MHz, at every integer MHz plus 10.01 MHz, with ten amplitude settings per frequency on each channel: 320 points, each measured three times. The table supports approximately -29 to +11 dBm across the full frequency range, with precise per-frequency bounds reported by get_calibration. The ordinary voltage controls retain the manufacturer's larger amplitude range; the power controls require measured coverage. No frequency or level extrapolation is performed. Interpolation is linear in dBm versus log amplitude and log frequency.

MCP get_calibration(include_points=true) returns the full measured table. The resource jds2800://calibration returns metadata and supported ranges. An alternate calibration file can be selected using JDS2800_CALIBRATION; it must match the actual device and use the same sine/zero-offset/50-ohm convention. The table is bundled in the installed package. Published evidence omits private paths and connection addresses while preserving numeric readings and provenance.

The bundled profile applies only to serial 1816400000; other units require their own measured profile, selected with JDS2800_CALIBRATION. Calibration collection currently targets 15 MHz units.

To repeat calibration, attach both external 50-ohm loads, supply the scope server and address as described below, and run:

uv run jds2800-calibrate --scope-host "$RIGOL_HOST" --rigol-server "$RIGOL_SERVER" \
  --out artifacts/new-power-calibration.json --confirm-50ohm

This procedure changes channel settings, uses the Rigol MCP server, saves partial measurements as it runs, and disables both outputs on completion or a handled failure. --resume continues an incomplete run with the same measurement grid. The checked-in data are validated against independent frequency/level requests by scripts/verify_power.py. This is a scope-referenced correction; absolute accuracy still depends on the scope, terminations, cables, and operating conditions. The RMS measurement includes harmonics and noise rather than isolating the RF fundamental. Sine power calibration does not apply to square/pulse/noise outputs.

Scope readings come from numeric measurement queries. The collector clears previous measurements before each reading, retains Vpp, and derives AC power from RMS with the measured DC component removed. The display scale only keeps signals in range. The original 256 points used 16-acquisition averaging; 64 refinement points and the independent checks use normal acquisition. See the guide for the raw evidence.

Independent verification passed 72 checks from -25 to +10 dBm, including intermediate frequencies, the 10 MHz boundary, and both outputs together. The largest difference from requested power was 0.195 dB relative to this scope. See the results. Both outputs were left off.

What was tested

On October 3, 2026, both connected channels were verified through the actual stdio JDS2800 MCP server and the existing Rigol scope MCP server. Wiring: generator CH1 → scope CH1; generator CH2 → scope CH3. Scope: DS1104Z, serial DS1ZA225013504. See the measured values and screenshot in artifacts/hardware-verification.json and artifacts/scope-triangle-pulse.png.

The hardware test covers both sine outputs, the original triangle/offset setup, 30% pulse duty, independent output switching, negative-phase register readback, model-limit rejection without mutation, and CLI access while MCP is alive. The scope readings verify control behavior; this is not a calibration of absolute amplitude. Both generator outputs are off at the end of the test.

Sweep parameter/mode readback and reading all 2048 samples from arbitrary slot 1 were also checked on the device. Sweep progression, physical inter-channel phase, arbitrary uploads, and external counter/measurement inputs have not been verified on the scope. The tests do not overwrite stored arbitrary waveforms.

uv run pytest -q
uv run ruff check src tests scripts
uv run ruff format --check src tests scripts

# Handshake and discovery without hardware.
uv run python scripts/check_mcp.py

# Read the device through MCP without changing its settings.
uv run python scripts/check_mcp.py --hardware

# Changes both channels for testing, captures scope data, then disables outputs.
uv run python scripts/verify_hardware.py --rigol-server "$RIGOL_SERVER" \
  --scope-host "$RIGOL_HOST"

Supply RIGOL_SERVER as the path to a compatible Rigol stdio MCP server script and RIGOL_HOST as the scope hostname or IP address. The hardware checks use the active Python environment and USB discovery unless --port is supplied. The scope server must be able to run in that environment. Scope setup writes are followed by *OPC? through its scpi MCP tool to wait for completion.

Library comparison

Two drivers were exercised against the same 15 MHz instrument:

Driver

Observed result

Assessment for this server

Python on1arf/jds6600_python v0.1.0

Read both channels and changed frequency, waveform, amplitude, offset and enables

Compact API, same language as MCP, and compatible with the reproduced automation sequence

Rust signal-gen-cjds66 v0.1.10

Read identity, frequency/amplitude, and changed settings in individual commands

Partly compatible, but combined reads failed with exit status 19

The Rust reproduction --gg --gn successfully read CH1's offset, then failed on CH2 with a missing-equals error. Its fixed-size read() calls do not consume a complete variable-length CRLF reply or check the number of bytes returned. A leftover byte is parsed as the next response. See artifacts/rust-offset-read.txt and artifacts/rust-frequency-write.txt.

The Python library is the better starting point, but its original class-level serial handle and loose validation also needed improvement. This server bypasses that constructor, replaces the transport, verifies readback, prevents negative waveform indexes, and fixes the original negative-phase conversion. The vendored Python driver makes ordinary operation independent of the comparison drivers.

Configuration

Setting

Default

JDS2800_PORT / --port

Probe USB serial ports and select a single matching JDS generator

JDS2800_TIMEOUT / --timeout

1 second per serial reply/write

JDS2800_LOCK_TIMEOUT

5 seconds waiting for another operation

Protocol reference: upstream register map. Hardware ranges follow the supplied manufacturer's manual, summarized in the bundled reference, which records the document edition, page references, and checksum. MIT license; the vendored library retains its original copyright and license.

Available Tools

17 tools
configure_channelA
Destructive

Set channel parameters in wave mode and verify them. Unspecified settings are preserved. Output is gated during changes; its previous enable state is restored unless enabled is supplied. Limits follow the detected model. On communication/readback failure the target output is requested off. SQUARE is physically 50% duty; use PULSE for adjustable duty.

ParametersJSON Schema
NameRequiredDescriptionDefault
channelYes
enabledNo
offset_vNo
waveformNo
duty_percentNo
frequency_hzNo
amplitude_vppNo

TDQS

A3.9/5.0
Behavior5/5

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

Goes well beyond the annotations: 'Unspecified settings are preserved' discloses partial-update semantics, the gating/restore-of-enable-state sentence describes a real side effect, and the failure clause ('target output is requested off') discloses a safety-relevant behavior on error. This is exactly the extra context the destructive/non-idempotent annotations cannot convey.

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 core action is front-loaded and every sentence carries behavioral information rather than filler. The dense multi-clause sentences (gating/restore, failure handling) make it slightly hard to scan, but nothing is wasted.

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 7-parameter mutating tool with no output schema and destructive annotation, it covers side effects, partial-update behavior, model-dependent limits, and failure semantics well. Remaining gaps are the undocumented value/unit semantics of the numeric parameters.

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 carry parameter meaning. It clarifies 'enabled' handling, explains the waveform SQUARE vs PULSE distinction, and derives duty_percent behavior, but leaves offset_v, frequency_hz, amplitude_vpp (units, ranges) and the string-vs-integer waveform encoding undocumented.

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

Purpose4/5

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

States a specific verb and resource ('Set channel parameters in wave mode') and adds a verify step, which is enough to distinguish it from sibling writers like set_phase and configure_sweep. It does not explicitly name those siblings, keeping it short of a 5.

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

Usage Guidelines3/5

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

Usage context ('in wave mode', on channel 1/2) is implied but there is no explicit when-to-use vs alternatives such as configure_sweep, set_mode, or set_outputs. The SQUARE/PULSE advice is parameter-level, not tool-selection guidance.

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

configure_sweepB
Destructive

Switch to sweep mode, configure and read back limits. start=true starts the sweep. Output enable state is preserved; use set_outputs separately.

ParametersJSON Schema
NameRequiredDescriptionDefault
scaleNoLINEAR
startNo
end_hzYes
time_sYes
channelYes
start_hzYes
directionNoRISE

TDQS

B3.1/5.0
Behavior3/5

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

Annotations already declare the destructive, non-idempotent write profile, so the bar is lower. The description adds genuinely useful context that output enable state is preserved and must be changed via set_outputs, but it never explains what the destructiveHint actually destroys or whether the sweep must be stopped first.

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?

Three short sentences, front-loaded with the core action and no filler. The 'read back limits' phrasing is slightly ambiguous but the structure is efficient.

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

Completeness2/5

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

For a 7-parameter, destructive, non-idempotent tool with no output schema and 0% schema description coverage, the description is too thin. It omits the meaning of most parameters and the concrete consequences of the destructive flag, leaving real gaps for an agent to call it safely.

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 coverage is 0% across 7 parameters, so the description carries the full burden. It explains only start (=true starts the sweep) and alludes to the frequency limits; scale, direction, time_s, and channel are left entirely undocumented in both schema and description.

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

Purpose4/5

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

States a specific verb+resource: switch to sweep mode, configure and read back limits. An agent can identify it as the sweep-configuration tool and distinguish it from set_mode/configure_channel. It lacks explicit sibling differentiation, so it lands just below top marks.

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?

It gives one conditional usage rule (start=true starts the sweep) and routes output control to set_outputs. However, it never states when to prefer this over set_mode or configure_channel, so the guidance is partial and implied rather than explicit.

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

get_calibrationA
Read-onlyIdempotent

Read measured power calibration metadata/ranges without opening a port. include_points=true also returns the full amplitude/frequency measurement table. Applies to zero-offset SINE into a physical 50-ohm load through measured cables.

ParametersJSON Schema
NameRequiredDescriptionDefault
channelNo
include_pointsNo

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds genuinely new behavioral context: the operation does not open a port (no hardware side effect) and include_points=true escalates the payload to the full amplitude/frequency table. That is meaningful disclosure beyond the annotations.

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

Conciseness5/5

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

Three tight sentences, front-loaded with the core action, then the flag behavior, then the applicability constraint. No filler or repetition of the schema.

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?

There is no output schema, yet the description tells the agent what comes back (metadata/ranges, or the full point table) and when the tool is applicable. The only shortfall is that the meaning of the 'channel' argument is left unresolved.

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 carry parameter meaning. It fully explains include_points=true (returns the full measurement table) but says nothing about 'channel' — whether null means both channels, or what 1 vs 2 selects. Half the parameters are clarified, leaving a real gap.

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

Purpose4/5

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

States a concrete verb and resource ('read measured power calibration metadata/ranges') and adds a distinguishing scope constraint ('without opening a port') that separates it from hardware-affecting siblings like preview_power or set_power. It never names a sibling directly, but the resource and constraint are specific enough to route correctly.

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 gives a real precondition ('Applies to zero-offset SINE into a physical 50-ohm load through measured cables') and implies when the extra flag is wanted, but it does not name alternatives or state when NOT to use this tool. Usage is inferable rather than explicit.

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

get_device_infoA
Read-onlyIdempotent

Read the model code, serial number, port and detected sine frequency limit.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered. The description adds genuine value by disclosing the returned fields, which matters because there is no output schema to convey the response shape.

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?

A single front-loaded sentence with no filler; every listed field earns its place by describing the return payload.

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 zero-parameter, read-only query with no output schema, listing the returned fields is the key completeness requirement and it is met. Minor gaps remain, such as error behavior when no device is connected, but nothing essential 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 takes zero parameters, so there is nothing to disambiguate and the baseline of 4 applies. The description cannot and need not add parameter meaning.

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

Purpose4/5

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

States a specific verb (Read) and resource (device info) and enumerates the exact fields returned (model code, serial number, port, sine frequency limit). This clearly distinguishes it from siblings like get_state or list_ports, though it does not name any sibling explicitly.

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?

There is no guidance on when to call this versus get_state, list_ports, or get_manual, all of which could plausibly return overlapping device information. Usage is only implied by the field list, and no prerequisites or exclusions are given.

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

get_manualA
Read-onlyIdempotent

Read the bundled manual reference: model/frequency/voltage limits, 50-ohm power estimates, modes, synchronization, protocol notes, and tested behavior. Includes source page numbers and discrepancies. No serial port is opened.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

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?

Annotations already declare readOnly/idempotent/non-destructive, so the safety bar is met. The description adds real behavioral context beyond them: no serial port is opened (no hardware side effects, safe to call without a connected device) and it discloses that source page numbers and discrepancies are surfaced. It could still note caching or size limits.

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?

Three tight sentences, front-loaded with the core action, followed by a compact content list and a behavioral caveat. The content enumeration is slightly list-heavy but each item is informative rather than filler.

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?

With an output schema present, return-value structure need not be documented, annotations cover the safety profile, and there are no parameters. The description still adds value by previewing what the manual content contains, making it complete for an 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?

The tool takes zero parameters, so the schema carries no semantic burden and the baseline is 4. The description correctly adds nothing param-related, which is appropriate 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?

States a specific verb and resource ("Read the bundled manual reference") and enumerates exactly what the manual covers (model/frequency/voltage limits, power estimates, modes, synchronization, protocol notes). "No serial port is opened" cleanly separates it from the hardware-controlling siblings like set_power and configure_channel.

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 implies this is a reference lookup that requires no device connection, which hints at when it is safe to call, but it never states explicit trigger conditions (e.g. "call this before configuring a channel") or names alternatives. Usage is left to inference.

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

get_stateA
Read-onlyIdempotent

Read mode, phase and channel settings. Omit channel to read both.

ParametersJSON Schema
NameRequiredDescriptionDefault
channelNo

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds the useful behavioral detail that omitting the channel reads both channels, but says nothing about response shape, units, or error behavior for an out-of-range channel.

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 short sentences, zero filler, with the core action stated first and the parameter rule second. Nothing to trim.

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?

There is no output schema and no annotation detail about the returned data, so the description is the only source of what "state" means. It names mode, phase and channel settings, which is minimally sufficient, but omits return format, units and value ranges that an instrument-control agent would likely need.

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 coverage is 0% and the single channel parameter has only an enum of 1/2 with default null, so the description must carry the semantics. It does explain the meaningful distinction (present = one channel, omitted = both), which is exactly the ambiguity the schema leaves open, though it never names which channel values are valid.

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

Purpose4/5

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

Specific verb ("Read") plus a concrete resource set (mode, phase and channel settings), which separates it from siblings like get_calibration, get_manual and get_device_info. It does not explicitly name those siblings, but the resource is narrow enough that an agent can place it.

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?

"Omit channel to read both" is a genuine usage instruction for the optional parameter, implying the tool can be called with no argument to read all channels. However, there is no guidance on when to prefer this tool over get_calibration or the get_* siblings, and no stated prerequisites or ordering constraints.

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

list_portsA
Read-onlyIdempotent

List USB serial ports without opening the generator.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

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?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false. The description adds meaningful context beyond them: it performs discovery without opening a device session, so no generator connection or state change occurs. It does not describe output format, but the output schema covers that.

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?

A single short sentence with no waste, front-loading the action and resource before the clarifying constraint.

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 zero-parameter, read-only discovery tool with an output schema, the description covers the essential behavior. It is close to complete; only an explicit pointer on when to prefer this over sibling enumeration tools would add value.

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 takes zero parameters, which is the baseline 4 case; there is no parameter syntax to explain. The description adds no parameter detail, but none is needed.

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

Purpose4/5

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

States a specific verb ("List") and resource ("USB serial ports") with a clarifying scope note that it does not open the generator. This clearly separates it from device-control siblings like set_power or get_device_info, though it does not name an explicit alternative.

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 phrase "without opening the generator" implies the use case of enumerating available ports before connecting, but no explicit when-to-use/when-not guidance or named alternative is given. Adequate but inferred rather than stated.

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

list_waveformsA
Read-onlyIdempotent

List built-in waveform names/IDs and the 60 arbitrary waveform slots.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

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?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds useful context about what is listed (built-in names/IDs and the 60 arbitrary slots), but does not disclose anything further about behavior, such as ordering or pagination.

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

Conciseness5/5

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

A single, front-loaded sentence that states the tool's scope without any wasted words. It is appropriately sized for a simple list operation.

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 output schema exists, so return values need not be explained. For a zero-parameter, read-only listing tool with a clear one-sentence scope, the description is complete enough for an agent to call it correctly.

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

Parameters4/5

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

The tool takes zero parameters and the schema is empty, so there is nothing to document. The baseline for zero-parameter tools is 4.

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

Purpose4/5

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

The description gives a specific verb ('List') and a precise resource/scope ('built-in waveform names/IDs and the 60 arbitrary waveform slots'), so an agent knows exactly what content is returned. It does not explicitly distinguish this tool from sibling readers like read_arbitrary or get_device_info, which keeps it from a 5.

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

Usage Guidelines2/5

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

There is no explicit guidance on when to use this tool versus alternatives such as read_arbitrary or get_state. The usage is reasonably implied by the purpose, but no conditions or exclusions are stated.

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

preview_powerA
Read-onlyIdempotent

Check generator identity and calculate calibrated voltage for sine power into 50 ohms. Interpolates measured levels/frequencies; no extrapolation or writes. Returns predicted power after 1 mV amplitude quantization, not a live measurement.

ParametersJSON Schema
NameRequiredDescriptionDefault
channelYes
power_dbmYes
frequency_hzYes

TDQS

A3.9/5.0
Behavior4/5

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

Beyond the readOnly/idempotent/non-destructive annotations, the description reveals interpolation-only behavior, an output precision limit (1 mV amplitude quantization), and that the result is a prediction rather than a live measurement. These are meaningful fidelity caveats an agent cannot get from the annotations alone.

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?

Three tight sentences with the core computation front-loaded and the caveats trailing. The opening 'Check generator identity' is slightly tangential to the tool's name but not wasteful enough to hurt 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 3-required-parameter tool with no output schema, the description usefully characterizes the return value (predicted power, quantized, not live) and the interpolation limitation. It is nearly complete, missing only input unit/range expectations that the schema also omits.

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?

With 0% schema description coverage, the description must carry the parameter burden, and it partially does: it establishes the 50-ohm sine context and that frequency/power are interpolated. However, it never clarifies units, valid ranges, or the meaning of the channel enum, leaving real gaps for frequency_hz and power_dbm.

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

Purpose4/5

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

States a concrete computation ('calculate calibrated voltage for sine power into 50 ohms') plus a preliminary identity check, which is far more specific than a restatement of the name. It implicitly contrasts with the write-capable sibling set_power by noting there are 'no writes', though no sibling is named explicitly.

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?

Gives a real usability boundary: 'Interpolates measured levels/frequencies; no extrapolation', which tells the agent the tool only works inside the calibrated measurement grid. It implies but does not explicitly state that set_power should be used when an actual change is desired.

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

read_arbitraryA
Read-onlyIdempotent

Read all 2048 samples from an arbitrary waveform slot, numbered 1..60.

ParametersJSON Schema
NameRequiredDescriptionDefault
slotYes

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so the safety profile is covered. The description still contributes useful behavior context by fixing the read size at all 2048 samples (i.e., no partial reads) and constraining the slot domain, but it says nothing about return format, units, or error behavior for an out-of-range slot.

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?

One front-loaded sentence that conveys action, scope (all 2048 samples), and the parameter domain with zero padding. Every clause 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?

For a simple single-parameter read whose annotations already cover safety, the definition is adequate but incomplete: with no output schema, the description should describe what the 2048 samples look like on return, and it offers no error or boundary behavior.

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 coverage is 0%, so the description must carry the parameter meaning, and it does: it identifies the single arg as an arbitrary-waveform slot with valid values numbered 1..60. That domain constraint is meaningful semantics absent from the bare integer 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?

Specific verb (Read) plus resource (samples from an arbitrary waveform slot) with the exact sample count (2048) and slot domain. An agent can immediately distinguish this read operation from the sibling upload_arbitrary without opening a schema.

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

Usage Guidelines3/5

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

Usage is only implied: the tool reads arbitrary-waveform data, and the counterpart upload_arbitrary is visible among siblings. The description never states when to reach for this versus upload_arbitrary or how it fits a read-after-upload workflow, so guidance is inferred rather than given.

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

read_registerA
Read-onlyIdempotent

Read a protocol register 0..89 for diagnostics or measurement/counter data. Unsupported registers may time out; this does not select a mode.

ParametersJSON Schema
NameRequiredDescriptionDefault
registerYes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered. The description adds genuine beyond-annotation context: unsupported registers may time out, and the call has no mode-selecting side effect. It stops short of describing the returned value shape or timing expectations for valid registers.

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 short sentences, the core capability and valid range front-loaded, followed by the failure mode and the no-side-effect caveat. No filler and nothing repeated from the schema or annotations.

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 one-parameter read tool with no output schema and annotations already carrying the safety profile, the description covers the actionable essentials: valid range, timeout risk on unsupported registers, and absence of mode switching. Only the interpretation of returned data is missing, which is minor.

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 coverage is 0% and the schema only says "integer" with no bounds, so the description's 0..89 range is real added value. But it does not explain what individual registers map to (which hold diagnostics vs counter data) or what the returned value means, leaving the parameter only partly compensated.

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

Purpose4/5

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

Specific verb + resource ("Read a protocol register") with a stated valid range (0..89) and a use domain (diagnostics or measurement/counter data). It does not explicitly distinguish itself from the closest sibling read_arbitrary, so it stops short of a 5.

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

Usage Guidelines3/5

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

"for diagnostics or measurement/counter data" gives clear context for when this is the right call, and "this does not select a mode" is a useful negative hint. However it never names an alternative tool or states an explicit when-not-except-for-mode-selection condition, so usage remains implied rather than directed.

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

set_modeA
Destructive

Stop current actions, select the operating mode and verify it.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeYes

TDQS

A3.5/5.0
Behavior4/5

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

Annotations already mark it as destructive and non-idempotent. The description adds two useful behavioral details beyond annotations: it stops current actions (clarifying what is disrupted) and it verifies the selected mode (post-condition check). It still omits any permission or blocking behavior details.

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?

A single sentence, front-loaded with the destructive side effect and then the selection and verification steps. Every word earns its place; 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 one-param enum tool with safety annotations and no output schema, the description covers the basic action and side effect. It omits what the modes mean and how the tool relates to siblings like configure_channel, leaving the agent with an incomplete operational picture.

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 single 'mode' parameter is an enum with nine values, none explained. The description says 'operating mode' but does not add meaning for any enum value or constraints, so it 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.

Purpose4/5

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

The description names a specific action ('select the operating mode') and a concrete side effect ('Stop current actions'), so the purpose is clear. However, it offers no differentiation from siblings such as configure_channel or set_outputs, which could also change device behavior.

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?

Usage is implied: use this tool to change the operating mode, and be aware it stops current actions. There is no explicit guidance on when to choose set_mode over configure_channel/set_outputs 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.

set_outputsA
Destructive

Enable or disable outputs independently, preserving unspecified output state.

ParametersJSON Schema
NameRequiredDescriptionDefault
ch1No
ch2No

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already carry the safety profile (destructiveHint=true, readOnlyHint=false, idempotentHint=false). The description adds one genuinely useful trait beyond them: partial-update semantics where omitted channels keep their current state. It does not add anything further (no error behavior, no effect on signal/power state).

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?

A single tight sentence with zero filler, and the most decision-relevant constraint ('independently... preserving unspecified output state') is front-loaded.

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 (2 optional booleans, no output schema, no nesting), and the description covers purpose plus the partial-update behavior. It leaves unanswered what the two channel parameters map to and what happens on failure, which matters given the zero schema description coverage.

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 coverage is 0%, so the description must compensate. It does partially: 'preserving unspecified output state' explains that a null/omitted channel leaves state unchanged, which is the key semantic for the two optional boolean params. It never maps ch1/ch2 to specific channels or states the true/false meaning explicitly, so the agent still infers the per-parameter mapping.

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

Purpose4/5

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

States a specific verb pair ('Enable or disable') and a specific resource ('outputs'), and the words 'independently' and 'preserving unspecified output state' distinguish it from the sibling stop_outputs, which presumably acts on all outputs at once. Clear enough for an agent to choose between them, though neither sibling is named explicitly.

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?

Usage context is implied rather than stated: 'independently' and 'preserving unspecified output state' signal this is for selective/per-output changes rather than a bulk stop. There is no explicit when-to-use-this-vs-stop_outputs routing, so the agent must infer it.

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

set_phaseA
Destructive

Set inter-channel phase, normalized to 0..359.9 degrees, with readback.

ParametersJSON Schema
NameRequiredDescriptionDefault
phase_degYes

TDQS

A3.5/5.0
Behavior3/5

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

Annotations declare readOnlyHint=false, idempotentHint=false, and destructiveHint=true, so the safety profile is already covered. The description adds the normalized range and a readback behavior, which is useful context, but does not explain what is destructive, whether the change is reversible, or what the readback returns.

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?

A single front-loaded sentence that packs purpose, range, and readback without wasted words. It is appropriately sized for a one-parameter tool.

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 mutation, the description covers purpose, value range, and readback, while annotations handle the destructive safety profile. It stops short of explaining the readback output or the operational context of inter-channel phase, but no output schema exists and the remaining gaps are minor.

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 coverage is 0%, so the description must compensate. It does so well for the single parameter by specifying the normalized range 0..359.9 degrees, implying units and precision; it does not clarify accepted fractional values or wrap-around behavior, but it adds substantial meaning beyond the bare 'phase_deg' schema field.

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

Purpose4/5

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

States a specific verb ('Set') and resource ('inter-channel phase'), making the tool's function unambiguous. It does not, however, distinguish this from sibling tools like set_power or configure_channel, so an agent gets no routing signal beyond the resource name.

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?

Provides no when-to-use or when-not-to-use guidance, and does not mention any alternatives or prerequisites. The agent must infer that this is the tool for phase adjustments from the purpose alone.

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

set_powerA
Destructive

Set calibrated sine power into a physical 50-ohm load using the measured table. Sets waveform=SINE, DC offset=0, duty=50, and frequency/amplitude. Requires wave mode and matching serial number. Preserves enabled state unless supplied. Predicted dBm includes measured cable loss; other loads/waveforms are unsupported. Uses register readback; it does not remeasure the signal with the scope.

ParametersJSON Schema
NameRequiredDescriptionDefault
channelYes
enabledNo
power_dbmYes
frequency_hzYes

TDQS

A4.5/5.0
Behavior5/5

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

Despite annotations covering the safety profile (destructiveHint=true, idempotentHint=false), the description adds substantial specifics: it forces waveform=SINE, DC offset=0, duty=50, preserves enabled state unless supplied, folds measured cable loss into the predicted dBm, and notes it reads registers rather than remeasuring with the scope. This is exactly the beyond-annotation context an agent needs.

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?

Front-loads the core action in the first sentence and each following sentence carries distinct constraint information (prerequisites, side effects, measurement caveat). Dense but nearly every clause earns its place; slightly heavy phrasing costs it the top mark.

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 destructive, non-idempotent mutation with no output schema, the description covers prerequisites, applied defaults, state preservation, and the measurement caveat. It stops short of describing failure/error outcomes, but the essential calling context is present.

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

Parameters4/5

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

With 0% schema coverage the description must compensate, and it explains frequency/amplitude, the predicted-dBm meaning of power, and that enabled is preserved unless supplied. The channel parameter is only indirectly implied by 'matching serial number', so one parameter remains underspecified.

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 (Set), a precise resource (calibrated sine power into a physical 50-ohm load), and the mechanism (measured table / register readback). This clearly distinguishes it from preview_power (predicts without applying) and configure_channel (general configuration).

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?

Gives real prerequisites and exclusions: 'Requires wave mode and matching serial number' and 'other loads/waveforms are unsupported.' It establishes when the tool is valid, though it never explicitly names preview_power as the alternative for a dry-run.

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

stop_outputsA
Destructive

Stop sweep/counter/pulse/burst actions and disable both output channels.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, idempotentHint=false and destructiveHint=true, so the mutation/safety profile is covered. The description adds useful scope (which action types are stopped and that both channels are disabled), but says nothing about whether the stopped operation can be resumed, whether channel configuration is preserved, or what happens on a redundant call.

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?

A single front-loaded sentence that leads with the action and immediately qualifies the target and effect. No filler, no restatement of the tool name.

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 zero-parameter tool with no output schema and safety already conveyed by annotations, the description covers what the agent needs to decide to call it. Minor gap: it does not say whether configuration state is retained after the stop.

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 takes no parameters, so there is no parameter semantics for the description to clarify; the baseline for a zero-parameter tool applies. Nothing in the description misrepresents the empty 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 names a specific verb ('Stop') and enumerates the exact operation types it terminates (sweep/counter/pulse/burst) plus the secondary effect of disabling both output channels. This clearly distinguishes it from siblings like set_outputs and configure_sweep, which start or shape operations rather than halt them.

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 implies the usage context (halting active waveform/pulse generation), but it never states when to prefer this over set_outputs or configure_channel, nor any prerequisite such as needing an active sweep. Usage is inferable but not explicit.

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

upload_arbitraryA
Destructive

Overwrite slot 1..60 with 2048 integer samples (0..4095) and verify readback. This changes device waveform storage; it does not select the slot or enable output.

ParametersJSON Schema
NameRequiredDescriptionDefault
slotYes
samplesYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, readOnlyHint=false, and idempotentHint=false, so the safety profile is partly covered. The description adds real context beyond them: the overwrite scope (storage only), the readback verification step, and the explicit clarification that it does not affect output routing or slot selection. It does not cover failure behavior or what happens to an invalid sample value.

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 short sentences, front-loaded with the action and its constraints, followed by the scope limitation. Every clause carries information; nothing is redundant.

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 two-parameter write tool with no output schema, this covers the action, both parameter constraints, the destructive scope, and the readback verification. The remaining gap is error/validation behavior on out-of-range inputs, which an agent might need before calling.

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 carry the parameters — and it does: slot is constrained to 1..60, samples must be 2048 integers in 0..4095. Both parameters gain constraints absent from the schema. It does not state what happens when slot or sample count is out of bounds.

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 (Overwrite) plus resource (slot 1..60 with 2048 samples), and bounds the purpose with concrete constraints (0..4095 values, readback verification). It is clearly distinguishable from the sibling read_arbitrary by naming the write/overwrite semantic.

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 second sentence gives explicit negative guidance: it does not select the slot or enable output, implying those are separate operations (set_outputs/configure_channel). That is genuinely useful routing context, though it never names the specific sibling tool to use for those follow-on steps, so it stops short of a full when/when-not/alternative statement.

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. 17 tool updatesv0.1.0
    • First observedconfigure_channel
    • First observedconfigure_sweep
    • First observedget_calibration
    • First observedget_device_info
    • First observedget_manual
    • First observedget_state
    • First observedlist_ports
    • First observedlist_waveforms
    • First observedpreview_power
    • First observedread_arbitrary
    • First observedread_register
    • First observedset_mode
    • First observedset_outputs
    • First observedset_phase
    • First observedset_power
    • First observedstop_outputs
    • First observedupload_arbitrary

TDQS

A3.7/5.0

Scored across 17 tools

Disambiguation4/5

Most tools have a clear primary purpose, but there are overlapping boundaries around output control (stop_outputs vs set_outputs), power/amplitude setting (set_power vs configure_channel vs preview_power), and sweep/mode selection (configure_sweep vs set_mode). The detailed descriptions mostly resolve these, so misselection is possible but not severe.

Naming Consistency5/5

All tools use snake_case verb_noun names (get_/set_/list_/read_/configure_/stop_/upload_/preview_) with no mixed conventions. The pattern is predictable throughout.

Tool Count4/5

17 tools is slightly above the typical 3-15 range, but the complex signal-generator domain (calibration, power, modes, arbitrary waveforms, diagnostics) justifies most tools. It is not excessive but feels a bit heavy.

Completeness4/5

Core signal generation workflows are covered: ports/info/state, channel config, outputs, phase, mode/sweep, calibrated sine power, arbitrary waveform read/upload, and manual/diagnostics. Minor gaps exist for configuring pulse/burst/counter modes despite stop_outputs referencing them, but agents can handle the main use cases.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    Enables control of MHS-5200A series signal generators via serial connection, including frequency, amplitude, waveform, and sweep settings.
    16
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables control of Digilent WaveForms instruments (oscilloscope, AWG, logic analyzer) over USB, supporting devices like Analog Discovery 2/3 and Digital Discovery.
    3
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables remote control of Siglent SDG series function/arbitrary waveform generators via SCPI over TCP/IP. Provides tools for configuring waveforms, modulation, sweep, burst, and other instrument functions.
    1
    -