Skip to main content
Glama
sandraschi

oscilloscope-mcp

oscilloscope-mcp

MIT License Python 3.12+ FastMCP 3.2+

AI-driven USB oscilloscope control via FastMCP 3.2. Connect screenless PC scopes (PicoScope, Hantek) or run the built-in simulator for dry-runs. Capture waveforms, export CSV, and compute frequency, Vpp, duty cycle, and rise time from your agent.

How it runs

Mode

Hardware

When

Simulator (default)

None

Development, CI, agent dry-runs

PicoScope

PicoScope 2000/3000/5000/6000 USB

Production bench with PicoSDK + pyPicoSDK

Hantek

Hantek 6022BE/BL

Budget USB scope with PyHT6022 + libusb

The MCP server never bundles oscilloscope drivers or PicoSDK. Install vendor software separately, then point the backend at your device.

Related MCP server: siglent-sds-mcp

Hands-in / Hands-out

Direction

Artifacts

Notes

Hands-in

device_id, channel config, trigger settings

Via scope_device, scope_configure, scope_trigger

Hands-out

Waveform preview (downsampled JSON)

scope_capture(operation="single")

Hands-out

CSV + JSON summary files

scope_capture(operation="export_csv") in OSCILLOSCOPE_MCP_CAPTURE_DIR

Hands-out

Measurements (Vpp, freq, duty, rise)

scope_measure(operation="all")

Fleet pipelines

Partner MCP

Workflow

kicad-mcp

Probe clock/reset nets after bring-up

chip-design-mcp

Verify power rails and oscillators

devices-mcp

Discover USB devices before connect

Quick Start

Set-Location D:\Dev\repos\oscilloscope-mcp
uv sync --extra dev
just webapp
# Open http://localhost:10937

STDIO-only (Cursor MCP):

just serve

Dry-run without hardware:

scope_device(operation="connect", device_id="sim-001")
scope_capture(operation="single", sample_rate_hz=100000, sample_count=2000)
scope_measure(operation="all", channel_id="A")

Cursor MCP config

Add to C:\Users\sandr\.cursor\mcp.json:

"oscilloscope-mcp": {
  "command": "C:/Users/sandr/.local/bin/uv.exe",
  "args": [
    "--directory",
    "D:/Dev/repos/oscilloscope-mcp",
    "run",
    "python",
    "-m",
    "oscilloscope_mcp",
    "--stdio"
  ],
  "env": {
    "FASTMCP_BANNER": "0",
    "FASTMCP_UPDATE_CHECK": "0",
    "PYTHONUNBUFFERED": "1",
    "OSCILLOSCOPE_MCP_BACKEND": "auto"
  }
}

Table of Contents

Tools Overview

Tool

Operations

Purpose

scope_device

list, connect, disconnect, status, capabilities, backends

Device discovery and session

scope_configure

channel, get, simulator_profile

Voltage range, coupling, sim waveform

scope_trigger

set, get, arm, force

Trigger source, threshold, edge

scope_capture

single, preview, export_csv, export_summary, last

Acquire and export waveforms

scope_measure

all, vpp, frequency, duty, rise_time, fresh

Timing and voltage metrics

scope_help

discover, tool_help, quickstart, faq, hardware_guide

Discovery and buying guide

Tier

Model

Price

Backend

Best value

PicoScope 2204A

~$130-190

picoscope

Swiss army knife

Analog Discovery 3

~$200-400

planned (waveforms)

Budget hack

Hantek 6022BE

~$40-80

hantek

See docs/HARDWARE.md for the full buying guide.

Webapp

Fleet SOTA console: Dashboard, Waveform viewer, Tools hub, Settings, Help.

just webapp

Port

Service

10936

