Rigol Oscilloscope

io.github.K-Dense-AIPublished by GitHub account K-Dense-AIv0.1.2Updated Oct 24, 2026

MCP server for Rigol oscilloscopes (DS1000Z, MSO5000, DHO series): measurements and waveforms.

The publisher's own server: Scope (AEC) - Preview

VerifiedSTDIODesktop onlyDeveloper ToolsData & Analytics

Overview

AI-generated overview

MCP server that lets an assistant read, configure and capture from Rigol oscilloscopes over SCPI, including measurements, waveforms and screenshots.

What you can do
  • Read instrument identity, channel/timebase/trigger settings and the raw command log
  • Run, stop, single-shot and force-trigger acquisitions, plus autoscale and reconnect
  • Change channel vertical settings, timebase and edge trigger, with applied values returned
  • Take the scope's automatic voltage and timing measurements for a channel
  • Capture calibrated waveforms with statistics and optional CSV export, and save display screenshots
When to use it
Useful when an assistant should inspect or drive a Rigol DS1000Z, MSO5000 or DHO series scope on the bench: checking current setup, measuring a signal, scripting a single acquisition, or grabbing a screenshot for a lab notebook.
Requirements
Runs locally as a Python package (uvx labmcp-rigol-scope) over stdio. Needs a reachable instrument address via LABMCP_ADDRESS (USB-TMC, VXI-11/LXI or raw TCP), PyVISA with pyvisa-py, and libusb for USB. A built-in simulator is available with LABMCP_SIMULATE=1, so no hardware is needed to try it.
Before you install
Control tools change the instrument state: autoscale overwrites the current setup, and set_channel, set_timebase, set_trigger, run, stop and single alter the scope. Use LABMCP_READ_ONLY=1 to block state-changing tools. Waveform and screenshot save paths must be new files. The server is tested only against a simulator, not verified on hardware.

Installation

In SourceWeft

  1. Open Rigol Oscilloscope in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

Rigol Oscilloscope — MCP Server

Let an AI agent read the setup, adjust channels, timebase and trigger, run single acquisitions, take the scope's own measurements, capture calibrated waveforms and grab screenshots on Rigol digital oscilloscopes over SCPI.

Packagelabmcp-rigol-scope
InstrumentsDS1000Z / MSO1000Z (DS1054Z, DS1074Z, DS1104Z, MSO1104Z, "Plus" models), DS1000Z-E (DS1102Z-E, DS1202Z-E), MSO5000 (MSO5072 … MSO5354), DHO800 / DHO900 (DHO802, DHO804, DHO914, DHO924), DHO1000 / DHO4000 (DHO1072 … DHO4804)
InterfacesUSB (USB-TMC), LAN (VXI-11/LXI, raw socket)
ProtocolSCPI per Rigol's programming guides: MSO1000Z/DS1000Z PGA19109-1110, DS1000Z-E PGA27100-1110, MSO5000 PGA25104-1110, DHO800/DHO900, DHO1000/DHO4000 PGA34101-1110
Status🧪 simulated: tested against a wire-level SCPI simulator (including binary waveform and screenshot blocks), not yet verified on hardware. Report a hardware test

Try it without hardware

bash
uvx labmcp-rigol-scope --simulate --checkuvx labmcp-rigol-scope --simulate --option sim_model=DHO804 --check    # also DS1202Z-E, MSO5074, DHO1204 ...

The simulated scope has a 1 kHz, 0-3 V square wave on CH1 and a 2 kHz, 1 V sine on CH2 (CH3/CH4 grounded). It answers :WAVeform:DATA? and :DISPlay:DATA? with real IEEE 488.2 binary blocks, keeps an SCPI error queue, and its trigger only fires when the level is inside the signal, so you can try single with a bad trigger level.

