LeCroy Oscilloscope MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
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
} |
| 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
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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