siglent-sdg-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@siglent-sdg-mcpSet channel 1 to output a 1kHz sine wave with 2V amplitude."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
siglent-sdg-mcp
A Model Context Protocol (MCP) server that lets AI assistants control Siglent SDG waveform generators over your local network. Connect Claude to your bench and generate, modulate, and configure signals through natural language.
Overview
This MCP server communicates with Siglent SDG waveform generators via SCPI commands over TCP sockets (port 5025). No VISA drivers or NI-MAX installation required — just a network connection to your generator.

Key features:
21 tools covering output control, waveform generation, modulation, sweep, burst, arbitrary waveforms, and more
Dual-channel support (C1 and C2)
8 waveform types: sine, square, ramp, pulse, noise, arbitrary, DC, PRBS
8 modulation types: AM, DSB-AM, FM, PM, PWM, ASK, FSK, PSK
Auto-connect on startup via environment variable
Query queue serializes commands automatically — tools can safely run in parallel
Raw SCPI escape hatch for any command not covered by the built-in tools
Related MCP server: jds6600-mcp
Compatibility
Status | Model |
Tested | SDG1032X |
Expected to work | SDG1000X series (SDG1062X, etc.) |
May work | Other Siglent SDG models with SCPI over TCP support |
The server uses standard SCPI commands from the SDG series programming guide. Other Siglent models that support the same command set over port 5025 should work with little or no modification.
Quick Start
You need a Siglent waveform generator accessible on your network (TCP port 5025). Pick one of the three options below and add the config to your .mcp.json (in your project directory, or ~/.claude/.mcp.json for global access).
Replace 192.168.1.126 with your generator's IP address.
Option A: Docker (recommended)
No Node.js installation required. Works on Linux, macOS, and Windows (via WSL2 or Docker Desktop).
{
"mcpServers": {
"siglent-sdg": {
"type": "stdio",
"command": "docker",
"args": [
"run", "--rm", "-i",
"-e", "SIGLENT_SDG_IP=192.168.1.126",
"ghcr.io/magnusjohansson/siglent-sdg-mcp:latest"
]
}
}
}Option B: npx
Requires Node.js 20+. Downloads and runs the package automatically.
{
"mcpServers": {
"siglent-sdg": {
"type": "stdio",
"command": "npx",
"args": ["-y", "siglent-sdg-mcp"],
"env": {
"SIGLENT_SDG_IP": "192.168.1.126"
}
}
}
}Option C: Clone and build
git clone https://github.com/magnusjohansson/siglent-sdg-mcp.git
cd siglent-sdg-mcp
npm install
npm run build{
"mcpServers": {
"siglent-sdg": {
"type": "stdio",
"command": "node",
"args": ["/path/to/siglent-sdg-mcp/build/index.js"],
"env": {
"SIGLENT_SDG_IP": "192.168.1.126"
}
}
}
}Replace /path/to/siglent-sdg-mcp with the actual path to your clone.
Environment Variables
Variable | Required | Default | Description |
| No | — | Generator IP address for auto-connect on startup |
| No | — | Fallback if |
| No |
| TCP port (only change if your setup differs) |
| No |
| Fallback if |
Auto-Connect Behavior
If SIGLENT_SDG_IP (or SIGLENT_IP) is set, the server attempts to connect to the generator immediately after starting. This runs in the background and does not block the MCP server — Claude can start using other tools right away. If the generator is offline or unreachable, the server logs a warning and you can connect manually later using the connect tool.
If neither variable is set, the server starts without a connection. Use the connect tool to connect when ready.
Using with Other AI Clients
The Quick Start examples above use Claude Code's .mcp.json format, which includes a "type": "stdio" field. Other AI clients use the same JSON structure but without the "type" field and with different config file locations.
Claude Desktop
Edit claude_desktop_config.json:
Windows:
%APPDATA%\Claude\claude_desktop_config.jsonmacOS:
~/Library/Application Support/Claude/claude_desktop_config.json
Docker
{
"mcpServers": {
"siglent-sdg": {
"command": "docker",
"args": [
"run", "--rm", "-i",
"-e", "SIGLENT_SDG_IP=192.168.1.126",
"ghcr.io/magnusjohansson/siglent-sdg-mcp:latest"
]
}
}
}npx
{
"mcpServers": {
"siglent-sdg": {
"command": "npx",
"args": ["-y", "siglent-sdg-mcp"],
"env": {
"SIGLENT_SDG_IP": "192.168.1.126"
}
}
}
}Note: You must fully restart Claude Desktop after changing the config file.
Cursor
Edit one of:
User-level:
~/.cursor/mcp.json(available across all projects)Project-level:
.cursor/mcp.json(shared with your team via version control)
You can also add servers through the UI: Settings > Cursor Settings > MCP > Add new global MCP server.
Docker
{
"mcpServers": {
"siglent-sdg": {
"command": "docker",
"args": [
"run", "--rm", "-i",
"-e", "SIGLENT_SDG_IP=192.168.1.126",
"ghcr.io/magnusjohansson/siglent-sdg-mcp:latest"
]
}
}
}npx
{
"mcpServers": {
"siglent-sdg": {
"command": "npx",
"args": ["-y", "siglent-sdg-mcp"],
"env": {
"SIGLENT_SDG_IP": "192.168.1.126"
}
}
}
}Windsurf
Edit mcp_config.json:
Windows:
%USERPROFILE%\.codeium\windsurf\mcp_config.jsonmacOS/Linux:
~/.codeium/windsurf/mcp_config.json
You can also configure servers through the UI: Cascade panel > MCP icon > Manage MCP Servers > View raw config.
Docker
{
"mcpServers": {
"siglent-sdg": {
"command": "docker",
"args": [
"run", "--rm", "-i",
"-e", "SIGLENT_SDG_IP=192.168.1.126",
"ghcr.io/magnusjohansson/siglent-sdg-mcp:latest"
]
}
}
}npx
{
"mcpServers": {
"siglent-sdg": {
"command": "npx",
"args": ["-y", "siglent-sdg-mcp"],
"env": {
"SIGLENT_SDG_IP": "192.168.1.126"
}
}
}
}Google Antigravity
Configuration is managed through the IDE's UI:
Open the Agent pane on the right side of the workspace
Click the
...button at the topSelect MCP Servers
Click Manage MCP Servers
Click View raw config
Add the configuration below and save
Docker
{
"mcpServers": {
"siglent-sdg": {
"command": "docker",
"args": [
"run", "--rm", "-i",
"-e", "SIGLENT_SDG_IP=192.168.1.126",
"ghcr.io/magnusjohansson/siglent-sdg-mcp:latest"
]
}
}
}npx
{
"mcpServers": {
"siglent-sdg": {
"command": "npx",
"args": ["-y", "siglent-sdg-mcp"],
"env": {
"SIGLENT_SDG_IP": "192.168.1.126"
}
}
}
}Replace 192.168.1.126 with your generator's IP address in all examples above.
ChatGPT Desktop
ChatGPT Desktop only supports remote HTTPS MCP servers (called "connectors"), not local stdio servers. Since this MCP server uses stdio transport, it is not directly compatible with ChatGPT Desktop.
Tools
21 tools across 9 categories.
Category | Tool | Description |
Connection |
| Connect to waveform generator over TCP |
| Close the connection | |
| Query device ID (manufacturer, model, serial, firmware) | |
Output |
| Read output state, load impedance, and polarity |
| Turn output on/off, set load impedance and polarity | |
Basic Waveform |
| Read waveform parameters (type, frequency, amplitude, etc.) |
| Set waveform type, frequency, amplitude, offset, phase, duty cycle, and more | |
Modulation |
| Read modulation settings (type, source, depth/deviation) |
| Set modulation type, source, frequency, depth, deviation, and carrier parameters | |
Sweep |
| Read sweep parameters (time, frequency range, mode, direction) |
| Set sweep time, start/stop frequencies, mode, direction, trigger, and marker | |
Burst |
| Read burst parameters (mode, period, trigger, cycle count) |
| Set burst mode, period, trigger source, cycle count, delay, and gate polarity | |
Arbitrary Waveform |
| Read the current arbitrary waveform selection |
| Set arbitrary waveform by index (built-in) or name (user-defined) | |
Utility |
| Reset generator to factory defaults (*RST) |
| Copy all parameters from one channel to another | |
| Configure sync output signal | |
| Synchronize phase of both channels | |
SCPI |
| Send arbitrary SCPI query and return the response |
| Send arbitrary SCPI command (no response expected) |
Example Conversations
Generate a basic waveform
You: Output a 1 kHz sine wave at 2 Vpp on channel 1.
Claude calls
configure_basic_wavewithchannel: "C1",waveform_type: "SINE",frequency: 1000,amplitude: 2, thenconfigure_outputwithchannel: "C1",state: "ON".
Set up modulation
You: Add AM modulation to channel 1 with 80% depth at 100 Hz.
Claude calls
configure_modulationwithchannel: "C1",state: "ON",type: "AM",depth: 80,frequency: 100.
Configure a frequency sweep
You: Sweep channel 2 from 100 Hz to 10 kHz over 5 seconds.
Claude calls
configure_sweepwithchannel: "C2",state: "ON",start: 100,stop: 10000,time: 5, thenconfigure_outputwithchannel: "C2",state: "ON".
Check current settings
You: What's the current waveform setup on both channels?
Claude calls
get_basic_waveon both C1 and C2 in parallel and reports the waveform type, frequency, amplitude, and other settings for each channel.
Copy channel configuration
You: Make channel 2 match channel 1's settings.
Claude calls
copy_channelwithsource: "C1",destination: "C2".
Set up burst mode
You: Configure channel 1 for 5-cycle bursts triggered externally.
Claude calls
configure_burstwithchannel: "C1",state: "ON",burst_mode: "NCYC",cycles: "5",trigger_source: "EXT".
Architecture
Claude Code <-- stdio/JSON-RPC --> siglent-sdg-mcp <-- TCP/SCPI --> Generator:5025Transport: MCP over stdio (JSON-RPC 2.0)
Protocol: SCPI commands over raw TCP sockets, newline-terminated
Query Queue: All SCPI queries are serialized through an internal queue. The generator processes one command at a time, so even when tools issue parallel requests, the queue ensures they're sent sequentially.
Auto-Connect: If
SIGLENT_SDG_IPis set, connects in the background on startup without blocking the MCP server.
Development
npm run build # Compile TypeScript
npm run watch # Watch mode — recompile on changes
npm run dev # Build and run
npm run inspector # Launch with MCP Inspector for debuggingDocker (local build)
Build the image locally:
docker build -t siglent-sdg-mcp .Then use the local image in your .mcp.json:
{
"mcpServers": {
"siglent-sdg": {
"type": "stdio",
"command": "docker",
"args": [
"run", "--rm", "-i",
"-e", "SIGLENT_SDG_IP=192.168.1.126",
"siglent-sdg-mcp"
]
}
}
}Project Structure
src/
index.ts # Entry point, MCP server setup
connection.ts # TCP socket manager with query queue
tools/
connection.ts # connect, disconnect, identify
output.ts # get_output, configure_output
basic-wave.ts # get_basic_wave, configure_basic_wave
modulation.ts # get_modulation, configure_modulation
sweep.ts # get_sweep, configure_sweep
burst.ts # get_burst, configure_burst
arbitrary.ts # get_arbitrary_wave, set_arbitrary_wave
utility.ts # reset, copy_channel, configure_sync, equal_phase
scpi.ts # scpi_query, scpi_commandTroubleshooting
"Not connected to waveform generator"
The generator isn't connected yet. Either set SIGLENT_SDG_IP in your .mcp.json env for auto-connect, or use the connect tool manually.
Connection timeout
Verify the generator's IP address (check the generator's Utility > Interface menu)
Ensure port 5025 is accessible (try
telnet <generator-ip> 5025from your machine)Check that no firewall is blocking the connection
The generator only accepts one TCP connection at a time — close any other SCPI clients
Query timeout
Some SCPI queries can take a few seconds. The default timeout is 5 seconds. For scpi_query, you can increase the timeout with the timeout_ms parameter.
Docker: can't reach the waveform generator
By default, Docker containers can reach LAN devices via the bridge network (NAT). If the container can't connect to your generator:
Verify the generator is reachable from your host:
telnet 192.168.1.126 5025On Linux, try adding
--network hostto the Docker args:"args": ["run", "--rm", "-i", "--network", "host", "-e", "SIGLENT_SDG_IP=192.168.1.126", "ghcr.io/magnusjohansson/siglent-sdg-mcp:latest"]Note:
--network hostdoes not work on macOS or Windows Docker Desktop.
Docker: wrong architecture / exec format error
The published image supports linux/amd64 and linux/arm64. Docker should pull the correct one automatically. If you see an exec format error, pull explicitly:
docker pull --platform linux/amd64 ghcr.io/magnusjohansson/siglent-sdg-mcp:latest"CHDR" appears in responses
This shouldn't happen — the server sets CHDR OFF on connect. If you see command headers in responses, try disconnecting and reconnecting.
License
MIT — see LICENSE for details.
Available Tools
21 toolsconfigure_basic_waveA
Configure the basic waveform parameters of a channel. Multiple parameters can be set in a single call. The command builds a single BSWV command with all specified parameters.
| Name | Required | Description | Default |
|---|---|---|---|
| duty | No | Duty cycle in % (only for SQUARE or PULSE) | |
| fall | No | Fall time in seconds (only for PULSE) | |
| mean | No | Mean in volts (only for NOISE) | |
| rise | No | Rise time in seconds (only for PULSE) | |
| delay | No | Waveform delay in seconds | |
| phase | No | Phase in degrees (0-360, not valid for NOISE, PULSE, or DC) | |
| stdev | No | Standard deviation in volts (only for NOISE) | |
| width | No | Pulse width in seconds (only for PULSE) | |
| offset | No | DC offset in volts (not valid for NOISE) | |
| period | No | Period in seconds (alternative to frequency) | |
| channel | Yes | Channel to configure | |
| symmetry | No | Symmetry in % (0-100, only for RAMP) | |
| amplitude | No | Amplitude in Vpp (not valid for NOISE or DC) | |
| frequency | No | Frequency in Hz (not valid for NOISE or DC) | |
| low_level | No | Low level in volts | |
| high_level | No | High level in volts | |
| waveform_type | No | Waveform type | |
| amplitude_vrms | No | Amplitude in Vrms |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only indicate readOnlyHint:false, so the description carries the burden for behavioral disclosure. It adds context about building a single BSWV command, hinting at atomicity/efficiency, but doesn't mention prerequisites (e.g., setting waveform_type), validation of parameter combinations, or side effects beyond the mutation itself.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is brief overall, but the second and third sentences ('Multiple parameters can be set in a single call' and 'builds a single BSWV command with all specified parameters') are redundant, repeating the same idea. It is front-loaded but could be tightened without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 18 parameters, no output schema, and minimal annotations, the description is under-specified. It doesn't explain parameter dependencies (e.g., some params are only valid for specific waveform types), mutual exclusivity (frequency vs. period), or the need to set waveform_type first. The schema describes each parameter individually, but the description fails to synthesize this into a coherent usage model.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema itself documents each parameter's meaning and constraints. The description adds little beyond noting that multiple parameters can be set at once, which doesn't deepen understanding of individual parameter semantics or relationships like mutual exclusivity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Configure the basic waveform parameters of a channel' with a specific verb and resource. It distinguishes itself from sibling tools like configure_modulation, configure_sweep, and configure_output by focusing on basic waveform parameters, and the name reinforces this scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
While it doesn't explicitly name alternatives, the context is clear: it is for basic waveform parameters and supports batching multiple parameters in a single call. This implies when to use it (for basic wave settings) but lacks explicit exclusions or comparisons to siblings like configure_modulation or configure_sweep.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
configure_burstA
Configure burst mode on a channel. State must be set to ON before other parameters. Builds a single BTWV command with all specified parameters.
| Name | Required | Description | Default |
|---|---|---|---|
| delay | No | Trigger delay in seconds (when NCYC mode) | |
| state | No | Burst state. Must be ON before setting other params. | |
| cycles | No | Number of burst cycles (integer, or 'INF' for infinite) | |
| period | No | Burst period in seconds | |
| channel | Yes | Channel to configure | |
| burst_mode | No | Burst mode: GATE or NCYC (N-cycle) | |
| start_phase | No | Start phase in degrees (0-360) | |
| trigger_out | No | Trigger output mode (when NCYC and INT/MAN) | |
| carrier_duty | No | Carrier duty cycle in % (for SQUARE or PULSE) | |
| trigger_edge | No | Trigger edge (when EXT or MAN) | |
| carrier_phase | No | Carrier phase in degrees (0-360) | |
| gate_polarity | No | Gate polarity (when GATE mode) | |
| carrier_offset | No | Carrier DC offset in volts | |
| manual_trigger | No | Send a manual trigger (only when trigger source is MAN) | |
| trigger_source | No | Trigger source | |
| carrier_symmetry | No | Carrier symmetry in % (for RAMP) | |
| carrier_waveform | No | Carrier waveform type | |
| carrier_amplitude | No | Carrier amplitude in Vpp | |
| carrier_frequency | No | Carrier frequency in Hz |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds a useful behavioral detail: it 'Builds a single BTWV command with all specified parameters.' This goes beyond the basic readOnlyHint annotation by revealing the command construction. However, it does not disclose whether the command is actually sent, how errors are handled, or whether parameters are validated, which is significant for a tool with 19 parameters.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences with no redundant information. It front-loads the purpose and includes an essential usage note, making it highly efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
As a complex tool with 19 parameters and no output schema, the description covers the key prerequisite but omits details about execution behavior, validation, and possible error states. The rich schema descriptions compensate for some gaps, but the description alone leaves important context unclear, such as whether the BTWV command is immediately applied or merely built.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides 100% description coverage for all 19 parameters, so the baseline is 3. The description adds the important cross-parameter dependency that 'State must be set to ON before other parameters,' which is not fully captured in the schema. This is valuable but minimal, as all individual parameter meanings are already in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the action ('Configure burst mode'), the target resource ('on a channel'), and the implementation approach ('Builds a single BTWV command'). This distinguishes it from sibling tools like configure_modulation or configure_sweep, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides an explicit ordering guideline: 'State must be set to ON before other parameters.' This is a key usage condition. It does not explicitly name alternatives or exclusions, but the focus on burst mode and the mention of BTWV command imply when it should be used relative to other configuration tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
configure_modulationA
Configure modulation on a channel. Set state first (ON), then type and parameters. Commands are sent sequentially: state, then type, then type-specific parameters, then carrier parameters.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Modulation type | |
| depth | No | AM modulation depth in % (0-120) | |
| state | No | Modulation state. Must be ON before setting other params. | |
| source | No | Modulation source (availability depends on type) | |
| channel | Yes | Channel to configure | |
| mod_wave | No | Modulating waveform shape (only when source is INT) | |
| polarity | No | PSK polarity | |
| deviation | No | FM frequency deviation in Hz, or PM phase deviation in degrees (0-360), or PWM duty deviation in % | |
| frequency | No | Modulation frequency in Hz (AM/FM/PM/PWM) or key frequency (ASK/FSK/PSK) | |
| carrier_phase | No | Carrier phase in degrees (0-360) | |
| hop_frequency | No | FSK hop frequency in Hz | |
| carrier_offset | No | Carrier DC offset in volts | |
| carrier_waveform | No | Carrier waveform type | |
| carrier_amplitude | No | Carrier amplitude in Vpp | |
| carrier_frequency | No | Carrier frequency in Hz |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint:false annotation, the description discloses the sequential execution behavior: state, then type, then type-specific parameters, then carrier parameters. This adds valuable insight into the tool's operation, though it does not cover error handling or side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is only three sentences, front-loaded with the purpose and then the key usage sequence. Every sentence contributes essential information without redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 15 parameters and no output schema, but the schema fully documents each parameter. The description adds the crucial state-first prerequisite and command sequencing, which are essential for correct invocation. It could be more explicit about which parameters apply to which modulation types, but that is partially hinted at with 'type-specific parameters' and covered by enum descriptions in the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds value by explaining the ordering and dependency of parameters (state first, type before type-specific parameters), which is not captured in the schema itself. This helps the agent understand how parameters interrelate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Configure modulation on a channel.' This clearly distinguishes it from sibling tools like configure_output or configure_basic_wave. The purpose is unambiguous and action-oriented.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear procedural context: 'Set state first (ON), then type and parameters' and explains the sequential command ordering. While it does not explicitly mention alternatives or when-not-to-use, the ordering guidance is a strong usage guideline for this complex tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
configure_outputA
Configure the output of a channel. Can turn output on/off, set load impedance, and set polarity.
| Name | Required | Description | Default |
|---|---|---|---|
| load | No | Load impedance in ohms (50-100000) or 'HZ' for high impedance | |
| state | No | Output state: ON or OFF | |
| channel | Yes | Channel to configure | |
| polarity | No | Output polarity: NOR (normal) or INVT (inverted) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, confirming a write operation. The description aligns with this and adds the specific configurable aspects (state, load, polarity). However, it does not disclose side effects, prerequisites, or persistence, so it adds only moderate behavioral context beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences, front-loaded with the main action and specific options. Every word earns its place with no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is moderately complex with 4 parameters and a comprehensive schema. The description explains the core function but omits usage context (e.g., when to configure, interaction with connect/disconnect) and return behavior. It is minimally adequate but not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for all 4 parameters. The description summarizes the three main parameters (state, load, polarity) but does not add any new meaning beyond what the schema already documents. Baseline 3 applies due to high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Configure the output of a channel' and lists specific capabilities (turn output on/off, set load impedance, set polarity). This is a specific verb+resource combination that distinguishes it from sibling tools like configure_basic_wave or get_output.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives, no prerequisites, and no scenarios. It simply states what the tool does, without any contextual cues for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
configure_sweepA
Configure sweep on a channel. State must be set to ON before other parameters. Builds a single SWWV command with all specified parameters.
| Name | Required | Description | Default |
|---|---|---|---|
| span | No | Frequency span in Hz | |
| stop | No | Stop frequency in Hz | |
| time | No | Sweep time in seconds | |
| start | No | Start frequency in Hz | |
| state | No | Sweep state. Must be ON before setting other params. | |
| center | No | Center frequency in Hz | |
| channel | Yes | Channel to configure | |
| symmetry | No | Symmetry in % (0-100) when direction is UP_DOWN | |
| direction | No | Sweep direction | |
| sweep_mode | No | Sweep mode: LINE (linear), LOG (logarithmic), or STEP | |
| return_time | No | Return time in seconds (0-300) | |
| trigger_out | No | Trigger output state | |
| marker_state | No | Frequency marker state | |
| trigger_edge | No | Trigger edge (only for EXT or MAN trigger source) | |
| carrier_phase | No | Carrier phase in degrees (0-360) | |
| end_hold_time | No | End hold time in seconds (0-300) | |
| carrier_offset | No | Carrier DC offset in volts | |
| manual_trigger | No | Send a manual trigger (only when trigger source is MAN) | |
| trigger_source | No | Trigger source: EXT (external), INT (internal), MAN (manual) | |
| start_hold_time | No | Start hold time in seconds (0-300) | |
| carrier_waveform | No | Carrier waveform type | |
| marker_frequency | No | Marker frequency in Hz | |
| carrier_amplitude | No | Carrier amplitude in Vpp | |
| carrier_frequency | No | Carrier frequency in Hz |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only include readOnlyHint: false, indicating mutation. The description adds meaningful behavioral context by revealing the SWWV command construction and the dependency on state being ON first, which goes beyond the minimal annotation. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no fluff. The purpose is front-loaded ('Configure sweep on a channel') and the second sentence delivers a critical usage constraint. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite 24 parameters and no output schema, the description covers the most important non-obvious behaviors: the state ordering prerequisite and the command-building approach. The schema fully handles parameter details. Could potentially mention defaults or what gets overwritten, but overall sufficient for a configuration tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has 100% coverage with individual parameter descriptions, so baseline is 3. The description's phrase 'all specified parameters' adds no new parameter-specific meaning; the schema already documents each field thoroughly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Configure sweep on a channel' with a specific verb and resource, distinguishing it from sibling tools like get_sweep (read) and other configure_* tools. The second sentence about building a single SWWV command adds useful implementation-specific detail.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly gives a usage ordering requirement: 'State must be set to ON before other parameters.' This is a clear directive for correct invocation. It does not explicitly name alternatives, but the tool's name and sibling set imply this is for configuring sweeps versus reading them via get_sweep.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
configure_syncC
Configure the sync output signal for a channel.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Sync source type | |
| state | Yes | Sync output state | |
| channel | Yes | Channel to configure |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotation readOnlyHint=false indicates a write operation, but the description adds no further behavioral context. It does not explain side effects, reversibility, or how parameters affect behavior (e.g., state ON/OFF enables/disables the sync output). The description essentially restates the tool's name without disclosing additional traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clear sentence that is short and to the point. It is appropriately sized for the simplicity of the tool, though it could be slightly more informative without becoming verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description and schema together give a basic understanding of the tool's purpose and parameters, but the description lacks usage context and behavioral nuance. For a simple configuration tool with a rich schema, this is minimally complete but leaves gaps around when to use it and what happens when invoked.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: each parameter has a clear description (type, state, channel). The tool description adds no extra parameter semantics, so the baseline score of 3 is appropriate as the schema fully documents the parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear action and resource: 'Configure the sync output signal for a channel.' This distinguishes it from other configure tools like configure_output or configure_modulation, though it does not explicitly contrast them. The verb and resource are specific enough for basic purpose clarity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives. The description does not provide context such as typical use cases, prerequisites, or exclusions. Given the presence of sibling tools like configure_sweep and configure_burst, the lack of usage direction is a notable gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
connectA
Connect to a Siglent SDG waveform generator over TCP. Returns device identification on success.
| Name | Required | Description | Default |
|---|---|---|---|
| host | No | IP address of the waveform generator (defaults to SIGLENT_SDG_IP or SIGLENT_IP env var) | |
| port | No | TCP port (defaults to 5025) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds 'Returns device identification on success' and specifies TCP, but it does not disclose that the connection is persistent or that it should be terminated with 'disconnect'. Annotations provide openWorldHint=true but do not cover connection lifecycle. The description is adequate but not rich in behavioral detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences that front-load the primary action and mention the success return value. No redundant or vague wording; every sentence contributes valuable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple connection tool, the description covers the essential aspects: connection address, protocol, and return value. It is slightly incomplete by not stating that the connection persists or that 'disconnect' should be used, but the sibling tool list makes this inferable. Overall, it is well-rounded for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with host and port both having descriptions including defaults and environment variable fallback. The description adds no new parameter-specific semantics beyond mentioning TCP, which is already implied by the port default of 5025. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the tool's function: 'Connect to a Siglent SDG waveform generator over TCP.' It uses a specific verb (Connect), identifies the resource (Siglent SDG waveform generator), and specifies the protocol (TCP), making it distinct from siblings like 'disconnect' and 'identify'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies that this tool should be used before other operations (as it establishes a connection), but it does not explicitly say 'use before sending commands' or mention alternatives. There is no exclusion guidance, but the purpose is self-evident given the sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
copy_channelA
Copy all parameters from one channel to another.
| Name | Required | Description | Default |
|---|---|---|---|
| source | Yes | Source channel to copy from | |
| destination | Yes | Destination channel to copy to |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations indicate this is not read-only, and the description adds that all parameters are copied. However, it does not disclose edge cases like source and destination being the same channel or explicitly state that the destination's existing settings are overwritten.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, direct sentence with no filler. It front-loads the action and identifies the operand immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with two well-described enum parameters and no output schema, this description is largely complete. It could mention overwrite behavior, but that is not essential given the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema covers both parameters with clear descriptions and enumerations, so the description adds little beyond the schema. This matches the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('copy') and identifies the exact resource ('all parameters from one channel to another'). It clearly distinguishes this tool from the surrounding get_/configure_ siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context: use it to duplicate all parameters between channels. It does not explicitly mention alternatives or when not to use it, but the purpose is self-evident from the sibling tool set.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
disconnectA
Disconnect from the waveform generator.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotation readOnlyHint=false already signals that this tool changes state. The description adds no extra behavioral context beyond that, e.g., whether it is idempotent, what side effects occur on the device, or whether it closes sockets gracefully.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, direct sentence that is front-loaded and contains no superfluous words. It earns its place by stating the exact action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the low complexity (no params, no output schema, simple action), the description is essentially complete. It could optionally mention that it is the inverse of 'connect', but that is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, so no additional parameter explanation is needed. The baseline of 4 applies because the schema fully covers the (nonexistent) parameter surface.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Disconnect') and resource ('waveform generator'), clearly stating the action. It distinguishes itself from siblings like 'connect' and 'reset' by naming the operation directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The usage context is implied: it is the counterpart to 'connect'. However, there is no explicit guidance on when to use it vs alternatives like 'reset' or 'idle', nor any mention of prerequisites or post-conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
equal_phaseB
Synchronize the phase of both channels (EQPHASE). Aligns the phase relationship between C1 and C2.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotation readOnlyHint=false indicates a mutation, but the description only restates the action ('synchronize') without disclosing side effects, prerequisites, reversibility, or whether the operation is destructive. It adds no behavioral context beyond what the name and annotation already imply.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise—two short sentences, front-loaded with the primary action. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, parameterless tool, the description adequately explains the core purpose. However, it fails to clarify how this differs from the related sibling 'configure_sync' or to mention any prerequisites or consequences of use. This could lead to confusion for an agent deciding between tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, so the description does not need to explain parameter meanings. The baseline of 4 is appropriate since the tool's operation is clear from the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb ('Synchronize'/'Aligns') and the resource (phase of channels C1/C2). It identifies the operation without ambiguity, but it does not explicitly differentiate from the sibling tool 'configure_sync', which might also deal with synchronization.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool (when phase alignment between C1 and C2 is needed), but it provides no explicit guidance about when not to use it or what alternatives exist. No exclusions or comparison with related tools like 'configure_sync' are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_arbitrary_waveARead-only
Get the current arbitrary waveform selection for a channel. Returns the waveform index and name.
| Name | Required | Description | Default |
|---|---|---|---|
| channel | Yes | Channel to query |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already signals a safe read operation. The description adds meaningful behavioral context by explicitly stating what is returned (waveform index and name), going beyond the bare annotation. It does not contradict the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is only two sentences, front-loaded with the action and resource, and every word is necessary. No fluff or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple getter with one enum parameter and no output schema, the description fully covers what the tool does and what it returns. The readOnlyHint annotation supplies the safety context, and the schema covers the parameter, making the description complete for this low-complexity tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with the channel parameter fully documented via enum and description. The tool description does not add further semantic detail beyond repeating 'channel,' so it meets but does not exceed the baseline expected when the schema carries the parameter information.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description begins with a specific verb 'Get' and identifies the exact resource: 'current arbitrary waveform selection for a channel.' It also states the return value (waveform index and name), which differentiates this getter from siblings like get_basic_wave or get_modulation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies use when querying the current arbitrary waveform selection, but it does not explicitly state when to use this tool versus alternatives or mention the sibling set_arbitrary_wave. The usage context is implied rather than directly expressed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_basic_waveARead-only
Get the basic waveform parameters of a channel, including waveform type, frequency, amplitude, offset, phase, duty cycle, etc.
| Name | Required | Description | Default |
|---|---|---|---|
| channel | Yes | Channel to query |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already declares the operation is safe, and the description matches with 'Get'. The description adds value by listing the specific parameters included, but does not disclose return format, error behavior, or any side effects. Given the annotation covers the main safety concern, a mid-range score is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, focused sentence that front-loads the action and resource. It avoids fluff and provides a useful list of example parameters, earning its place without excess.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter read tool with a readOnlyHint, the description plus schema is mostly complete. It identifies the purpose, the target channel, and key parameters. It lacks return format, but the absence of an output schema lowers this need; still, a brief mention of what the response includes would have made it fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%: the only parameter 'channel' has a clear description and enum of C1/C2. The tool description does not add anything beyond the schema, so it relies on the schema for parameter meaning. Baseline 3 is warranted due to full schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool gets basic waveform parameters (type, frequency, amplitude, etc.) from a channel. The verb 'Get' plus resource 'basic waveform parameters' is specific and distinguishes it from sibling get_* tools like get_modulation and get_sweep.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is implied: the tool is for reading basic waveform settings, contrasting with configuration tools like configure_basic_wave. However, there is no explicit guidance on when to choose this over other get_* tools or what to do if the channel is invalid. The 'etc.' at the end leaves scope slightly ambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_burstARead-only
Get the burst wave parameters of a channel, including state, period, trigger source, burst mode (gate/ncycle), cycle count, carrier settings, and delay.
| Name | Required | Description | Default |
|---|---|---|---|
| channel | Yes | Channel to query |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, and the description reinforces this with 'Get'. The description adds value by listing the specific attributes returned, which helps the agent understand the tool's output scope. It does not contradict annotations, and the added context goes beyond the minimal read-only hint, though it stops short of providing return format details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that front-loads the core purpose ('Get the burst wave parameters of a channel') and then lists the included parameters without unnecessary words. Every word contributes to understanding the tool's function.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only query tool with one fully documented parameter, the description adequately covers purpose and return content. No output schema exists, so the description carries the burden of explaining return values, which it does by listing them. It lacks explicit return format or error conditions, but the simplicity of the tool makes this a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers the single 'channel' parameter completely with type, enum (C1/C2), and description 'Channel to query'. The description's phrase 'of a channel' adds no new semantic meaning beyond the schema. With 100% schema coverage, a baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly specifies a get operation for 'burst wave parameters of a channel' and enumerates the exact parameters covered (state, period, trigger source, burst mode, cycle count, carrier settings, delay). This distinguishes it from sibling get_* tools like get_basic_wave or get_modulation, and from configure_burst which is the write counterpart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for querying burst settings but does not explicitly state when to use this tool versus configure_burst or other get_* tools. There is no mention of alternatives or conditions for use, so it earns an average score for implied but not explicit guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_modulationARead-only
Get the modulation parameters of a channel. Returns all modulation settings including type, source, frequency, depth/deviation, and carrier parameters.
| Name | Required | Description | Default |
|---|---|---|---|
| channel | Yes | Channel to query |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the description only needs to add context about behavior. It does so by listing what settings are returned ('type, source, frequency, depth/deviation, and carrier parameters'), which goes beyond the annotation. No contradictions or missing safety information are apparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that immediately states the purpose and then provides a concise list of returned content. Every clause adds value, and there is no redundant or extraneous language.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter getter with a provided readOnly annotation, the description is sufficiently complete: it specifies the resource, the channel parameter, and the categories of returned settings. No output schema exists, but the description gives an adequate high-level overview of the return value, which is all that is needed for this low-complexity tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% (the 'channel' parameter is described as 'Channel to query'), so the baseline is 3. The description does not add additional parameter semantics beyond restating 'channel', so it earns the baseline without exceeding it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Get') and resource ('modulation parameters of a channel'), making the tool's function unambiguous. It also enumerates the exact settings returned (type, source, frequency, depth/deviation, carrier), which further distinguishes it from sibling getters like get_basic_wave or get_sweep.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies this tool is for reading modulation settings, and given the sibling list includes configure_modulation (the write counterpart), the use case is clear. It does not explicitly state 'when to use' or alternatives, but there are no alternative read tools for modulation, so the context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_outputARead-only
Get the output state of a channel, including on/off status, load impedance, and polarity.
| Name | Required | Description | Default |
|---|---|---|---|
| channel | Yes | Channel to query |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the description does not need to cover safety. It adds value by listing the specific fields returned, but does not detail return format, error behavior, or other behavioral aspects. This aligns with a baseline of 3 for tools with annotations and partial added context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that front-loads the action and object, with no wasted words. It conveys the necessary information efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one parameter, read-only, no output schema), the description is complete. It specifies what is returned and the scope (channel). The annotations cover the read-only nature, and the schema covers parameter details, so no further information is needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has a 100% description coverage for the single parameter 'channel', with a clear description and enum values. The tool description adds no further semantic meaning beyond what the schema already provides, so a baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly specifies the action ('Get'), the resource ('output state of a channel'), and the specific attributes returned (on/off status, load impedance, polarity). It is easily distinguished from sibling tools like configure_output, which would set these values.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this tool is for reading the current output state of a channel, which is clear given the name and the sibling tool 'configure_output' for writing. However, it does not explicitly state when to use this instead of other getters or mention exclusions, but the context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sweepARead-only
Get the sweep parameters of a channel, including state, time, start/stop frequencies, sweep mode, direction, trigger source, carrier settings, and marker.
| Name | Required | Description | Default |
|---|---|---|---|
| channel | Yes | Channel to query |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already communicates that this is a safe read operation. The description adds value by listing the sweep parameters returned, which is helpful given there is no output schema. However, it does not elaborate on possible error conditions, exact return format, or any other behavioral details beyond the field list, so it is adequate but not exceptional.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that is front-loaded with the core purpose ('Get the sweep parameters of a channel') and then lists the specific parameters. It contains no filler, redundancy, or irrelevant information, making it highly concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that there is only one parameter and no output schema, the description gives a good overview of what will be returned by enumerating the sweep parameter fields. It could be more explicit about the return structure or units, but for a straightforward read-only getter, it is sufficiently complete for an agent to understand the tool's behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema fully describes the single 'channel' parameter with an enum and a clear description ('Channel to query'), so the schema description coverage is 100%. The tool description does not need to add parameter details, and the baseline of 3 applies because the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function with a specific verb ('Get') and resource ('sweep parameters of a channel'), and enumerates the major fields included (state, frequencies, mode, direction, trigger source, etc.). This makes it easily distinguishable from sibling tools like configure_sweep (set) and other get_* tools (which target different resources).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not explicitly state when to use this tool versus alternatives, such as configuring sweep with configure_sweep. The usage is implied by the 'get' verb and the presence of a corresponding configure tool, but no explicit comparison or exclusion is provided. This falls under implied usage, which aligns with a score of 3.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
identifyARead-only
Query the waveform generator identification (*IDN?). Returns manufacturer, model, serial number, and firmware version.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already indicates this is a safe read operation. The description adds value by specifying the exact return fields (manufacturer, model, serial, firmware) and the SCPI command, providing context beyond the annotation. It does not contradict annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that front-loads the action and includes essential details (SCPI command and return data). Every word contributes value with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (no parameters, read-only, no output schema), the description fully covers what the tool does and what it returns. It is complete for an agent to select and invoke this tool correctly, even among many siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has no parameters, and schema coverage is 100% (empty schema matches no-parameter invocation). Per the baseline for zero-parameter tools, a score of 4 is appropriate, as there is nothing additional to explain about parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states the tool performs a query for waveform generator identification using the *IDN? command, which clearly distinguishes it from sibling tools like get_output or configure_output. It also lists the specific data returned (manufacturer, model, serial, firmware), making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by stating it queries identification, which is clearly the tool for retrieving device identity. While it does not explicitly mention alternatives or exclusions, no sibling tool serves this purpose, so the context is clear and no additional guidance is necessary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resetA
Reset the waveform generator to factory default settings (*RST).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only provide readOnlyHint=false, indicating a mutation. The description beyond that reveals the SCPI command and that it resets to factory defaults, but does not mention potential side effects such as losing current settings or affecting all channels. Since annotations are minimal, the description carries the burden, yet it adds limited behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that directly states the purpose including the SCPI command. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given there are no parameters and no output schema, the description covers the basic function. It could mention side effects like all settings being overwritten, but for a simple reset command it is sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has no parameters, and the input schema is empty. The baseline is 4 because no parameter documentation is needed. The description appropriately omits parameter details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'reset', the target 'waveform generator', and the result 'to factory default settings'. It also includes the SCPI command (*RST) for precision. This is distinct from any sibling tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus alternatives. The description simply states what it does without context on preferability or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scpi_commandA
Send an arbitrary SCPI command to the waveform generator (no response expected). Use this as an escape hatch for commands not covered by other tools.
| Name | Required | Description | Default |
|---|---|---|---|
| command | Yes | SCPI command to send (e.g. '*RST', 'C1:OUTP ON', 'C1:BSWV WVTP,SINE') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations only providing readOnlyHint=false, the description adds valuable behavioral context: 'no response expected' clarifies the tool returns nothing, and 'arbitrary SCPI command' implies potential side effects. It doesn't warn about safety, but the readOnlyHint already signals mutation. This is solid transparency beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core action, and every clause earns its place. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool with no output schema, the description covers the essential context: what it does, when to use it, and the lack of response. The schema covers input format, so the description is fully sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema fully documents the only parameter 'command' with examples (100% coverage). The description adds no additional parameter meaning beyond the schema, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Send') and resource ('arbitrary SCPI command to the waveform generator'), clearly stating the tool's action. It also distinguishes itself from siblings by explicitly noting 'no response expected' and framing as an escape hatch for commands not covered by other tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use guidance: 'Use this as an escape hatch for commands not covered by other tools.' It also implies when-not-to-use by noting 'no response expected,' distinguishing it from scpi_query. However, it does not name the alternative sibling explicitly, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scpi_queryARead-only
Send an arbitrary SCPI query to the waveform generator and return the response. Use this as an escape hatch for commands not covered by other tools. Note: CHDR is set to OFF, so responses contain only values (no headers).
| Name | Required | Description | Default |
|---|---|---|---|
| command | Yes | SCPI query command to send (e.g. '*IDN?', 'C1:BSWV?', 'C1:OUTP?') | |
| timeout_ms | No | Timeout in milliseconds (default 5000) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=true, which sets the safety baseline. The description adds a valuable behavioral detail by noting CHDR is OFF, so responses contain only values without headers. However, it does not mention potential errors from malformed arbitrary commands or timeout behavior, which is a moderate gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, each serving a distinct purpose: purpose, usage, and an important response-format caveat. It is front-loaded and free of redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity, the description covers the essential aspects: what it does, when to use it, and a key response-format nuance. With readOnlyHint and full schema coverage, it is fairly complete for an escape-hatch tool, though it could mention error behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both command and timeout_ms documented with examples. The description does not add further parameter-specific details beyond what the schema provides, so a baseline score is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Send an arbitrary SCPI query to the waveform generator and return the response,' specifying the verb, resource, and action. It distinguishes itself from siblings by positioning itself as an escape hatch for commands not covered by other tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly advises using this as an escape hatch for commands not covered by other tools, providing clear when-to-use context. It does not explicitly name alternatives like scpi_command for write commands, so it's not fully exhaustive but still offers solid guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_arbitrary_waveA
Set the arbitrary waveform for a channel by index number or by name. Use index for built-in waveforms (e.g. 2=StairUp, 18=Sinc, 26=Cardiac) or name for user-defined waveforms.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Name of the waveform (for user-defined waves, use quotes). Can also be a path like "Local/wave1.bin" | |
| index | No | Index of the built-in arbitrary waveform (0-198). Examples: 0=Sine, 2=StairUp, 10=ExpFal, 18=Sinc, 19=Gaussian, 26=Cardiac | |
| channel | Yes | Channel to configure |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotation readOnlyHint=false already indicates a mutation operation, and the description adds no further behavioral context. It does not mention side effects (e.g., overwriting the existing waveform), prerequisites, or persistence. The description essentially restates the tool's function without exposing additional behavioral traits beyond what the annotation provides.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the action and followed by concise usage examples. Every sentence adds value, with no redundant filler. It is exceptionally concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 3 parameters with only channel required. The description explains the two methods (index/name) but does not clarify that at least one of them must be provided or whether they are mutually exclusive. This is a significant gap because the schema allows omitting both, which would lead to an invalid call. The description otherwise covers the main usage well.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents each parameter with descriptions and examples. The tool description repeats some examples (2=StairUp, 18=Sinc, 26=Cardiac) and adds the index/name distinction, but this information is already present in the schema. The description adds marginal value, aligning with the baseline of 3 for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's action: 'Set the arbitrary waveform for a channel by index number or by name.' It names the resource (arbitrary waveform), the target (channel), and the two selection methods. While it doesn't explicitly differentiate from sibling tools like configure_basic_wave, the purpose is specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage guidance: 'Use index for built-in waveforms ... or name for user-defined waveforms.' This tells the agent exactly when to use each parameter. It doesn't discuss alternatives like get_arbitrary_wave, but it gives clear context for using this tool effectively.
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.
21 tool updates
v1.0.0- First observed
configure_basic_wave - First observed
configure_burst - First observed
configure_modulation - First observed
configure_output - First observed
configure_sweep - First observed
configure_sync - First observed
connect - First observed
copy_channel - First observed
disconnect - First observed
equal_phase - First observed
get_arbitrary_wave - First observed
get_basic_wave - First observed
get_burst - First observed
get_modulation - First observed
get_output - First observed
get_sweep - First observed
identify - First observed
reset - First observed
scpi_command - First observed
scpi_query - First observed
set_arbitrary_wave
TDQS
Scored across 21 tools
Each tool targets a distinct resource or action: connection management, identification, output control, basic wave, modulation, sweep, burst, arbitrary wave, reset, channel copy, sync, phase, and raw SCPI. The get/configure pairs are clearly separated by waveform function, and the two SCPI tools are explicit escape hatches.
Most tools follow a consistent verb_noun pattern with get_ and configure_ pairs (e.g., get_output/configure_output, get_sweep/configure_sweep). Minor deviations include set_arbitrary_wave instead of configure_arbitrary_wave, and equal_phase/copy_channel which don't follow the get/configure convention.
At 21 tools, the server is slightly above the ideal 3-15 range but remains reasonable given the feature-rich scope of a waveform generator (connection, output, multiple wave modes, arbitrary waves, sync, phase, SCPI). Some redundancy exists (identify vs connect returning IDN), but each tool covers a distinct capability.
The tool set provides comprehensive coverage of the waveform generator's core lifecycle: connection, identification, output configuration, basic wave, modulation, sweep, burst, arbitrary wave selection, synchronization, phase alignment, and reset. The inclusion of scpi_query and scpi_command as escape hatches ensures any unmodeled functionality is still accessible.
Maintenance
Related MCP Connectors
MCP server for Gainium — manage trading bots, deals, and balances via AI assistants
MCP server for Producer/Riffusion AI music generation
MCP server for AI dialogue using various LLM models via AceDataCloud
- mcpOAuthcom.gibsonai
GibsonAI MCP server: manage your databases with natural language
Related MCP Servers
- AlicenseAqualityDmaintenanceAn 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.135 npm7MIT
- AlicenseNot gradedqualityDmaintenanceMCP server for the JDS6600 signal generator, enabling vintage tape recorder calibration via auto-detection and advanced waveform controls.MIT
- AlicenseNot gradedqualityDmaintenanceAn MCP server that connects AI assistants to the Owon DS1102 oscilloscope, enabling waveform capture, measurement retrieval, and remote control of scope settings.GPL 3.0
- FlicenseNot gradedqualityCmaintenanceMCP server for controlling SIGLENT oscilloscopes and signal generators via USBTMC, enabling waveform generation, scope configuration, measurement, and evidence reporting for electronics competitions.1-