Connect your oscilloscope

  1. USB: plug in the USB device port. The server uses PyVISA with the pure-Python pyvisa-py backend, which needs libusb on the system (brew install libusb, apt install libusb-1.0-0; on Windows use NI-VISA with ?backend=@ivi). Find the resource with python -m pyvisa info or uvx labmcp ports.
  2. LAN: in the scope's Utility I/O / LAN settings enable DHCP or set a static IP, and note the address.
  3. Test the connection:
    bash
    uvx labmcp-rigol-scope --address USB0::0x1AB1::0x04CE::DS1ZA123456789::INSTR --check   # USB-TMCuvx labmcp-rigol-scope --address TCPIP0::192.168.1.50::INSTR --check                   # LAN (VXI-11)uvx labmcp-rigol-scope --address tcp://192.168.1.50:5555 --check                        # LAN raw socket
    --check prints the *IDN? identity and the detected command family.

Add to your MCP client

Claude Code

bash
claude mcp add scope -- uvx labmcp-rigol-scope --address TCPIP0::192.168.1.50::INSTR

Claude Desktop / Cursor / Windsurf (claude_desktop_config.json, .cursor/mcp.json, …)

json
{  "mcpServers": {    "scope": {      "command": "uvx",      "args": ["labmcp-rigol-scope", "--address", "TCPIP0::192.168.1.50::INSTR"]    }  }}

Add --read-only to allow reading settings, measurements, waveforms and screenshots while blocking every tool that changes the scope setup. For other clients, generate the snippet with uvx labmcp config rigol-oscilloscope --address TCPIP0::192.168.1.50::INSTR --client vscode (also cursor, codex, claude-code).

Tools

ToolKindDescription
autoscale🎛 controlRun the scope's automatic setup (AUTO key): it picks vertical scales, timebase and trigger for the connected signals. This overwrites the user's current setup - only use it when asked. Needs signals of roughly >20 mVpp and >40 Hz.
capture_waveform👁 readCapture a channel's waveform, scaled to volts and seconds with the scope's waveform preamble, and return statistics plus a downsampled trace; optionally save all points to CSV.
force_trigger🎛 controlForce one trigger (FORCE key). Only has an effect in NORMal or SINGle sweep while waiting.
get_command_log👁 readReturn the most recent raw commands sent to / replies received from the instrument (newest last). Useful for debugging and for recording what was done.
get_connection_info👁 readReport which instrument is connected (identity, address, simulated or real), whether the server is read-only, and the active safety limits. Call this first.
get_device_info👁 readIdentify the oscilloscope (model, serial, firmware), the command family used for it, the number of analog channels, and the current sample rate and memory depth.
get_settings👁 readRead the current vertical settings of every channel (on/off, V/div, offset, coupling, probe ratio, bandwidth limit), the timebase, the trigger (type, sweep, status, edge source/level/slope) and the acquisition sample rate / memory depth.
measure👁 readRead the scope's automatic measurements for one channel: voltages (Vpp, Vmax, Vmin, Vtop, Vbase, Vamp, Vavg, Vrms, overshoot, preshoot) and timing (period, frequency, rise/fall time, +/- width, +/- duty). Values the scope cannot determine are null.
reconnect🛑 safetyClose and re-open the connection to the instrument (e.g. after it was power cycled or a cable was re-plugged).
run🎛 controlStart continuous acquisition (RUN).
screenshot👁 readSave a screenshot of the oscilloscope display (PNG; BMP on the MSO5000) and return its path. For PNG screenshots the image is also returned so the model can look at the screen.
set_channel🎛 controlChange a channel's vertical settings; unspecified settings are left alone. The probe ratio is applied first because it changes the valid scale range. Returns the settings the scope actually applied (the scale snaps to 1-2-5 steps). Rejected values are reported from the scope's error queue.
set_timebase🎛 controlSet the main timebase scale and/or offset. Returns the applied values.
set_trigger🎛 controlConfigure an edge trigger (source, level, slope) and the sweep mode. Sets the trigger type to EDGE. The level must lie within the source channel's screen range.
single🎛 controlArm a single acquisition (SINGLE key): the scope triggers once, then stops. With wait_s > 0 it waits until the acquisition is complete (status STOP). If the trigger condition is never met the status stays WAIT - check the trigger level/source or use force_trigger.
stop🎛 controlStop acquisition (STOP) and freeze the current waveforms, e.g. before reading deep memory.

get_connection_info, get_command_log and reconnect are built into every LabMCP server. The command log shows every SCPI command sent.

