Skip to main content
Glama

scpi-mcp

LabLink gives agents a SCPI wire; scpi-mcp gives agents oscilloscope expertise.

scpi-mcp is a Model Context Protocol server that lets an agent operate an oscilloscope โ€” not just push SCPI strings at one. It exposes goal-level tools (capture this signal, measure that, characterize a channel) backed by a clean, instrument-agnostic interface. All vendor SCPI lives in the underlying instrument library; the MCP layer stays a thin, uniform wrapper with no raw-SCPI escape hatch.

        .-"""-. 
       / .===. \      Skippi  ๐Ÿงšโ€โ™‚๏ธ
       \/ 6 6 \/      the artistic scope gremlin
       ( \___/ )      "every waveform is a portrait of the magic pixies"
    ___ooo___ooo___

Skippi is the mascot โ€” the artistic gremlin who lives in the scope and paints pictures of the magic pixies (the ones who carry every electron down the probe). When you see a clean trace, that's Skippi's latest masterpiece.

Scope

First instrument: Rigol DS1054Z (unlocked to DS1104Z base) โ€” 4 analog channels, 100 MHz. No :SOURce (function generator) or :LA (logic analyzer) support. Reachable over USB or LAN (TCPIP::<ip>::INSTR).

Related MCP server: rigol-mcp

Architecture

  • transport/ โ€” owns discovery. Enumerates USB, falls back to best-effort LAN auto-discovery, then to an IP prompt; resolves a single VISA resource string and hands it to the instrument layer. Discovery never leaks upward.

  • instruments/ โ€” vendor-specific backends behind one abstract base.py interface. rigol_ds1000z.py is a thin wrapper over the (complete) library; mock.py implements the same interface with zero hardware. Adding an instrument is one new file here and zero changes to tools/.

  • tools/ โ€” instrument-agnostic MCP tools that call only base.py.

  • config.py โ€” permission tiers (read_only / read_config / full), enforced at the tool layer. The server refuses; the model never decides.

Status

Live hardware, active bench use. The Rigol DS1054Z is connected and scpi-mcp is driving real measurements โ€” see Skippi in the Wild for captures. The mock backend remains available for development and CI.

Quickstart

uv sync
uv run pytest          # all green against the mock, zero hardware
uv run scpi-mcp        # start the MCP server (mock backend by default)

Skippi in the Wild

Real captures from the bench, analyzed live via scpi-mcp.

Power-off โ€” relay coil with freewheel diode

The setup: A 24 V relay coil (with freewheel diode installed) powered from a bench supply. Probed at the moment of power-off to observe inductive kickback. CH1 watches the supply rail; CH2 sits across the freewheel diode.

Prompts used:

Grab the scope screen.
What are the min and max voltages on each channel?
Is that spike on CH2 actually 60 V, or is the scale messing with me?

scpi-mcp called capture_screen and measure_snapshot, then explained the visual illusion: CH2 is set to 1 V/div, so its 5.36 V kickback spike fills 5+ of the 8 vertical divisions and looks enormous. CH1 is at 8 V/div, so the 24 V rail only occupies ~3 divisions despite being far larger in absolute terms. No 60 V spike โ€” the freewheel diode clamped it cleanly to V_supply + V_f โ‰ˆ 24.7 V, right where it should be.

Power-off capture โ€” relay coil, freewheel diode installed

500 ms/div (5 s full sweep). CH1 yellow, 8 V/div: 24 V supply decaying from 26.9 V โ†’ 2.24 V. CH2 cyan, 1 V/div: freewheel diode kickback, max 5.36 V, min โˆ’2.08 V.


Power-off โ€” bare coil, no freewheel diode

The setup: The same 24 V relay coil, but with the freewheel diode removed โ€” a bare inductor. Powered from a bench supply (100 nF across the rail to tame switch-mode ripple). Two 10x probes straddle the disconnect on the high side: CH1 on the supply side, CH2 on the coil side. Power is cut by pulling the + lead, and a single-shot trigger catches the unclamped kickback.

Prompts used:

Prime the scope for a single-shot on CH2 falling โ€” I'll pull the + lead.
We didn't clear the clipping โ€” reset V/div on CH2 and re-arm for another one-shot.
Got it โ€” grab the screencap and give me the true peak.

scpi-mcp armed a single-shot falling-edge trigger on CH2, watched the trigger status, and grabbed the screen plus both channel waveforms the instant it fired. This time the scale fought back the other way: the kick kept overflowing the window โ€” it railed at ยฑ130 V, then again at โˆ’304 V โ€” so scpi-mcp stepped CH2 coarser to 100 V/div until the whole transient fit. With no freewheel diode to absorb it, the collapsing field threw a โˆ’436 V spike with a +240 V overshoot โ€” a ~676 Vpp ring, roughly 18x the 24 V rail โ€” then bled off exponentially back toward the rail over ~1 ms. Compare the clamped case above, where the diode held the same coil to โ‰ˆ24.7 V.

Power-off capture โ€” bare coil, freewheel diode removed

200 ยตs/div. CH1 yellow, 20 V/div: supply side holds ~24 V with a small coupled ring at the break. CH2 cyan, 100 V/div: bare-coil kickback โ€” peak โˆ’436 V, +240 V overshoot (~676 Vpp), then exponential bleed-back. No freewheel diode; contrast the โ‰ˆ24.7 V clamped result above.

License

MIT

Available Tools

18 tools
acq_configureA

Set acquisition type and/or memory depth. Disruptive โ€” needs confirm=True.

Deeper memory captures more points at a given time base; averaging/peak modes trade update rate for noise rejection or glitch capture.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoSafety gate for this disruptive action. Must be True to run โ€” the server refuses the call when False.
acq_typeNoAcquisition mode: 'NORMal', 'AVERages', 'PEAK', or 'HRESolution'. None leaves it unchanged.
memory_depthNoRecord length in sample points (e.g. 12000, 120000, 1200000). None leaves it unchanged.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

No annotations provided, but description fully bears the transparency burden. It discloses disruptive nature, need for confirmation, and explains behavioral trade-offs of memory depth and acquisition modes beyond what the schema provides.

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?

Extremely concise: two sentences that front-load the purpose and critical behavior. Every sentence adds value without 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?

Given the presence of an output schema (not shown) and full schema coverage, the description is complete enough. It covers parameter behavior and the critical confirmation requirement. Minor gap: no mention of prerequisites like oscilloscope state, but acceptable.

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 100%, so baseline is 3. Description adds operational meaning by explaining the effect of deeper memory (more points) and the trade-offs of averaging/peak modes (update rate vs noise rejection).

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 clearly states the tool sets acquisition type and/or memory depth, with specific verbs and resource. It distinguishes from sibling tools like acq_run, acq_single, or set_timebase by focusing on acquisition configuration parameters.

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?

Explicitly notes the tool is disruptive and requires confirm=True, providing clear context for when to use the confirm parameter. Does not explicitly list when not to use or alternatives, but the purpose is clear enough for the agent to differentiate.

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

acq_forceA

Force a trigger now, ignoring the trigger condition. Needs confirm=True.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoSafety gate for this disruptive action. Must be True to run โ€” the server refuses the call when False.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

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 effectively communicates the tool's disruptive nature: it ignores trigger conditions and requires a confirmation flag. The parameter description reinforces this as a 'safety gate' and 'disruptive action.' 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 consists of two short, front-loaded sentences with no filler. Each word adds value, making it highly concise and efficient.

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 the tool has only one parameter and an output schema exists, the description covers the essential behavioral context (forcing trigger, needing confirmation). It is complete for the tool's simplicity.

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 input schema already provides a detailed description of the 'confirm' parameter as a safety gate. The tool description adds 'Needs confirm=True' but does not go beyond the schema. With 100% schema coverage, baseline 3 is appropriate.

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 forces a trigger immediately, ignoring normal conditions. The verb 'Force' and resource 'trigger' are specific. It distinguishes from siblings like acq_run (normal execution) or acq_single (single trigger setup).

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 indicates the tool requires 'confirm=True' to execute, implying it's for bypassing conditions. However, it does not explicitly state when not to use or suggest alternatives, leaving usage context somewhat implicit.

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

acq_runA

Start continuous (free-running) acquisition. Disruptive โ€” needs confirm=True.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoSafety gate for this disruptive action. Must be True to run โ€” the server refuses the call when False.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/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 clearly labels the action as 'disruptive' and requires confirmation, providing key behavioral information. However, it does not elaborate on the nature of disruption (e.g., stopping other acquisitions).

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, front-loaded with the core action, and no extraneous words. 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?

Given the tool's simplicity (one parameter, output schema present), the description covers purpose and behavior adequately. It lacks explicit guidance on how continuous acquisition interacts with other acquisition modes, but the sibling list provides context.

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 100% with the confirm parameter fully described as a safety gate. The description's 'needs confirm=True' adds no new meaning, so the score is at baseline for high 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?

Description clearly states 'Start continuous (free-running) acquisition,' specifying the verb 'start' and the resource 'acquisition' with the qualifier 'continuous.' This distinguishes it from siblings like acq_single (single-shot acquisition) and acq_stop.

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?

States 'Disruptive โ€” needs confirm=True,' which provides a critical condition for use. While it doesn't explicitly mention when not to use or list alternatives, the sibling tool names imply other acquisition modes, and the guideline is succinct.

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

acq_singleA

Arm a single-shot acquisition: capture one trigger then stop. Needs confirm=True.

Pair with set_trigger to catch a one-off transient (e.g. a power-on spike).
ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoSafety gate for this disruptive action. Must be True to run โ€” the server refuses the call when False.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

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

No annotations are provided, so the description must convey behavioral traits. It notes the need for confirmation (implying disruptiveness) and describes the single-shot nature. However, it does not disclose potential side effects like resetting previous configurations or behavior if already armed.

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 concise sentences: the first states the core purpose, the second provides usage guidance. No redundant or irrelevant information. Well front-loaded and efficient.

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 primary use case and prerequisite. An output schema exists, so return values are handled. It could be more complete by mentioning error conditions or additional context, but it is sufficient for a simple tool.

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 only parameter, confirm, is fully described in the schema (safety gate, must be True). The description merely restates 'Needs confirm=True', adding no new meaning. With 100% schema coverage, baseline score of 3 is appropriate.

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's function: 'Arm a single-shot acquisition: capture one trigger then stop.' It distinguishes from siblings like acq_run and acq_stop by specifying single-shot behavior and pairing with set_trigger for one-off transients.

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?

Explicitly mentions prerequisite 'Needs confirm=True' and recommends pairing with set_trigger for transient capture. While it doesn't explicitly exclude alternative scenarios, the use case is well-defined and the guidance is practical.

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

acq_stopA

Stop acquisition, freezing the current trace. Disruptive โ€” needs confirm=True.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoSafety gate for this disruptive action. Must be True to run โ€” the server refuses the call when False.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/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 burden. It labels the tool as 'Disruptive' and requires 'confirm=True', effectively communicating the behavioral impact. However, it omits details on reversibility or side effects, which would be useful but not critical for a stop action.

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 two sentences long with no redundant words. It front-loads the primary action ('Stop acquisition') and quickly adds the critical usage note. 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?

Given the tool's simplicity (one parameter, output schema present), the description is adequate. It covers the core function and the essential behavioral cue. Missing details like the return value are covered by the output schema, so no major gaps.

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 100% (the confirm parameter is well-documented in the schema). The description merely reiterates 'needs confirm=True', adding minimal extra meaning beyond the schema, so a baseline score of 3 is appropriate.

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 verb 'Stop' and the resource 'acquisition', and adds 'freezing the current trace' for precision. It distinguishes from siblings like acq_run and acq_configure by mentioning disruption, making the purpose unmistakable.

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 mandates 'confirm=True' as a prerequisite, indicating the critical usage condition. However, it does not contrast with alternatives like acq_run or when not to use this tool, leaving some ambiguity for an agent.

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

capability_reportA

Report the connected instrument's detected capabilities.

Returns channel count/ids, bandwidth, source & logic support, max memory
depth, and installed options. Takes no arguments; requires a prior
self_config. Use it to learn what the scope can do before driving it.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

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 effectively discloses behavioral traits: it is a read-only report, requires a prerequisite, and explains its purpose. No contradictions or hidden effects mentioned.

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 concise sentences: first sentence lists purpose and outputs, second provides usage context. Every sentence adds value, no 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?

Given output schema exists, description does not need to detail return values. It covers prerequisite, purpose, and output scope, fully sufficient for this simple 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?

No parameters exist in schema, so description correctly states 'Takes no arguments.' Baseline 4 applies as there is nothing more needed.

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?

Clearly states the tool reports detected capabilities of the connected instrument, listing specific outputs like channel count/ids, bandwidth, etc. Distinguishes itself from sibling tools which focus on acquisition, configuration, or measurement.

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?

Explicitly notes it requires a prior self_config and should be used to learn capabilities before driving the instrument. Provides clear context but could be more explicit about 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.

capture_alignedA

Capture multiple channels on the same time base, time-aligned.

The instrument shares one time base across channels, so a sequence of reads is already time-aligned. (Real hardware reads them back-to-back; the mock is instantaneous.) Use this to compare two signals sample-for-sample.

ParametersJSON Schema
NameRequiredDescriptionDefault
deepNoIf True, read deep memory for each channel; if False (default), read the on-screen trace.
channelsYesAnalog channels to capture together, e.g. [1, 2]. Read on the shared time base so the traces are time-aligned.
include_samplesNoIf True, include the full time/volts sample arrays. Default False returns only a summary (point count, sample rate, start/end time) to avoid flooding the context.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

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 full burden. It explains the hardware behavior (back-to-back reads) and mock behavior, providing good transparency about the tool's operation. Could mention potential limitations like channel availability.

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 moderately concise, with two short paragraphs. It front-loads the purpose and includes necessary details. Minor redundancy in first paragraph could be trimmed.

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 the presence of an output schema (mentioned in context signals), the description does not need to detail return values. It adequately covers key aspects like time alignment and output summary. Missing context like prerequisites might be acceptable.

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 covers 100% of parameters. Description adds value by explaining why channels are time-aligned, what deep memory means, and why include_samples affects output size. This goes beyond just repeating schema descriptions.

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 it captures multiple channels on the same time base for time-aligned comparison. This distinguishes it from siblings like capture_memory, which likely captures single channels or in a non-aligned way.

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 when to use (comparing two signals sample-for-sample) and provides context about shared time base. However, it does not explicitly state when not to use or mention alternatives like capture_memory.

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

capture_memoryB

Capture the deep-memory waveform for one channel (full sample-rate record).

ParametersJSON Schema
NameRequiredDescriptionDefault
pointsNoNumber of deep-memory sample points to read back. None reads the full acquisition record.
channelYesAnalog channel to read, 1-based (1โ€“4).
include_samplesNoIf True, include the full time/volts sample arrays. Default False returns only a summary (point count, sample rate, start/end time) to avoid flooding the context.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior2/5

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

With no annotations provided, the description bears full responsibility for disclosing behavioral traits. It only states the high-level action and lacks details about side effects, permissions, data volume implications, or what happens to existing recordings.

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 a single concise sentence with no extraneous words. It efficiently conveys the core purpose without redundancy.

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?

Despite the tool having a complex output and being used for data capture, the description omits any mention of return values or output schema. It does not explain that the output includes either full sample arrays or a summary, leaving the agent to infer from the schema alone.

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 input schema provides descriptions for all three parameters (100% coverage). The description adds no additional parameter-level context beyond the schema, so a baseline score of 3 is appropriate.

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 verb 'capture' and the resource 'deep-memory waveform for one channel' with the detail 'full sample-rate record'. It distinguishes itself from sibling tools like capture_screen or capture_aligned by specifying deep-memory and per-channel operation.

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 provides no guidance on when to use this tool versus alternatives such as capture_aligned or capture_screen. There is no mention of prerequisites, context, or exclusions.

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

capture_screenA

Capture the on-screen waveform for one channel (~1200 points).

ParametersJSON Schema
NameRequiredDescriptionDefault
channelYesAnalog channel to read, 1-based (1โ€“4).
include_samplesNoIf True, include the full time/volts sample arrays. Default False returns only a summary (point count, sample rate, start/end time) to avoid flooding the context.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

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

With no annotations provided, the description carries full burden. The description mentions 'one channel (~1200 points)', giving a sense of data volume and that it's a snapshot. However, it does not disclose side effects, whether it's read-only, or any other behavioral traits.

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?

Single sentence that is front-loaded with the core purpose. No redundant or extraneous information.

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 the low complexity (2 parameters, high schema coverage, output schema present), the description is adequate. It conveys the essential behavior and data scope, though it could briefly mention the include_samples parameter's effect.

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 100%, so parameters are already documented. The description adds context about ~1200 points but does not elaborate on parameter meaning beyond what the schema provides. Baseline 3 is appropriate.

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 verb 'Capture', the resource 'on-screen waveform', and specifies it's for one channel with a sample count hint (~1200 points). It implicitly distinguishes from sibling tools like capture_memory or capture_aligned, which likely capture different types of waveforms.

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?

No explicit guidance on when to use this tool versus alternatives like capture_aligned or capture_memory. The description implies it's for capturing the current on-screen display, but lacks when-to-use or when-not-to-use context.

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

characterize_signalA

Characterize the signal on channel โ€” the FLAGSHIP goal-level tool.

Runs the probe โ†’ vertical fit โ†’ horizontal fit โ†’ trigger hunt โ†’ characterize
loop, settling and re-verifying after each adjustment (bounded by
:data:`MAX_SETTLE_ITERATIONS`). Returns the discovered signal parameters, a
full measurement snapshot, and a confidence flag. When ``export_path`` is
given, the deep-memory capture is rendered to a PNG there.
ParametersJSON Schema
NameRequiredDescriptionDefault
channelYesAnalog channel to characterize, 1-based (1โ€“4).
export_pathNoOptional filesystem path to render the fitted deep-memory capture to a PNG. None skips the export.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

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

The description details the iterative algorithm, settling, and re-verification, which goes beyond the minimal. No annotations exist, so the description carries the full burden. It does not explicitly mention side effects or permissions, but the process seems non-destructive. The behavioral description is fairly thorough.

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 front-loaded with the core purpose and then explains the process and outputs. It is concise but includes all necessary details. A minor improvement could be slightly more brevity, but it is well-structured.

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 the tool's complexity (multi-step loop with settle iterations) and the presence of an output schema covering return values, the description provides a good overview. It covers the algorithm, what it returns, and the optional export. It is reasonably complete, though it could elaborate on the confidence flag or iteration bound.

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 mentions both parameters ('channel' and 'export_path') and provides context, but the input schema already covers them with 100% coverage. The description does not add significant semantics beyond what the schema descriptions offer, so it meets the baseline of 3.

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 it characterizes the signal on a channel and is the 'FLAGSHIP goal-level tool'. It details the multi-step algorithm (probe, vertical fit, etc.) and distinguishes itself from simpler sibling tools like 'measure' or 'acq_run' by being comprehensive and iterative.

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 calls it the 'FLAGSHIP goal-level tool', implying it is the primary tool for signal characterization, but it does not explicitly state when to use simpler alternatives or when not to use this tool. It lacks explicit usage guidance compared to alternatives.

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

identifyA

Return the connected instrument's identity (vendor, model, serial, firmware).

Takes no arguments; requires a prior self_config.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior3/5

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

With no annotations provided, the description discloses that the tool takes no arguments and requires self_config. It does not mention side effects or error conditions, but for a simple identity retrieval this is minimally adequate.

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 extremely concise: two sentences, no fluff. The first sentence states purpose, the second adds constraints.

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 the tool's simplicity and presence of an output schema, the description adequately covers what it returns and the prerequisite. It could mention that it is a read-only operation, but not essential.

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?

There are no parameters and schema coverage is 100%. The description adds value by explicitly stating 'Takes no arguments', which reinforces 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 clearly states the tool returns the instrument's identity including vendor, model, serial, and firmware. It distinguishes from sibling tools which perform configuration or acquisition.

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 mentions that it requires a prior self_config, giving clear context for when to use it. However, it does not provide exclusions or alternatives for 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.

measureA

Take a single measurement of one quantity on one channel.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindYesMeasurement to take. One of: 'vpp', 'vrms', 'vmax', 'vmin', 'frequency', 'period', 'duty', 'rise_time', 'fall_time'.
channelYesAnalog channel to measure, 1-based (1โ€“4).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior2/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 of behavioral disclosure. It only describes the action without revealing side effects, permissions, or return behavior. For a read-like operation, minimal transparency is acceptable but not sufficient.

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, concise sentence with no wasted words. It is front-loaded with the core action. Could benefit from a slightly more structured format, but efficient overall.

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 low complexity (2 required params), full schema coverage, and the presence of an output schema, the description provides adequate information for a tool with such straightforward semantics.

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 100%, so the input schema already documents both parameters (kind with allowed values, channel with range). The description adds no additional meaning beyond the schema, meriting a baseline score of 3.

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's action ('Take a single measurement') and resource ('one quantity on one channel'), effectively distinguishing it from siblings like measure_series which take multiple measurements.

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 usage for a single measurement on one channel, but does not explicitly state when to avoid this tool or mention alternatives. The context of sibling tools provides some contrast, but the description itself lacks explicit guidance.

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

measure_seriesA

Poll one measurement repeatedly, returning a short time series.

Useful for watching a value drift or settle (e.g. a ramping duty cycle).
``interval_s`` is honored via the instrument's settle hook so the mock stays
instant in tests while real hardware actually waits between reads.
ParametersJSON Schema
NameRequiredDescriptionDefault
kindYesMeasurement to take. One of: 'vpp', 'vrms', 'vmax', 'vmin', 'frequency', 'period', 'duty', 'rise_time', 'fall_time'.
channelYesAnalog channel to measure, 1-based (1โ€“4).
samplesNoHow many readings to take (>=1). Default 5.
interval_sNoDelay in seconds between readings. 0 (default) polls as fast as possible.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

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 full burden. It discloses the behavior of interval_s in test vs real hardware, indicating the tool respects the settle hook, making mock instant. This adds behavioral context 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?

Two sentences plus an embedded code block, all concisely front-loaded. First sentence states purpose, second gives use case, third explains key parameter behavior with a test vs hardware distinction. No wasted words.

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 4 parameters, 2 required, and an output schema (context signal), the description covers the key aspects: polling nature, sampling behavior, and parameter rationale. It might lack prerequisites (e.g., prior configuration), but sibling tools imply those steps exist.

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 100%, baseline 3. The description adds value by clarifying that interval_s is honored via the instrument's settle hook, and that 0 polls as fast as possible. It also uses context to explain the behavior, which is not fully captured in the schema descriptions.

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 verb 'poll' and resource 'measurement repeatedly, returning a short time series'. It distinguishes from siblings like measure_snapshot by emphasizing repeated readings over time.

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 states it's 'useful for watching a value drift or settle' with a concrete example. It also explains when interval_s matters (honored via settle hook) but doesn't explicitly list when not to use it or alternatives.

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

measure_snapshotC

Take several measurements at once on one channel (one read per quantity).

ParametersJSON Schema
NameRequiredDescriptionDefault
kindsNoWhich measurements to take together, e.g. ['vpp', 'frequency']. None uses the default set (vpp, vrms, frequency, period, duty).
channelYesAnalog channel to measure, 1-based (1โ€“4).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations, the description carries full burden. It only mentions 'one read per quantity' but does not disclose side effects, permissions needed, or whether it's a read-only operation. This is insufficient.

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 that conveys the core purpose concisely. It is efficient but could benefit from additional structure or details.

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 basic functionality but fails to provide context for selecting this tool among siblings, such as whether it is a one-shot snapshot versus continuous series. Output schema exists, so return values are not required, but sibling differentiation is missing.

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 100%, so the schema already documents both parameters. The description adds no additional meaning beyond the schema, justifying the baseline score of 3.

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 clearly states the tool takes several measurements at once on one channel, which distinguishes it from a single measurement. However, it does not explicitly differentiate from the sibling tool measure_series, which also takes multiple measurements.

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?

No guidance is provided on when to use this tool versus alternatives like measure_series or measure. The description lacks context about prerequisites or exclusions.

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

self_configA

Discover/connect an instrument and attach it to the session.

Call this first โ€” every other tool needs a connected instrument. Runs the
transport cascade (USB โ†’ LAN โ†’ manual host); pass ``host`` to skip discovery
and target a known address.
ParametersJSON Schema
NameRequiredDescriptionDefault
hostNoOptional instrument address (IP/hostname, or a full VISA resource string) to connect to directly. None runs auto-discovery (USB, then LAN).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior3/5

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

No annotations exist, so the description carries the burden. It explains the transport cascade and skip behavior, but lacks details on failure modes, timeouts, or side effects like disconnecting existing sessions.

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 concise sentences plus a tech note with no unnecessary words. Purpose is front-loaded, and every sentence is meaningful.

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 the tool's complexity (with a discovery cascade) and the presence of an output schema, the description covers main usage and parameter meaning. It is nearly complete, though it omits error handling details.

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 100% with a clear description of the host parameter. The description adds value by explaining how to use it to skip discovery, enhancing the 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 uses specific verbs: 'Discover/connect an instrument and attach it to the session.' It clearly differentiates the tool from sibling tools which focus on acquisition, measurement, and configuration tasks.

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?

Explicitly states 'Call this first โ€” every other tool needs a connected instrument.' Provides guidance on using the host parameter to skip discovery, offering clear context for when 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_channelA

Set a channel's vertical configuration (enable, V/div, offset, coupling).

Only the arguments you pass are changed; omit any to leave it as-is. Use this to fit a signal on screen before measuring or capturing.

ParametersJSON Schema
NameRequiredDescriptionDefault
scaleNoVertical scale in volts per division (e.g. 0.5 = 500 mV/div). None leaves it unchanged.
offsetNoVertical offset in volts, shifting the trace up (+) or down (-). None leaves it unchanged.
channelYesAnalog channel to configure, 1-based (1โ€“4).
enabledNoTurn the channel's display/acquisition on (True) or off (False). None leaves it unchanged.
couplingNoInput coupling: 'DC', 'AC', or 'GND'. None leaves it unchanged.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

Without annotations, the description carries the full burden. It discloses the partial update behavior ('Only the arguments you pass are changed; omit any to leave it as-is'), which is a key behavioral trait. It does not mention side effects or error conditions, but the partial update disclosure is valuable.

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: the first states the purpose, the second explains partial update and use case. Every sentence is essential with no fluff, and the main action is front-loaded.

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 purpose, partial update behavior, and a typical use case. It does not explain return values (output schema exists), nor error conditions. Given the moderate complexity and available schema, it is fairly complete.

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 100%, so baseline is 3. The description adds context by grouping parameters under 'vertical configuration' and clarifying partial update, but it does not add meaning beyond the schema's detailed parameter descriptions.

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 sets a channel's vertical configuration (enable, V/div, offset, coupling). It distinguishes from sibling tools like acq_configure and set_timebase by specifying the resource (channel) and the specific configuration parameters.

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 that only passed arguments are changed (partial update) and suggests using it to fit a signal on screen before measuring or capturing. This provides context but does not explicitly exclude alternative tools.

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

set_timebaseA

Set the horizontal time base (seconds/div and trigger offset).

Controls how many periods of the signal are shown; widen s/div to see slow events, narrow it to resolve fast ones. Shared across all channels.

ParametersJSON Schema
NameRequiredDescriptionDefault
scaleNoHorizontal scale in seconds per division (e.g. 1e-3 = 1 ms/div). None leaves it unchanged.
offsetNoHorizontal (trigger) offset in seconds, moving the trigger point left/right. None leaves it unchanged.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior2/5

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

With no annotations, the description carries full behavioral burden. It discloses that changes are shared across channels but omits potential side effects, destructiveness, or prerequisites. More context on what happens when called (e.g., does it reset other settings?) would improve transparency.

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 front-loaded purpose. Each sentence adds value: first defines the operation, second provides usage context and scope. No wasted words.

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 the tool's simplicity (2 optional params) and presence of an output schema, the description covers key aspects: purpose, usage guidelines, and scope. It could mention typical return value or error states but is mostly complete.

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 100%, with each parameter already explained with units and default behavior. The tool description adds minimal extra meaning (e.g., 'trigger offset' phrasing already in schema), so baseline 3 is appropriate.

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 clearly states it sets horizontal time base (seconds/div and trigger offset) and explains the effect on signal display. It implicitly distinguishes from sibling tools like set_channel and set_trigger by focusing on timebase, but does not explicitly differentiate.

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 provides practical guidance: widen s/div for slow events, narrow for fast ones. It also notes the setting is shared across all channels. However, it lacks explicit when-not-to-use or alternatives.

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

set_triggerA

Configure the edge trigger (source channel, level, slope).

Sets up a stable trigger so repetitive signals hold still, or so a
single-shot (see acq_single) fires on the right edge of a one-off event.
ParametersJSON Schema
NameRequiredDescriptionDefault
levelYesTrigger threshold voltage. The scope fires when the source crosses this level in the chosen slope direction.
slopeNoEdge direction to trigger on: 'rising' (default) or 'falling'.rising
sourceYesTrigger source: analog channel to trigger on (1-based).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

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

No annotations provided, so description must carry the burden. It describes the action (configuring trigger) and the effect (sets up stable trigger). However, it does not disclose potential side effects (e.g., overriding previous trigger settings) or read-only nature.

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, no redundancy, front-loaded with purpose. Every sentence adds value.

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 3 parameters and output schema existence, the description sufficiently explains the tool's usage. Could mention the output briefly, but not required due to output schema.

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 100%, baseline 3. Description adds context for 'level' (threshold voltage) and 'source' (1-based) but largely paraphrases the schema. No additional meaning beyond 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 clearly states verb+resource ('configure the edge trigger') and explains the purpose with concrete use cases (stabilize repetitive signals, single-shot). Distinguishes from sibling 'acq_single' by mentioning it.

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?

Provides clear context for using the tool (stabilizing repetitive signals or for single-shot events) and references sibling 'acq_single'. Could be more explicit about when not to use, but sufficient.

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. 18 tool updatesv0.1.1
    • Changedacq_configure7 fields changed
      • addedInput schema / properties / acq_type
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Acquisition mode: 'NORMal', 'AVERages', 'PEAK', or 'HRESolution'. None leaves it unchanged.",
        +  "title": "Acq Type"
        +}
      • removedInput schema / properties / args
        Removed value: -{
        -  "title": "Args"
        -}
      • addedInput schema / properties / confirm
        Added value: +{
        +  "default": false,
        +  "description": "Safety gate for this disruptive action. Must be True to run โ€” the server refuses the call when False.",
        +  "title": "Confirm",
        +  "type": "boolean"
        +}
      • removedInput schema / properties / kwargs
        Removed value: -{
        -  "title": "Kwargs"
        -}
      • addedInput schema / properties / memory_depth
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Record length in sample points (e.g. 12000, 120000, 1200000). None leaves it unchanged.",
        +  "title": "Memory Depth"
        +}
      • removedInput schema / required
        Removed value: -[
        -  "args",
        -  "kwargs"
        -]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "title": "set_acquisition_implDictOutput",
        +  "type": "object"
        +}
    • Changedacq_force5 fields changed
      • removedInput schema / properties / args
        Removed value: -{
        -  "title": "Args"
        -}
      • addedInput schema / properties / confirm
        Added value: +{
        +  "default": false,
        +  "description": "Safety gate for this disruptive action. Must be True to run โ€” the server refuses the call when False.",
        +  "title": "Confirm",
        +  "type": "boolean"
        +}
      • removedInput schema / properties / kwargs
        Removed value: -{
        -  "title": "Kwargs"
        -}
      • removedInput schema / required
        Removed value: -[
        -  "args",
        -  "kwargs"
        -]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "title": "force_trigger_implDictOutput",
        +  "type": "object"
        +}
    • Changedacq_run5 fields changed
      • removedInput schema / properties / args
        Removed value: -{
        -  "title": "Args"
        -}
      • addedInput schema / properties / confirm
        Added value: +{
        +  "default": false,
        +  "description": "Safety gate for this disruptive action. Must be True to run โ€” the server refuses the call when False.",
        +  "title": "Confirm",
        +  "type": "boolean"
        +}
      • removedInput schema / properties / kwargs
        Removed value: -{
        -  "title": "Kwargs"
        -}
      • removedInput schema / required
        Removed value: -[
        -  "args",
        -  "kwargs"
        -]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "title": "run_implDictOutput",
        +  "type": "object"
        +}
    • Changedacq_single5 fields changed
      • removedInput schema / properties / args
        Removed value: -{
        -  "title": "Args"
        -}
      • addedInput schema / properties / confirm
        Added value: +{
        +  "default": false,
        +  "description": "Safety gate for this disruptive action. Must be True to run โ€” the server refuses the call when False.",
        +  "title": "Confirm",
        +  "type": "boolean"
        +}
      • removedInput schema / properties / kwargs
        Removed value: -{
        -  "title": "Kwargs"
        -}
      • removedInput schema / required
        Removed value: -[
        -  "args",
        -  "kwargs"
        -]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "title": "single_implDictOutput",
        +  "type": "object"
        +}
    • Changedacq_stop5 fields changed
      • removedInput schema / properties / args
        Removed value: -{
        -  "title": "Args"
        -}
      • addedInput schema / properties / confirm
        Added value: +{
        +  "default": false,
        +  "description": "Safety gate for this disruptive action. Must be True to run โ€” the server refuses the call when False.",
        +  "title": "Confirm",
        +  "type": "boolean"
        +}
      • removedInput schema / properties / kwargs
        Removed value: -{
        -  "title": "Kwargs"
        -}
      • removedInput schema / required
        Removed value: -[
        -  "args",
        -  "kwargs"
        -]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "title": "stop_implDictOutput",
        +  "type": "object"
        +}
    • Changedcapability_report4 fields changed
      • removedInput schema / properties / args
        Removed value: -{
        -  "title": "Args"
        -}
      • removedInput schema / properties / kwargs
        Removed value: -{
        -  "title": "Kwargs"
        -}
      • removedInput schema / required
        Removed value: -[
        -  "args",
        -  "kwargs"
        -]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "title": "capability_report_implDictOutput",
        +  "type": "object"
        +}
    • Changedcapture_aligned7 fields changed
      • removedInput schema / properties / args
        Removed value: -{
        -  "title": "Args"
        -}
      • addedInput schema / properties / channels
        Added value: +{
        +  "description": "Analog channels to capture together, e.g. [1, 2]. Read on the shared time base so the traces are time-aligned.",
        +  "items": {
        +    "type": "integer"
        +  },
        +  "title": "Channels",
        +  "type": "array"
        +}
      • addedInput schema / properties / deep
        Added value: +{
        +  "default": false,
        +  "description": "If True, read deep memory for each channel; if False (default), read the on-screen trace.",
        +  "title": "Deep",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / include_samples
        Added value: +{
        +  "default": false,
        +  "description": "If True, include the full time/volts sample arrays. Default False returns only a summary (point count, sample rate, start/end time) to avoid flooding the context.",
        +  "title": "Include Samples",
        +  "type": "boolean"
        +}
      • removedInput schema / properties / kwargs
        Removed value: -{
        -  "title": "Kwargs"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "args",
        -  "kwargs"
        -]New value: +[
        +  "channels"
        +]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "title": "capture_aligned_implDictOutput",
        +  "type": "object"
        +}
    • Changedcapture_memory7 fields changed
      • removedInput schema / properties / args
        Removed value: -{
        -  "title": "Args"
        -}
      • addedInput schema / properties / channel
        Added value: +{
        +  "description": "Analog channel to read, 1-based (1โ€“4).",
        +  "title": "Channel",
        +  "type": "integer"
        +}
      • addedInput schema / properties / include_samples
        Added value: +{
        +  "default": false,
        +  "description": "If True, include the full time/volts sample arrays. Default False returns only a summary (point count, sample rate, start/end time) to avoid flooding the context.",
        +  "title": "Include Samples",
        +  "type": "boolean"
        +}
      • removedInput schema / properties / kwargs
        Removed value: -{
        -  "title": "Kwargs"
        -}
      • addedInput schema / properties / points
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Number of deep-memory sample points to read back. None reads the full acquisition record.",
        +  "title": "Points"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "args",
        -  "kwargs"
        -]New value: +[
        +  "channel"
        +]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "title": "capture_memory_implDictOutput",
        +  "type": "object"
        +}
    • Changedcapture_screen6 fields changed
      • removedInput schema / properties / args
        Removed value: -{
        -  "title": "Args"
        -}
      • addedInput schema / properties / channel
        Added value: +{
        +  "description": "Analog channel to read, 1-based (1โ€“4).",
        +  "title": "Channel",
        +  "type": "integer"
        +}
      • addedInput schema / properties / include_samples
        Added value: +{
        +  "default": false,
        +  "description": "If True, include the full time/volts sample arrays. Default False returns only a summary (point count, sample rate, start/end time) to avoid flooding the context.",
        +  "title": "Include Samples",
        +  "type": "boolean"
        +}
      • removedInput schema / properties / kwargs
        Removed value: -{
        -  "title": "Kwargs"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "args",
        -  "kwargs"
        -]New value: +[
        +  "channel"
        +]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "title": "capture_screen_implDictOutput",
        +  "type": "object"
        +}
    • Changedcharacterize_signal6 fields changed
      • removedInput schema / properties / args
        Removed value: -{
        -  "title": "Args"
        -}
      • addedInput schema / properties / channel
        Added value: +{
        +  "description": "Analog channel to characterize, 1-based (1โ€“4).",
        +  "title": "Channel",
        +  "type": "integer"
        +}
      • addedInput schema / properties / export_path
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Optional filesystem path to render the fitted deep-memory capture to a PNG. None skips the export.",
        +  "title": "Export Path"
        +}
      • removedInput schema / properties / kwargs
        Removed value: -{
        -  "title": "Kwargs"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "args",
        -  "kwargs"
        -]New value: +[
        +  "channel"
        +]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "title": "characterize_signal_implDictOutput",
        +  "type": "object"
        +}
    • Changedidentify4 fields changed
      • removedInput schema / properties / args
        Removed value: -{
        -  "title": "Args"
        -}
      • removedInput schema / properties / kwargs
        Removed value: -{
        -  "title": "Kwargs"
        -}
      • removedInput schema / required
        Removed value: -[
        -  "args",
        -  "kwargs"
        -]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "title": "identify_implDictOutput",
        +  "type": "object"
        +}
    • Changedmeasure6 fields changed
      • removedInput schema / properties / args
        Removed value: -{
        -  "title": "Args"
        -}
      • addedInput schema / properties / channel
        Added value: +{
        +  "description": "Analog channel to measure, 1-based (1โ€“4).",
        +  "title": "Channel",
        +  "type": "integer"
        +}
      • addedInput schema / properties / kind
        Added value: +{
        +  "description": "Measurement to take. One of: 'vpp', 'vrms', 'vmax', 'vmin', 'frequency', 'period', 'duty', 'rise_time', 'fall_time'.",
        +  "title": "Kind",
        +  "type": "string"
        +}
      • removedInput schema / properties / kwargs
        Removed value: -{
        -  "title": "Kwargs"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "args",
        -  "kwargs"
        -]New value: +[
        +  "channel",
        +  "kind"
        +]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "title": "measure_implDictOutput",
        +  "type": "object"
        +}
    • Changedmeasure_series8 fields changed
      • removedInput schema / properties / args
        Removed value: -{
        -  "title": "Args"
        -}
      • addedInput schema / properties / channel
        Added value: +{
        +  "description": "Analog channel to measure, 1-based (1โ€“4).",
        +  "title": "Channel",
        +  "type": "integer"
        +}
      • addedInput schema / properties / interval_s
        Added value: +{
        +  "default": 0,
        +  "description": "Delay in seconds between readings. 0 (default) polls as fast as possible.",
        +  "title": "Interval S",
        +  "type": "number"
        +}
      • addedInput schema / properties / kind
        Added value: +{
        +  "description": "Measurement to take. One of: 'vpp', 'vrms', 'vmax', 'vmin', 'frequency', 'period', 'duty', 'rise_time', 'fall_time'.",
        +  "title": "Kind",
        +  "type": "string"
        +}
      • removedInput schema / properties / kwargs
        Removed value: -{
        -  "title": "Kwargs"
        -}
      • addedInput schema / properties / samples
        Added value: +{
        +  "default": 5,
        +  "description": "How many readings to take (>=1). Default 5.",
        +  "minimum": 1,
        +  "title": "Samples",
        +  "type": "integer"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "args",
        -  "kwargs"
        -]New value: +[
        +  "channel",
        +  "kind"
        +]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "title": "polled_series_implDictOutput",
        +  "type": "object"
        +}
    • Changedmeasure_snapshot6 fields changed
      • removedInput schema / properties / args
        Removed value: -{
        -  "title": "Args"
        -}
      • addedInput schema / properties / channel
        Added value: +{
        +  "description": "Analog channel to measure, 1-based (1โ€“4).",
        +  "title": "Channel",
        +  "type": "integer"
        +}
      • addedInput schema / properties / kinds
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Which measurements to take together, e.g. ['vpp', 'frequency']. None uses the default set (vpp, vrms, frequency, period, duty).",
        +  "title": "Kinds"
        +}
      • removedInput schema / properties / kwargs
        Removed value: -{
        -  "title": "Kwargs"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "args",
        -  "kwargs"
        -]New value: +[
        +  "channel"
        +]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "title": "snapshot_implDictOutput",
        +  "type": "object"
        +}
    • Changedself_config5 fields changed
      • removedInput schema / properties / args
        Removed value: -{
        -  "title": "Args"
        -}
      • addedInput schema / properties / host
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Optional instrument address (IP/hostname, or a full VISA resource string) to connect to directly. None runs auto-discovery (USB, then LAN).",
        +  "title": "Host"
        +}
      • removedInput schema / properties / kwargs
        Removed value: -{
        -  "title": "Kwargs"
        -}
      • removedInput schema / required
        Removed value: -[
        -  "args",
        -  "kwargs"
        -]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "title": "self_config_implDictOutput",
        +  "type": "object"
        +}
    • Changedset_channel9 fields changed
      • removedInput schema / properties / args
        Removed value: -{
        -  "title": "Args"
        -}
      • addedInput schema / properties / channel
        Added value: +{
        +  "description": "Analog channel to configure, 1-based (1โ€“4).",
        +  "title": "Channel",
        +  "type": "integer"
        +}
      • addedInput schema / properties / coupling
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Input coupling: 'DC', 'AC', or 'GND'. None leaves it unchanged.",
        +  "title": "Coupling"
        +}
      • addedInput schema / properties / enabled
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Turn the channel's display/acquisition on (True) or off (False). None leaves it unchanged.",
        +  "title": "Enabled"
        +}
      • removedInput schema / properties / kwargs
        Removed value: -{
        -  "title": "Kwargs"
        -}
      • addedInput schema / properties / offset
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Vertical offset in volts, shifting the trace up (+) or down (-). None leaves it unchanged.",
        +  "title": "Offset"
        +}
      • addedInput schema / properties / scale
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Vertical scale in volts per division (e.g. 0.5 = 500 mV/div). None leaves it unchanged.",
        +  "title": "Scale"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "args",
        -  "kwargs"
        -]New value: +[
        +  "channel"
        +]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "title": "set_channel_implDictOutput",
        +  "type": "object"
        +}
    • Changedset_timebase6 fields changed
      • removedInput schema / properties / args
        Removed value: -{
        -  "title": "Args"
        -}
      • removedInput schema / properties / kwargs
        Removed value: -{
        -  "title": "Kwargs"
        -}
      • addedInput schema / properties / offset
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Horizontal (trigger) offset in seconds, moving the trigger point left/right. None leaves it unchanged.",
        +  "title": "Offset"
        +}
      • addedInput schema / properties / scale
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Horizontal scale in seconds per division (e.g. 1e-3 = 1 ms/div). None leaves it unchanged.",
        +  "title": "Scale"
        +}
      • removedInput schema / required
        Removed value: -[
        -  "args",
        -  "kwargs"
        -]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "title": "set_timebase_implDictOutput",
        +  "type": "object"
        +}
    • Changedset_trigger7 fields changed
      • removedInput schema / properties / args
        Removed value: -{
        -  "title": "Args"
        -}
      • removedInput schema / properties / kwargs
        Removed value: -{
        -  "title": "Kwargs"
        -}
      • addedInput schema / properties / level
        Added value: +{
        +  "description": "Trigger threshold voltage. The scope fires when the source crosses this level in the chosen slope direction.",
        +  "title": "Level",
        +  "type": "number"
        +}
      • addedInput schema / properties / slope
        Added value: +{
        +  "default": "rising",
        +  "description": "Edge direction to trigger on: 'rising' (default) or 'falling'.",
        +  "title": "Slope",
        +  "type": "string"
        +}
      • addedInput schema / properties / source
        Added value: +{
        +  "description": "Trigger source: analog channel to trigger on (1-based).",
        +  "title": "Source",
        +  "type": "integer"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "args",
        -  "kwargs"
        -]New value: +[
        +  "source",
        +  "level"
        +]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "title": "set_trigger_implDictOutput",
        +  "type": "object"
        +}
  2. 18 tool updatesv0.1.0
    • First observedacq_configure
    • First observedacq_force
    • First observedacq_run
    • First observedacq_single
    • First observedacq_stop
    • First observedcapability_report
    • First observedcapture_aligned
    • First observedcapture_memory
    • First observedcapture_screen
    • First observedcharacterize_signal
    • First observedidentify
    • First observedmeasure
    • First observedmeasure_series
    • First observedmeasure_snapshot
    • First observedself_config
    • First observedset_channel
    • First observedset_timebase
    • First observedset_trigger

TDQS

A3.9/5.0

Scored across 18 tools

Disambiguation5/5

Each tool targets a distinct oscilloscope operation. Acquisition, capture, measurement, and configuration tools have clear, non-overlapping purposes. Even similar tools like acq_run and acq_single are differentiated by continuous vs single-shot acquisition.

Naming Consistency4/5

Tools predominantly follow a consistent verb_noun pattern (e.g., set_channel, capture_screen). Minor deviations like 'identify' and 'self_config' slightly break the pattern but remain intuitive. Overall, naming is predictable and readable.

Tool Count5/5

18 tools comprehensively cover essential oscilloscope operations without redundancy. The count is well-scoped for a domain-specific server, providing enough granularity for complex workflows while remaining manageable.

Completeness4/5

Core lifecycle tasks (connect, configure, acquire, capture, measure) are fully covered. Advanced features like FFT or automated calibration are absent but not critical for basic SCPI control. Minor gaps exist but do not hinder primary use cases.

Maintenance

ActivityStale
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    An MCP server that enables AI assistants to control Siglent SDS oscilloscopes over a local network using SCPI commands. It allows users to measure signals, configure channel and acquisition settings, and capture waveforms or screenshots through natural language.
    13
    5 npm
    7
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    An MCP server for controlling Rigol DS1000Z series oscilloscopes over LAN using natural language. It enables users to take measurements, configure instrument settings, and capture screenshots directly through an MCP client.
    17
    28
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    AI-native oscilloscope control. A pure-Python MCP service that lets LLM agents control Keysight EDUX1052G oscilloscopes via a compact DSL.
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    An MCP server for controlling Rigol oscilloscopes from an AI assistant. It translates MCP tool calls into SCPI commands over PyVISA.
    1
    MIT