Skip to main content
Glama
lucasgerads

LeCroy Oscilloscope MCP

by lucasgerads

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault

No arguments

Capabilities

Features and capabilities supported by this server

CapabilityDetails
tools
{
  "listChanged": false
}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}
experimental
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
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:

  • FFT traces: Hz (e.g. center=1250, per_div=250 shows 0–2500 Hz on 10 divs)

  • Time-domain math traces: seconds

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

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription
_res_indexIndex of all LeCroy SCPI documentation topics.
_res_overviewLeCroy SCPI overview: communication, syntax, headers, binary data format.
_res_channelChannel commands: VDIV, OFST, CPL/COUP, BWL, ATTN, TRA, INVS, UNIT.
_res_timebaseTimebase commands: TDIV, TRDL, MSIZ, ILVD, SEQ.
_res_triggerTrigger commands: TRMD, TRLV, TRSL, TRCP, TRSE, FRTR and advanced types.
_res_acquisitionAcquisition control: ARM, STOP, WAIT, INR?, single-shot sequence.
_res_measurementAutomated measurements: PAVA, PACU, full parameter list, state codes.
_res_waveformWaveform transfer: COMM_FORMAT, COMM_ORDER, WF?, WFSU, INSPECT?, WAVEDESC scaling.
_res_mathMath functions: equations, FFT, INTG, DIFF, AVGS, ERES.
_res_cursorCursor commands: CRS, CRST, CRVA, CRMS.
_res_screenshotScreenshot commands: HCSU setup, SCDP capture, IEEE 488.2 header stripping.
_res_systemSystem commands: *IDN?, *RST, *CAL?, BUZZ, DATE, panel lock, setup save/recall.
_res_wavesourceWaveSource 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