Safety limits

LimitDefaultMeaning
max_memory_points1 200 000 pointsMost points read from acquisition memory in one capture (bounds transfer time)

Override at launch, e.g. --limit max_memory_points=24000000. An oscilloscope does not source energy, so there are no hazard tools; this server does not control the built-in waveform generator some models have.

Example prompts

  • "What is on the scope right now? Give me the channel settings, timebase and trigger."
  • "Measure the frequency, Vpp and rise time on CH1."
  • "Set CH2 to 200 mV/div, AC coupling, trigger on CH2 falling edge at 0 V, then take a single shot and save the full memory record to ~/data/burst.csv."
  • "Capture the CH1 waveform from the screen and tell me the duty cycle and whether the trace is clipped."
  • "Take a screenshot of the scope so I can put it in my lab notebook."

Notes

  • One driver, three command families. Commands common to all guides are used as written (long forms, e.g. :TRIGger:EDGE:LEVel, :MEASure:ITEM? VPP,CHANnel1, :WAVeform:PREamble?). The differences are taken from each guide: autoscale is :AUToscale (DS1000Z, MSO5000) or :AUToset (DHO); screenshots are :DISPlay:DATA? ON,OFF,PNG (DS1000Z), :DISPlay:DATA? PNG (DHO) or :DISPlay:DATA? → BMP (MSO5000); screen captures return 1200 points (DS1000Z, 12 divisions) or 1000 (MSO5000/DHO, 10 divisions). The family is detected from *IDN?; unknown Rigol models are refused unless you force --option profile=DS1000Z|MSO5000|DHO.
  • Waveform scaling always uses :WAVeform:PREamble? and BYTE format: volts = (byte − YORigin − YREFerence) × YINCrement. WORD format is not used because the DHO guides do not document its byte order. For the 12-bit DHO scopes this means 8-bit screen/memory data.
  • Deep memory (mode="memory") follows the documented RAW procedure: stop the scope, then read in batches of 250 000 points with :WAVeform:STARt/STOP (the DS1000Z maximum for BYTE). The MSO5000 and DHO guides document batched reads but not a maximum; the server checks every batch length and fails clearly if a batch comes back short. Not yet verified on MSO5000/DHO hardware.
  • Captures hold the connection from source selection to the last byte, then re-read the preamble: if V/div or the timebase changed during the read, the capture is refused rather than mis-scaled. clipped_fraction counts points at the ADC limits (codes 0/255) in both modes. The returned trace keeps each block's minimum and maximum sample, so narrow glitches survive downsampling. save_path (CSV) and the screenshot save_path (.png, .bmp on the MSO5000) must be new files: they are checked before anything is read, and existing files are never overwritten.
  • Measurements return null when the scope answers 9.9E37 (cannot measure). Duty cycle and overshoot are reported exactly as the scope returns them (the DS1000Z guide defines duty as a ratio).
  • Setting commands are checked by reading :SYSTem:ERRor? afterwards, so an out-of-range scale, offset or trigger level is reported instead of silently ignored. The scale snaps to 1-2-5 steps unless fine adjustment (VERNier) is on.
  • LAN: the programming guides describe LAN access through VISA (VXI-11/LXI, TCPIP0::<ip>::INSTR). Rigol scopes also accept raw SCPI on TCP port 5555 (tcp://<ip>:5555); that port is widely used but not stated in these guides.
  • USB additionally needs libusb for pyvisa-py; pyusb is installed with this package.
  • Screenshots are returned as MCP image content only for PNG; large BMP screenshots (MSO5000) are saved to disk and the path is returned.

Hardware verification

ModelFirmwareInterfaceVerified byDate
none yet: be the first

Source: servers/engineering/rigol-oscilloscope/README.md at commit 46545ea

Tools

0
SourceWeft has not started this package in its sandbox yet, so its tools are not known.

Version history

2
  1. v0.1.2LatestSep 27, 2026
  2. v0.1.0Sep 26, 2026

Score

50% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts

    Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.

  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listed15 pts

    Answer tools/list without a credential, or ship a package that starts in a sandbox without one.

  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts

Other Scope integrations