LeCroy Oscilloscope MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| scope_helpA | Look up LeCroy SCPI documentation by topic. Call with no argument (or topic="") to see the list of available topics. Args: topic: One of: overview, channel, timebase, trigger, acquisition, measurement, waveform, math, cursor, screenshot, system. Leave empty to list all topics. Transport: local |
| scope_list_resourcesA | List all VISA instrument resources visible on this computer (LAN and USB). Use this to find the resource string for scope_connect. A LAN-connected LeCroy typically appears as: TCPIP0::192.168.1.111::inst0::INSTR A USB-connected LeCroy typically appears as: USB0::0x05FF::0x1023::::INSTR If nothing appears, try scope_scan to search the network directly. Transport: local |
| scope_scanA | Scan the network for LeCroy oscilloscopes. More reliable than scope_list_resources for LAN-connected scopes — probes each host directly rather than relying on broadcast discovery. Scans all hosts in the subnet for port 111 (VXI-11 portmapper) in parallel, then queries *IDN? on responsive hosts and filters for LeCroy instruments. Args: subnet: CIDR subnet to scan, e.g. '192.168.1.0/24'. Defaults to LECROY_SUBNET env var if set, otherwise auto-detected from the local network interface. Transport: local (TCP socket probe + SCPI *IDN? per candidate) |
| scope_connectA | Connect to the LeCroy oscilloscope at the given VISA resource address. Args: resource_string: VISA address, e.g. 'TCPIP0::192.168.1.111::inst0::INSTR' Returns the IDN string on success. Transport: local (opens VISA session, then queries *IDN? via SCPI) |
| scope_disconnectA | Disconnect from the oscilloscope. Safe to call even if not connected. Transport: local |
| scope_connection_statusA | Check whether the server has an active VISA connection and identify the scope. Transport: local (connection check) + SCPI (*IDN? if connected) |
| scope_capabilitiesA | Return the detected model profile for the connected oscilloscope. Shows family name, channel count, bandwidth, ADC resolution, supported coupling values, bandwidth-limit values, memory depth, math channels, and which optional features (invert, unit, SARA) are available. Connect with scope_connect first; the profile is detected from *IDN?. Transport: local (reads cached profile set during scope_connect) |
| scope_queryA | Send any SCPI query command and return the response. Escape hatch for SCPI commands not covered by dedicated tools. Use dedicated tools whenever one exists — they handle edge cases, model differences, and response parsing correctly. Do NOT use this to send raw VBS strings; use scope_wavesource_* and other VBS-backed tool groups instead. Args: command: SCPI query string, e.g. 'C1:VDIV?' or 'TRMD?' Transport: SCPI |
| scope_writeA | Send any SCPI write command (no response expected). Escape hatch for SCPI commands not covered by dedicated tools. Use dedicated tools whenever one exists — they handle edge cases, model differences, and response parsing correctly. Do NOT use this to send raw VBS strings; use scope_wavesource_* and other VBS-backed tool groups instead. Args: command: SCPI command string, e.g. 'C1:VDIV 0.5' or 'TRIG_MODE AUTO' Transport: SCPI |
| scope_identifyA | Query the oscilloscope identification string (*IDN?). Returns make, model, serial number, and firmware version. Transport: SCPI |
| scope_resetA | Reset the oscilloscope to factory defaults (*RST). WARNING: This clears all waveforms, measurements and settings. Transport: SCPI |
| scope_auto_setupB | Run AUTO_SETUP to automatically scale vertical, horizontal and trigger. The scope will adjust all settings to best display the connected signals. Transport: SCPI |
| scope_calibrateA | Run self-calibration (*CAL?) and return the result status. Transport: SCPI |
| scope_get_dateA | Query the oscilloscope internal date and time. Transport: SCPI |
| scope_beepA | Trigger the oscilloscope audible beeper. Useful for confirming operations. Transport: SCPI |
| scope_set_panel_lockA | Lock or unlock the oscilloscope front-panel controls. Args: locked: True to lock (prevent accidental adjustment), False to unlock. Transport: SCPI |
| scope_channel_infoA | Get all current settings for a channel in one call. Returns vertical scale, offset, coupling, bandwidth limit, invert, trace visibility, unit, and configured probe (from LECROY_PROBE_Cn env var). Args: channel: Channel number 1–4 Transport: SCPI |
| scope_configure_channelA | Configure one or more settings for a channel in a single call. All parameters except channel are optional — only the provided ones are applied. Probe attenuation (ATTN) is set automatically from the LECROY_PROBE_Cn environment variable at connect time and cannot be changed here — it reflects the physical probe and is the engineer's responsibility. Args: channel: Channel number 1–4 vdiv: Vertical scale in V/div, e.g. 0.1 = 100 mV/div, 1.0 = 1 V/div offset: Vertical offset in volts (positive shifts trace down) coupling: D1M (DC 1MΩ), D50 (DC 50Ω), A1M (AC 1MΩ), or GND bwlimit: Bandwidth limit: OFF (full BW), 20MHZ, 200MHZ. High-BW models also support 500MHZ, 1GHZ, etc. Use scope_capabilities to see valid values for the connected scope. invert: True to invert the signal polarity, False for normal trace: True to show the channel trace, False to hide it unit: Vertical unit: V (volts), A (amperes), W (watts), U (user) Transport: SCPI |
| scope_timebase_infoA | Get all current timebase settings in one call. Returns time/div, trigger delay, sample rate, and memory size. Transport: SCPI |
| scope_set_tdivA | Set the time base (time per division). Args: seconds_per_div: Time/div in seconds. Examples: 1e-9 (1 ns), 1e-6 (1 µs), 1e-3 (1 ms), 1.0 (1 s) Transport: SCPI |
| scope_set_trigger_delayA | Set the trigger delay (horizontal position offset). Args: seconds: Delay in seconds. Positive = trigger point moves left, negative = trigger point moves right. Transport: SCPI |
| scope_set_memory_sizeA | Set the acquisition memory depth (record length). Args: size: Memory depth — one of: 500, 1K, 10K, 25K, 50K, 100K, 250K, 500K, 1M, 2.5M, 5M, 10M, 25M. Available sizes are model-dependent; WaveSurfer 3000Z maximum is 10M. Larger = more detail, slower transfer. Transport: SCPI |
| scope_trigger_infoA | Get all current trigger settings in one call. Returns trigger mode, source/type configuration, and level per channel. Transport: SCPI |
| scope_configure_triggerA | Configure trigger mode, source, slope, and/or level in a single call. All parameters are optional — only the provided ones are applied. For complex trigger types (pulse width, window, TV, etc.) use scope_write. If level is provided without source, it is applied to C1. To set the level on a different channel, always pass source together with level. Args: mode: Trigger mode: AUTO (free-running), NORM (wait for trigger), SINGLE (one capture then stop), STOP (stop acquisition) source: Trigger source: C1, C2, C3, C4, EX, EX5, or LINE slope: Edge slope: POS (rising), NEG (falling), or EITHER level: Trigger threshold in volts Transport: SCPI |
| scope_force_triggerA | Force an immediate trigger event (FRTR). Useful when in NORM mode and the signal hasn't triggered yet. Transport: SCPI |
| scope_armA | Arm the trigger (ARM). Start waiting for a trigger event. Use scope_get_acquisition_status to poll for completion. Transport: SCPI |
| scope_stopB | Stop acquisition immediately (STOP). Transport: SCPI |
| scope_get_acquisition_statusA | Query the current acquisition and trigger state. Returns the trigger mode (TRMD?) and internal state register (INR?). INR bit 0 set (value & 1 == 1) means a new waveform was acquired since the last INR read. Note: SAMPLE_STATUS? is not supported on WS3000Z. Transport: SCPI |
| scope_setup_measurementsA | Configure the scope's measurement panel (P1–P6) for a channel. PAVA measurements only return valid values for parameters that are active in one of the six display slots. Call this once after connecting to a channel with a new signal. The scope_measure and scope_measure_all tools will also auto-configure if they detect an invalid result, but calling this explicitly sets up the display panel for that channel. Args: channel: Channel number 1–4 params: List of up to 6 parameter names to show in the panel. Defaults to ['PKPK', 'FREQ', 'MEAN', 'RMS', 'RISE', 'DUTY']. Valid names: MEAN MAX MIN PKPK FREQ PERIOD RMS RISE FALL WIDTH DUTY BASE TOP AMPL OVSP UNDSP PHASE DELAY AREA Transport: SCPI (PACU) |
| scope_measureA | Get a single automated measurement from a channel. Args: channel: Channel number 1–4 param: One of: MEAN — mean (average) voltage MAX — maximum voltage MIN — minimum voltage PKPK — peak-to-peak voltage FREQ — frequency PERIOD — period RMS — RMS voltage RISE — rise time (10%–90%) FALL — fall time (90%–10%) WIDTH — pulse width (positive) DUTY — duty cycle BASE — base voltage level TOP — top voltage level AMPL — amplitude (top – base) OVSP — overshoot (positive) UNDSP — undershoot PHASE — phase difference DELAY — delay AREA — area under curve Returns the value with units as reported by the oscilloscope. Transport: SCPI (PAVA) |
| scope_measure_allA | Get all automated measurements for a channel in one call. Queries MEAN, MAX, MIN, PKPK, FREQ, PERIOD, RMS, RISE, FALL, WIDTH, DUTY, BASE, TOP, AMPL, OVSP, UNDSP, PHASE, DELAY, AREA. Args: channel: Channel number 1–4 Transport: SCPI (PAVA) |
| scope_set_mathA | Define a math waveform function. Available operators (all MAUI scopes): Arithmetic: ABS(C1) absolute value INVERT(-C1) negation SQR(C1) square SQRT(C1) square root RECIPROCAL(C1) 1/x RESC(C1) rescale (scale + offset + change units) C1+C2 sum of two channels C1-C2 difference C1*C2 product C1/C2 ratio Signal processing: FFT(C1) Fast Fourier Transform — use TYPE parameter to select POWERSPECTRUM (dBm), MAGNITUDE, PHASE, REAL, IMAGINARY. WINDOW options: VONHANN, HAMMING, FLATTOP, BLACKMANHARRIS, RECTANGULAR. Example: EQN,"FFT(C1)",TYPE,POWERSPECTRUM,WINDOW,VONHANN INTG(C1) integral DERI(C1) derivative (adjacent-sample subtraction) AVG(C1) averaging — add AVERAGETYPE,SUMMED or CONTINUOUS ERES(C1) enhanced resolution (smoothing, 0.5–3 extra bits) Envelope / extrema: FLOOR(C1) minimum value at each X over N sweeps ROOF(C1) maximum value at each X over N sweeps Parameter-based (use a measurement parameter Pn as source): TREND(P1) trend plot of parameter values over time HIST(P1) histogram of parameter values Display only: ZOOMONLY(C1) zoom display without computation After setting an FFT, use scope_set_math_zoom to zoom the frequency axis. Args: func: Math function number 1–4 equation: Math expression string, e.g. 'FFT(C1)' or 'C1+C2' Transport: SCPI |
| scope_set_math_traceB | Show or hide a math function trace. Args: func: Math function number 1–4 visible: True to show, False to hide Transport: SCPI |
| scope_math_infoA | Get the definition and display state of a math function. Args: func: Math function number 1–4 Transport: SCPI |
| scope_set_math_zoomA | Set the horizontal display zoom for a math trace. Useful for zooming into a specific frequency range on an FFT trace without changing the FFT computation itself. Units depend on the math function type:
Args: func: Math function number 1–4 center: Center value (Hz for FFT, seconds for time-domain math) per_div: Scale per division Transport: VBS (app.Math.Fn.Zoom.HorCenter, app.Math.Fn.Zoom.HorScale) |
| scope_math_zoom_infoA | Read the current horizontal zoom settings for a math trace. Args: func: Math function number 1–4 Transport: VBS (app.Math.Fn.Zoom.HorCenter, app.Math.Fn.Zoom.HorScale) |
| scope_store_waveformB | Store a waveform to internal memory. Args: source: Waveform to store — 'C1', 'C2', 'C3', 'C4', 'F1'–'F4' slot: Memory slot 1–4 Transport: SCPI |
| scope_recall_waveformA | Recall a waveform from internal memory. Args: slot: Memory slot 1–4 to recall from dest: Destination, e.g. 'C1' (overlays the recalled waveform on C1) Transport: SCPI |
| scope_cursor_infoA | Query current cursor measurements from the oscilloscope. Transport: SCPI |
| scope_set_cursor_typeA | Set the cursor type. Args: cursor_type: HREL (relative horizontal), VREL (relative vertical), HREF (absolute horizontal), VREF (absolute vertical), or OFF to disable cursors. Transport: SCPI |
| scope_screenshotA | Capture the oscilloscope screen and save as a timestamped image file. Files are always saved to a 'screenshots/' subfolder with an auto-generated filename, e.g.: screenshots/scope_20260329_153042.png The full path is returned so you know exactly where the file landed. Args: image_format: BMP, JPEG, PNG, or TIFF (default PNG) area: DSOWINDOW (default), GRIDAREAONLY, or FULLSCREEN background: WHITE (default) or BLACK to preserve the dark screen theme Transport: SCPI (HARDCOPY_SETUP + SCREEN_DUMP, binary read) |
| scope_get_waveformA | Capture waveform data from a channel and save it as a .npz file. Use this when you need the time-domain signal (plotting, export, detailed analysis). For scalar results like peak voltage, frequency, or RMS, prefer scope_measure — it is faster and uses all scope points without any transfer. If the scope is already stopped (e.g. from a previous capture), arms it first and waits for a fresh acquisition before reading. Always leaves the scope stopped after capture so the on-screen waveform matches the file. Saves to a 'waveforms/' subfolder with an auto-generated filename, e.g.: waveforms/C1_20260329_153042.npz Returns JSON with the file path and metadata — the raw voltage values are not embedded in the result. Load the file in Python with: import numpy as np d = np.load('/path/to/file.npz') time_s, voltage_v = d['time_s'], d['voltage_v'] Args: channel: Channel number 1–4 max_points: Maximum samples to capture (default 10000, evenly downsampled). Transport: SCPI (binary WF? DAT1 transfer + INSPECT? WAVEDESC scaling) |
| scope_capture_channelsA | Capture multiple channels atomically and save to a single .npz file. Use this when you need time-domain signals from multiple channels (plotting, cross-channel analysis, export). For scalar results like peak voltage or frequency, prefer scope_measure — no waveform transfer needed. If the scope is already stopped (e.g. from a previous capture), arms it first and waits for a fresh acquisition before reading. All channels are read within a single VISA lock hold so the waveforms come from the same snapshot. Always leaves the scope stopped after capture. Saves to 'waveforms/' with an auto-generated filename, e.g.: waveforms/C3F1_20260329_153042.npz The .npz file contains arrays: time_s, c3, f1, ... (one per channel). Analog channels use keys like c1, c2; math channels use f1, f2, etc. Load in Python with: import numpy as np d = np.load('/path/to/file.npz') time_s, c3, f1 = d['time_s'], d['c3'], d['f1'] Args: channels: List of analog channel numbers (e.g. [1, 2]) and/or math channel strings (e.g. ["F1", "F2"]). Mixed lists are supported, e.g. [3, "F1"] captures C3 and the F1 math trace together. max_points: Maximum samples per channel (default 10000, evenly downsampled). Transport: SCPI (binary WF? DAT1 transfer + INSPECT? WAVEDESC scaling) |
| scope_save_waveform_csvA | Capture a waveform and save it as a timestamped CSV file ready for post-processing. Files are always saved to a 'waveforms/' subfolder next to the server with an auto-generated filename, e.g.: waveforms/C1_20260329_153042.csv The full path is returned so you know exactly where the file landed. The CSV has two columns: time_s and voltage_v. Metadata lines starting with # at the top are ignored by pandas (use comment='#'). Example Python usage: import pandas as pd df = pd.read_csv('waveforms/C1_20260329_153042.csv', comment='#') df.plot(x='time_s', y='voltage_v') Args: channel: Channel number 1–4 max_points: Maximum samples to save (default 10000). Transport: SCPI (binary WF? DAT1 transfer + INSPECT? WAVEDESC scaling) |
| scope_wavesource_infoA | Get all current WaveSource generator settings. Returns shape, frequency, amplitude, offset, load, duty cycle, symmetry, and enabled state. Only available on models with has_wavesource=True (e.g. WaveSurfer 3000Z). Check scope_capabilities first. Transport: VBS (app.WaveSource.*) |
| scope_wavesource_enableA | Enable or disable the WaveSource output. Args: on: True to enable output, False to disable. Transport: VBS (app.WaveSource.Enable) |
| scope_wavesource_configureA | Configure the WaveSource built-in generator in a single call. All parameters are optional — only the provided ones are applied. Only available on models with has_wavesource=True (e.g. WaveSurfer 3000Z). Check scope_capabilities first. Args: shape: Waveform shape: Sine, Square, Triangle, Pulse, DC, Noise, Arb. For sawtooth/ramp use Triangle with symmetry=0 or symmetry=100. frequency: Output frequency in Hz, e.g. 1000.0 for 1 kHz amplitude: Peak-to-peak amplitude in Vpp, e.g. 3.3 for 3.3 Vpp offset: DC offset in volts load: Output load: 'HiZ' (high impedance) or '50' (50 Ω termination) duty_cycle: Duty cycle in percent — Square and Pulse shapes only symmetry: Symmetry in percent — Triangle shape only (50 = symmetric) Transport: VBS (app.WaveSource.*) |
| scope_decode_readA | Read decoded serial data from the scope's SerialDecode subsystem. The scope must already have a serial decode active (configured via its UI or scope_decode_configure_uart). Works with UART/RS-232, I2C, SPI, CAN, and any other protocol supported by the Decode option. Reads the decoded table row-by-row using the VBS Table API and saves the result to a timestamped .npz file so the raw data is not embedded in the response. The file contains: time_s — float array, timestamp for each decoded frame/byte data — uint8 array, decoded byte values Returns JSON with the file path and metadata. Load in Python with: import numpy as np d = np.load('/path/to/file.npz') times, data_bytes = d['time_s'], d['data'] Note: row-by-row VBS queries are slow (~0.05 s each). Decodes with hundreds of rows will take 10–20 s. Keep this in mind for large captures. Args: decoder: Decode slot number — 1 or 2 (default 1) Transport: VBS (app.SerialDecode.Decode{n}.Out.Result.*) |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| _res_index | Index of all LeCroy SCPI documentation topics. |
| _res_overview | LeCroy SCPI overview: communication, syntax, headers, binary data format. |
| _res_channel | Channel commands: VDIV, OFST, CPL/COUP, BWL, ATTN, TRA, INVS, UNIT. |
| _res_timebase | Timebase commands: TDIV, TRDL, MSIZ, ILVD, SEQ. |
| _res_trigger | Trigger commands: TRMD, TRLV, TRSL, TRCP, TRSE, FRTR and advanced types. |
| _res_acquisition | Acquisition control: ARM, STOP, WAIT, INR?, single-shot sequence. |
| _res_measurement | Automated measurements: PAVA, PACU, full parameter list, state codes. |
| _res_waveform | Waveform transfer: COMM_FORMAT, COMM_ORDER, WF?, WFSU, INSPECT?, WAVEDESC scaling. |
| _res_math | Math functions: equations, FFT, INTG, DIFF, AVGS, ERES. |
| _res_cursor | Cursor commands: CRS, CRST, CRVA, CRMS. |
| _res_screenshot | Screenshot commands: HCSU setup, SCDP capture, IEEE 488.2 header stripping. |
| _res_system | System commands: *IDN?, *RST, *CAL?, BUZZ, DATE, panel lock, setup save/recall. |
| _res_wavesource | WaveSource generator: VBS properties, shapes, frequency, amplitude, load. |
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/lucasgerads/lecroy-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server