FastAPI backend (/api/*, /health, /mcp)

10937

Vite React frontend

License

MIT - see LICENSE.

Available Tools

6 tools
scope_captureB

Acquire waveforms and export capture data.

Return Format

{"success": bool, "operation": str, "data": {...}}

Examples

  • scope_capture(operation="single", sample_rate_hz=100000, sample_count=4000)

  • scope_capture(operation="export_csv")

  • scope_capture(operation="preview")

ParametersJSON Schema
NameRequiredDescriptionDefault
range_vNoVoltage range for capture channel.
filenameNoOptional export filename stem.
operationYesCapture operation.
channel_idNoPrimary channel for single-channel capture.A
sample_countNoNumber of samples to acquire.
sample_rate_hzNoSample rate in Hz.

TDQS

B3.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only say readOnlyHint=false and destructiveHint=false, which is neutral. The description does not disclose side effects such as file creation during export, the behavior of last, or differences between preview and single. It does provide a return format, but that is more about results than behavioral traits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact, front-loaded with the purpose, and structured with clear Return Format and Examples sections. Every line earns its place, and nothing is redundant with the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is adequate for basic invocation: it names the tool's function, shows a return format, and demonstrates common operation calls. However, it omits semantics for operations like export_summary and last, and does not clarify the capture-to-export workflow or what data will look like.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The examples add value beyond the schema by showing that sample_rate_hz and sample_count are relevant to operation='single', while export_csv and preview use no explicit capture parameters. This helps an agent compose valid parameter combinations.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool acquires waveforms and exports capture data, using a specific verb and resource. It does not explicitly distinguish itself from sibling tools like scope_measure, but the core purpose is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The examples imply usage patterns for operations like single, export_csv, and preview, but the description does not state when to choose this tool over alternatives such as scope_measure or scope_configure. Usage context is present implicitly, not explicitly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

scope_configureA

Configure oscilloscope channels and simulator signal profiles.

Return Format

{"success": bool, "operation": str, "data": {...}}

Examples

  • scope_configure(operation="channel", channel_id="A", range_v=2.0, coupling="dc")

  • scope_configure(operation="get")

  • scope_configure(operation="simulator_profile", waveform="square", frequency_hz=1000)

ParametersJSON Schema
NameRequiredDescriptionDefault
enabledNoEnable or disable channel.
range_vNoFull-scale voltage range in volts.
couplingNoInput coupling: dc or ac.
offset_vNoAnalog offset in volts.
waveformNoSimulator waveform type (simulator_profile only).
operationYesConfiguration operation.
channel_idNoChannel label (A, B, CH1).
amplitude_vNoSimulator amplitude in volts.
frequency_hzNoSimulator frequency in Hz.

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=false and destructiveHint=false, so the mutating nature is known. The description adds a return format and concrete examples, which help an agent understand what to expect, but it does not disclose side effects such as overwriting existing settings or any device prerequisites. Some context is added, but the behavioral picture is incomplete.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-structured with a one-line purpose, a return format section, and three illustrative examples. Every part earns its place and there is no fluff or redundant detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers three of the four operations in the enum but omits an example or explanation for 'channels'. The return format is generic, and there is no output schema to clarify the data field. Given 9 parameters and 4 operations, the description provides a usable but incomplete picture for all possible invocations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds value by showing parameter-to-operation mappings through examples: channel_id/range_v/coupling for 'channel', waveform/frequency_hz for 'simulator_profile', and no params for 'get'. This helps an agent combine parameters correctly beyond the raw schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Configure oscilloscope channels and simulator signal profiles.' The examples further clarify distinct operations. The tool name and resource clearly differentiate it from sibling tools like scope_capture, scope_measure, and scope_trigger.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context that this tool is for configuration rather than capture or measurement, but it does not explicitly say when to use this tool versus alternatives, nor does it mention any exclusions. Usage is implied through the examples and operation enum rather than stated directly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

scope_deviceA

Discover, connect, and manage USB oscilloscope devices.

Consolidates device enumeration, session connection, backend selection, and health status.

Return Format

{"success": bool, "operation": str, "data": {...}}

Examples

  • scope_device(operation="list")

  • scope_device(operation="connect", device_id="sim-001")

  • scope_device(operation="status")

  • scope_device(operation="backends")

ParametersJSON Schema
NameRequiredDescriptionDefault
backendNoForce backend: simulator, picoscope, or hantek.
device_idNoDevice ID for connect (e.g. sim-001, picoscope:12345).
operationYesDevice management operation.

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only provide readOnlyHint=false and destructiveHint=false. The description adds a generic return format and mentions session connection and health status, but it does not disclose consequences such as what 'connect' does to an existing session, whether 'disconnect' closes resources, or what data 'capabilities' returns. No contradiction with annotations, but behavioral depth is limited.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the tool's purpose, followed by a compact return format and four representative examples. Each section contributes useful information, and there is no filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a multi-operation device-management tool with no output schema, the return contract and examples are helpful. Minor gaps remain: the 'capabilities' operation is not exemplified, and the relationship to sibling tools is not spelled out, but the enum and parameter descriptions cover most mechanical detail.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents operation, device_id, and backend. The examples illustrate valid combinations such as device_id='sim-001' but do not add substantive meaning beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with specific verbs and a clear resource: 'Discover, connect, and manage USB oscilloscope devices.' It then enumerates the consolidated responsibilities — device enumeration, session connection, backend selection, and health status — which effectively distinguishes it from the capture, configure, measure, and trigger siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage context is implied through the operation list and examples, but the description never explicitly tells an agent when to use scope_device versus scope_capture, scope_configure, or scope_measure. There are no exclusions or direct references to alternative tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

scope_helpB
Read-only

Help, discovery, and hardware guidance for oscilloscope-mcp.

Return Format

{"success": bool, "operation": str, "data": {...}}

Examples

  • scope_help(operation="discover")

  • scope_help(operation="quickstart")

  • scope_help(operation="hardware_guide")

ParametersJSON Schema
NameRequiredDescriptionDefault
topicNoFAQ topic filter.
operationYesHelp operation.
tool_nameNoTool name for tool_help.

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation already covers the safety profile, and the description adds a return-format specification, which is useful. It does not describe deeper behavioral traits such as whether lookups are local, cached, or network-dependent, but for a read-only help tool the annotation plus return format is adequate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-structured, with a short purpose statement, a return-format block, and three representative examples. Every sentence earns its place and the most actionable information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only help tool with a fully documented schema, the description is largely complete: it gives the return format, examples for key operations, and an overview of the help categories. It could clarify parameter combinations such as whether tool_name is required for operation='tool_help', but the schema and examples provide enough context for an agent to proceed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all three parameters. The description adds little beyond examples that use the operation parameter, and it does not clarify how topic or tool_name interact with specific operations. This matches the baseline for fully documented schemas.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool as the help/discovery/hardware-guidance entry point for oscilloscope-mcp, with examples of operations that reinforce its meta-role. It does not explicitly differentiate itself from the sibling scope_* tools, but its purpose as a help tool is reasonably distinct from capture/configure/device/measure/trigger.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides examples but no explicit guidance on when to use this tool versus the sibling tools. It does not state 'use when you need documentation or operation assistance' or mention any conditions or exclusions. Usage context is only implied by the tool name and operation examples.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

scope_measureA
Read-only

Measure voltage and timing parameters from captured waveforms.

Uses the last capture by default. Operation 'fresh' performs a new capture first.

Return Format

{"success": bool, "operation": str, "data": {...}}

Examples

  • scope_measure(operation="all", channel_id="A")

  • scope_measure(operation="frequency", channel_id="A")

  • scope_measure(operation="fresh", sample_rate_hz=200000)

ParametersJSON Schema
NameRequiredDescriptionDefault
operationYesMeasurement operation.
channel_idNoChannel to measure.A
sample_countNoSamples for fresh capture.
sample_rate_hzNoSample rate for fresh capture.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral details beyond annotations: the default reuse of the last capture, the fact that 'fresh' triggers a new capture, and the return envelope structure. These are meaningful operational traits not present in the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact, front-loaded, and well-structured with a purpose statement, default-behavior note, return format, and examples. Every section earns its place, and the examples are concise without redundant prose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with four parameters, one required, and a moderate enum, the description provides enough context: it explains the core behavior, the fresh-capture exception, and the return format. It does not describe every possible operation in prose, but the schema covers the enum and parameter constraints, so no critical selection or invocation detail is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description goes beyond the schema by illustrating realistic invocation patterns and clarifying that sample_rate_hz is relevant to a 'fresh' capture. It does not explain every enum value, but the schema and examples together provide sufficient meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Measure') with a clear resource ('voltage and timing parameters from captured waveforms'), immediately distinguishing it from sibling tools like scope_capture and scope_trigger. The operation names in the schema reinforce the intended purpose without ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly states the default behavior ('Uses the last capture by default') and the fresh-capture alternative, giving an agent context on when to use this tool versus performing a capture first. It does not explicitly name alternatives or exclusions, but the usage context is unambiguous enough for correct selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

scope_triggerB

Configure and inspect oscilloscope trigger settings.

Return Format

{"success": bool, "operation": str, "data": {...}}

Examples

  • scope_trigger(operation="set", source_channel="A", threshold_v=0.5, mode="auto", edge="rising")

  • scope_trigger(operation="get")

ParametersJSON Schema
NameRequiredDescriptionDefault
edgeNoTrigger edge: rising or falling.
modeNoTrigger mode: auto, normal, single, off.
operationYesTrigger operation.
threshold_vNoTrigger threshold in volts.
source_channelNoTrigger source channel.

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only indicate readOnlyHint=false and destructiveHint=false, so the description carries the burden of disclosing side effects. It mentions configure/inspect and gives a return format, but it does not explain the behavioral effects of arm or force operations, which are not covered by the phrase 'configure and inspect.' The risk of mutating oscilloscope trigger state is not clarified.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short and front-loaded: one purpose sentence, the return format, and two representative examples. There is no filler or repetition of schema content. It is well organized and every section earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is moderately complex with four operation modes, but the description only covers set and get in examples, leaving arm and force semantically undefined. There is no mention of behavior with null parameters, channel validity, or interaction with scope_capture/scope_configure. The return format helps, but the missing operation semantics make the definition incomplete for correct invocation across all valid inputs.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The examples add value beyond the schema by showing that operation='get' can be called without the optional parameters while operation='set' uses threshold_v, mode, edge, and source_channel together. This gives the agent a concrete model of how the parameters combine, which the enum descriptions alone do not convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific action-and-resource pair: 'Configure and inspect oscilloscope trigger settings.' This clearly identifies the tool's domain and distinguishes it from capture/measure/device siblings by the 'trigger' keyword. However, it does not explicitly differentiate from the sibling scope_configure, and 'configure' overlaps with that tool's likely purpose, so it falls short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to choose this tool over scope_configure or other siblings, nor does it state prerequisites or exclusions. The examples illustrate set and get calls but do not explain when arm or force should be used or when a different scope tool would be more appropriate. Usage context must be inferred entirely from the tool name and the word 'trigger.'

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 6 tool updatesv0.1.0
    • First observedscope_capture
    • First observedscope_configure
    • First observedscope_device
    • First observedscope_help
    • First observedscope_measure
    • First observedscope_trigger

TDQS

A3.9/5.0

Scored across 6 tools

Disambiguation5/5

Each tool has a distinct purpose: capture, configure, device management, help, measure, and trigger. No overlapping functionality.

Naming Consistency5/5

All tools follow the same 'scope_' prefix with a clear verb, providing a predictable and consistent naming convention.

Tool Count5/5

Six tools cover the essential oscilloscope operations without being excessive or insufficient, fitting well within the expected range.

Completeness4/5

The tool set covers core oscilloscope functions (capture, measure, trigger, configure, device, help). Missing a dedicated waveform save/load feature, but this is a minor gap.

Maintenance

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    A
    quality
    D
    maintenance
    Enables LLMs like Claude to interact with PicoScope oscilloscopes for signal acquisition, measurement, and analysis. Supports device management, data capture, triggering, and signal generation through natural language commands.
    24
    5
    -
  • A
    license
    A
    quality
    D
    maintenance
    An MCP server that enables AI assistants to control Siglent SDS oscilloscopes over a local network using SCPI commands. It allows users to measure signals, configure channel and acquisition settings, and capture waveforms or screenshots through natural language.
    13
    7 npm
    7
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    AI-driven USB logic analyzer control via FastMCP. Captures digital traces, decodes UART/I2C/SPI, and exports VCD for PulseView, supporting sigrok hardware and built-in simulator.
    2
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    An MCP server that connects AI assistants to the Owon DS1102 oscilloscope, enabling waveform capture, measurement retrieval, and remote control of scope settings.
    GPL 3.0