RIGOL MHO98 MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| RIGOL_USB | Yes | Set to '1' to enable USB connection to the oscilloscope. | |
| RIGOL_OUTPUT_DIR | Yes | Absolute path to the directory where screenshots, CSV files, and other output will be saved. | |
| RIGOL_USB_SERIAL | Yes | The serial number of the MHO98 oscilloscope to connect to. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| screenshotA | Capture a screenshot of the oscilloscope display. Returns the image and the absolute path where the PNG was saved. This is a fallback, not the primary way to read the scope: for numeric readings use measure/measure_between and for trace data use get_waveform — they return compact structured text that is faster and cheaper to reason over than an image. Reach for screenshot only when a genuinely visual check is needed (on-screen menus/UI state, cursor placement, display rendering, or confirming what a human sees). Do not call concurrently with any other rigol tool. |
| idnA | Identify the instrument and report connection details. Always returns the connection block (transport, RIGOL_USB/RIGOL_IP env vars, backend hint, resource string, session state, and the detected dialect driver — DS1000Z, DHO, …) followed by the scope's *IDN? string. If the *IDN? query fails, the connection block is still returned with the error — use it to spot LAN-vs-USB misconfig or an unreachable IP before assuming the scope itself is the problem. Call this first to verify connectivity and confirm the correct driver was selected. Do not call concurrently with any other rigol tool. |
| get_scope_stateA | Return a snapshot of the scope's current configuration: active channels (scale, offset, coupling, probe), timebase, and trigger. Call this at the start of a session to understand the current setup. Do not call concurrently with any other rigol tool. |
| set_channelA | Configure a channel. Only specified parameters are changed. channel: CHAN1–CHAN4. scale_v_div: V/div. offset_v: volts. coupling: AC, DC, or GND. probe: attenuation ratio (1, 10, 100, …). Parameter names match get_scope_state output for easy round-tripping. Returns the resulting channel configuration. Do not call concurrently with any other rigol tool. |
| set_timebaseA | Set the horizontal timebase. scale_s_div: seconds per division (e.g. 0.001 for 1 ms/div). offset_s: shifts the display window; time_start = offset_s − 6×scale_s_div, time_end = offset_s + 6×scale_s_div. Trigger (t=0) is always a zero crossing when using edge trigger. To align the right edge to a zero crossing at time T: set offset_s = T − 6×scale_s_div. To put the trigger at the left edge of the screen: set offset_s = +6×scale_s_div. Parameter names match get_scope_state output for easy round-tripping. Returns the resulting timebase configuration. Do not call concurrently with any other rigol tool. |
| set_triggerA | Configure edge trigger. source: CHAN1–CHAN4 or EXT. slope: POS (rising), NEG (falling), or RFAL (either). level: trigger level in volts. Returns the resulting trigger configuration. Do not call concurrently with any other rigol tool. |
| measureA | Query a single-source built-in measurement on a channel. Preferred over screenshot for reading values — numeric results are cheaper and easier to analyse than an image. For stable readings: on DS1000Z, stop acquisition first. On DHO, keep acquisition running — the DHO measurement engine only populates item values from live acquisitions; some items (VMAX/VMIN/VTOP/FREQUENCY/…) return 9.9E37 if first queried on a stopped scope. channel: CHAN1–CHAN4. item: VMAX, VMIN, VPP, VTOP (pulse top flat level, histogram-derived — not the same as VMAX), VBASE (pulse base flat level — not the same as VMIN), VAMP (=VTOP−VBASE — not the same as VPP=VMAX−VMIN), VAVG, VRMS (RMS over screen window), PVRMS (RMS over one period), VUPPER/VMID/VLOWER (timing thresholds at 90%/50%/10% of VAMP by default), VARIANCE (statistical variance of voltage samples), FREQUENCY, PERIOD, PWIDTH, NWIDTH, PDUTY, NDUTY, RTIME, FTIME, OVERSHOOT, PRESHOOT, PSLEWRATE, NSLEWRATE (slew rate, V/s), TVMAX, TVMIN (time position at which VMAX/VMIN occurs), MAREA (waveform area, V·s over screen window), MPAREA (area per period, V·s), PPULSES, NPULSES, PEDGES, NEDGES. A return value of 9.9E37 is the scope's invalid/overflow sentinel — it means the measurement could not be computed (e.g. FREQUENCY returns 9.9E37 when the timebase is too narrow to show a complete cycle; widen scale and retry); such values come back annotated as invalid/overflow. If the channel's display is OFF it is auto-enabled first (noted in the result). For delay or phase between two channels use measure_between. Do not call concurrently with any other rigol tool. |
| measure_betweenA | Query a two-source delay or phase measurement between two channels. source1 is the reference channel, source2 is the measured channel. DS1000Z items: RDELAY (rising-edge delay, seconds), FDELAY (falling-edge delay, seconds), RPHASE (rising-edge phase, degrees), FPHASE (falling-edge phase, degrees). DHO series exposes a 4-way matrix: RRDELAY/RFDELAY/FRDELAY/FFDELAY and RRPHASE/RFPHASE/FRPHASE/FFPHASE (first letter = source1 edge, second = source2 edge). On DHO the DS1000Z names are auto-mapped to their homogeneous equivalents (RDELAY→RRDELAY, FDELAY→FFDELAY, RPHASE→RRPHASE, FPHASE→FFPHASE). For stable readings: on DS1000Z, stop acquisition first. On DHO, keep acquisition running (see |
| get_waveformA | Download and analyse the current waveform for a channel (NORM screen buffer, up to ~1000–1200 points depending on scope). Preferred over screenshot for inspecting the trace — the text analysis is cheaper and easier to reason over than an image. Stop or single-trigger the scope first for consistent data. By default returns a plain-text analysis: signal shape, frequency/period, amplitude, DC offset, cycle count, and data-quality warnings (e.g. mid-cycle edges, invalid frequency). Amplitude is judged against the channel's V/div: a trace filling under ~10% of the vertical screen is flagged as noise floor and its shape/frequency are not reported, and one filling under ~20% gets a low-amplitude warning (reduce V/div and re-capture for a clean signal). Set raw_data=true to get the full time/voltage JSON arrays instead. If the channel's display is OFF it is auto-enabled first (flagged in the warnings). After reading, act on any warnings — if FREQUENCY would be 9.9E37 widen the timebase; if edges are not near the DC mean, adjust offset so right edge = N×(period/2) − 6×scale. Do not call concurrently with any other rigol tool. |
| set_cursorsA | Set cursor mode and/or X positions. mode: OFF, MANUAL (fixed time positions, reads voltage at those X points), TRACK (cursors snap to and follow the waveform at the X position). Omit mode to keep current mode. ax/bx: cursor A/B time positions in seconds. Returns the resulting cursor readouts. Do not call concurrently with any other rigol tool. |
| get_cursor_valuesA | Read current cursor mode and all cursor readouts. AX_s and BX_s are time positions in seconds. inv_delta_x is 1/Δt — the frequency between the two cursors. Do not call concurrently with any other rigol tool. |
| check_errorA | Query the SCPI error queue. Returns the error if present, or 'No error' if clear. Do not call concurrently with any other rigol tool. |
| runA | Start continuous acquisition. Returns trigger status after the command. Do not call concurrently with any other rigol tool. |
| stopA | Stop acquisition and freeze the display. Use before reading measurements or cursors for stable values. Returns trigger status after the command. Do not call concurrently with any other rigol tool. |
| singleA | Arm the scope for a single acquisition; stops automatically after one trigger event. Returns trigger status. Note: acquisition does not complete until a trigger occurs — call stop or check trigger status before reading measurements. Do not call concurrently with any other rigol tool. |
| autoscaleA | Run the scope's auto-setup (timebase, vertical scale, trigger). Takes a few seconds; call get_scope_state afterwards to see the resulting configuration. Do not call concurrently with any other rigol tool. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 16 tools
Each tool targets a distinct function: acquisition control (run/stop/single/autoscale), configuration (set_channel/set_timebase/set_trigger), measurement (measure/measure_between), data retrieval (get_waveform/get_scope_state/get_cursor_values), and utilities (idn/check_error/screenshot). Even similar tools like run/stop/single are clearly differentiated by their descriptions.
All tools use snake_case with clear verb prefixes (get_, set_, check_, measure_) and action verbs (run, stop, single, autoscale). Minor inconsistency: some tools are single verbs without object nouns, but the pattern is predictable and readable.
16 tools is slightly above the ideal range but justified for a complex oscilloscope with acquisition, configuration, measurement, and diagnostic capabilities. Each tool has a defined role and none are redundant.
The surface covers all core oscilloscope workflows: acquisition, channel/timebase/trigger configuration, single and between-channel measurements, waveform capture, cursor operations, and diagnostics. Minor gaps like non-edge trigger types (e.g., pulse, video) exist but are not essential for basic usage.