oscilloscope-mcp
Allows probing clock and reset nets on KiCad designs after board bring-up, using the kicad-mcp partner MCP server.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@oscilloscope-mcpcapture a waveform on channel A"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
oscilloscope-mcp
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 |
| Via |
Hands-out | Waveform preview (downsampled JSON) |
|
Hands-out | CSV + JSON summary files |
|
Hands-out | Measurements (Vpp, freq, duty, rise) |
|
Fleet pipelines
Partner MCP | Workflow |
Probe clock/reset nets after bring-up | |
Verify power rails and oscillators | |
Discover USB devices before connect |
Quick Start
Set-Location D:\Dev\repos\oscilloscope-mcp
uv sync --extra dev
just webapp
# Open http://localhost:10937STDIO-only (Cursor MCP):
just serveDry-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 |
| list, connect, disconnect, status, capabilities, backends | Device discovery and session |
| channel, get, simulator_profile | Voltage range, coupling, sim waveform |
| set, get, arm, force | Trigger source, threshold, edge |
| single, preview, export_csv, export_summary, last | Acquire and export waveforms |
| all, vpp, frequency, duty, rise_time, fresh | Timing and voltage metrics |
| discover, tool_help, quickstart, faq, hardware_guide | Discovery and buying guide |
Recommended Hardware
Tier | Model | Price | Backend |
Best value | PicoScope 2204A | ~$130-190 |
|
Swiss army knife | Analog Discovery 3 | ~$200-400 | planned ( |
Budget hack | Hantek 6022BE | ~$40-80 |
|
See docs/HARDWARE.md for the full buying guide.
Webapp
Fleet SOTA console: Dashboard, Waveform viewer, Tools hub, Settings, Help.
just webappPort | Service |
10936 | FastAPI backend ( |
10937 | Vite React frontend |
License
MIT - see LICENSE.
Available Tools
6 toolsscope_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")
| Name | Required | Description | Default |
|---|---|---|---|
| range_v | No | Voltage range for capture channel. | |
| filename | No | Optional export filename stem. | |
| operation | Yes | Capture operation. | |
| channel_id | No | Primary channel for single-channel capture. | A |
| sample_count | No | Number of samples to acquire. | |
| sample_rate_hz | No | Sample rate in Hz. |
TDQS
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.
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.
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.
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.
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.
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)
| Name | Required | Description | Default |
|---|---|---|---|
| enabled | No | Enable or disable channel. | |
| range_v | No | Full-scale voltage range in volts. | |
| coupling | No | Input coupling: dc or ac. | |
| offset_v | No | Analog offset in volts. | |
| waveform | No | Simulator waveform type (simulator_profile only). | |
| operation | Yes | Configuration operation. | |
| channel_id | No | Channel label (A, B, CH1). | |
| amplitude_v | No | Simulator amplitude in volts. | |
| frequency_hz | No | Simulator frequency in Hz. |
TDQS
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.
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.
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.
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.
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.
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")
| Name | Required | Description | Default |
|---|---|---|---|
| backend | No | Force backend: simulator, picoscope, or hantek. | |
| device_id | No | Device ID for connect (e.g. sim-001, picoscope:12345). | |
| operation | Yes | Device management operation. |
TDQS
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.
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.
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.
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.
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.
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_helpBRead-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")
| Name | Required | Description | Default |
|---|---|---|---|
| topic | No | FAQ topic filter. | |
| operation | Yes | Help operation. | |
| tool_name | No | Tool name for tool_help. |
TDQS
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.
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.
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.
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.
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.
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_measureARead-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)
| Name | Required | Description | Default |
|---|---|---|---|
| operation | Yes | Measurement operation. | |
| channel_id | No | Channel to measure. | A |
| sample_count | No | Samples for fresh capture. | |
| sample_rate_hz | No | Sample rate for fresh capture. |
TDQS
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.
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.
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.
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.
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.
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")
| Name | Required | Description | Default |
|---|---|---|---|
| edge | No | Trigger edge: rising or falling. | |
| mode | No | Trigger mode: auto, normal, single, off. | |
| operation | Yes | Trigger operation. | |
| threshold_v | No | Trigger threshold in volts. | |
| source_channel | No | Trigger source channel. |
TDQS
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.
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.
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.
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.
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.
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.
6 tool updates
v0.1.0- First observed
scope_capture - First observed
scope_configure - First observed
scope_device - First observed
scope_help - First observed
scope_measure - First observed
scope_trigger
TDQS
Scored across 6 tools
Each tool has a distinct purpose: capture, configure, device management, help, measure, and trigger. No overlapping functionality.
All tools follow the same 'scope_' prefix with a clear verb, providing a predictable and consistent naming convention.
Six tools cover the essential oscilloscope operations without being excessive or insufficient, fitting well within the expected range.
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
Related MCP Connectors
OCR, transcription, file extraction, and image generation for AI agents via MCP.
19 free website QA and AI-visibility tools. Remote HTTP MCP, no account, no API key.
65+ AI tools as MCP: research, write, code, scrape, translate, RAG, agent memory, workflows
Related MCP Servers
- FlicenseAqualityDmaintenanceEnables 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.245-
- AlicenseAqualityDmaintenanceAn 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.137 npm7MIT
- AlicenseNot gradedqualityBmaintenanceAI-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.2MIT
- AlicenseNot gradedqualityDmaintenanceAn 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