Rigol Oscilloscope

io.github.K-Dense-AI由 GitHub 帳號 K-Dense-AI 發布v0.1.2更新於 Oct 24, 2026

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

發布方自己的服務:Scope (AEC) - Preview

已驗證STDIO僅桌面開發者工具資料與分析

概覽

AI 產生的概覽

讓助理透過 SCPI 讀取 Rigol 示波器的設定、量測值、波形與螢幕截圖,並可調整通道、時基與觸發。

可以做什麼
透過 USB 或區域網路連接 Rigol DS1000Z、MSO5000 與 DHO 系列示波器,並使用 SCPI 通訊。讀取類工具可回報裝置型號與韌體、各通道/時基/觸發設定、自動量測值(Vpp、頻率、上升時間、工作週期)以及經過校正的波形擷取,還能儲存螢幕截圖。控制類工具可執行自動設定、設定通道、時基與邊緣觸發,並啟動、單次、強制或停止擷取。命令記錄會保留原始 SCPI 通訊內容。
適用情境
適合讓助理查看或操作實驗台上的示波器:讀取目前設定、進行量測、把波形存成 CSV,或截圖用於實驗紀錄。主要面向實驗室與硬體除錯情境,而非一般軟體工作。
執行需求
以 Python 套件形式在本機透過 stdio 執行(uvx labmcp-rigol-scope)。需要一台可透過 USB-TMC 或區域網路存取的 Rigol 示波器,並在 LABMCP_ADDRESS 填入儀器位址(serial:///dev/ttyUSB0 或 tcp://host:5025)。透過 pyvisa-py 使用 USB 時需安裝 libusb;Windows 上使用 NI-VISA 與 @ivi 後端。未宣告需要帳號或 API 金鑰。
安裝前請注意
控制類工具會改變儀器狀態:自動設定會覆寫目前設定,set_channel、set_timebase、set_trigger、run、single、stop 與 force_trigger 都會更動示波器。設定 LABMCP_READ_ONLY=1 可停用所有會改變狀態的工具。波形與截圖的儲存路徑必須是新檔案,不會覆寫既有檔案。專案說明僅在模擬器上測試過,尚未在真實硬體驗證。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Rigol Oscilloscope,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

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

來源:servers/engineering/rigol-oscilloscope/README.md,提交 46545ea

工具

0
SourceWeft 尚未在沙箱中啟動過該軟體包,因此其工具未知。

版本歷史

2
  1. v0.1.2最新Sep 27, 2026
  2. v0.1.0Sep 26, 2026

評分

已滿足適用檢查項的 50%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分

    請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。

  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分

其他 Scope 整合