copper-mountain-vna-mcp
Enables AI agents to control Copper Mountain Vector Network Analyzers over TCP/IP SCPI, offering 45 tools for sweep configuration, calibration, measurement, and Touchstone export.
README
<div align="center">
<img src="assets/logo-banner.svg" alt="copper-mountain-vna-mcp — Copper Mountain VNA control over SCPI" width="100%"/>
<br/>
Drive Copper Mountain Vector Network Analyzers from any MCP-compatible AI client. TCP/IP SCPI over the wire — 45 tools spanning sweep, calibration, measurement, and export.
Quick start · Tools · Workflows · Documentation
</div>
What is copper-mountain-vna-mcp?
copper-mountain-vna-mcp is a Model Context Protocol
server that exposes a Copper Mountain VNA — RVNA, TRVNA, S2VNA, or S4VNA family
— to any MCP-capable AI assistant. The server speaks raw TCP/IP SCPI to the
Copper Mountain software socket server (default port 5025), then surfaces
sweep configuration, calibration, S-parameter capture, marker math, and
Touchstone export as plain MCP tools.
Drive it from Claude Desktop, Claude Code, VS Code Copilot, or any other MCP
client. SCPI is generated server-side, so the AI agent never needs to know the
underlying command set — it just calls vna_configure_sweep, vna_trigger_sweep,
vna_get_s_parameter and gets back structured data.
What copper-mountain-vna-mcp does well:
- 🤖 AI-native via MCP. First-class Model Context Protocol server with 45 tools. Any Claude / LLM agent can drive it.
- 🐍 Python + MCP surfaces. Import
coppermountain_vna_mcpfor direct driver access, or run as an MCP server for AI-agent automation. - ⚡ Direct TCP/IP SCPI. No VISA dependency, no proprietary middleware — just asyncio sockets straight to the Copper Mountain software socket server.
- ✅ Validated against 4 VNA families. RVNA (S11), TRVNA (S11/S21), S2VNA (full 2-port), S4VNA (full 4×4).
- 🔒 AGPL-3.0-or-later. Network-copyleft open-source. Independent of Copper Mountain Technologies (trademark disclaimer below).
Disclaimer: This project is not affiliated with, endorsed by, or sponsored by Copper Mountain Technologies. "Copper Mountain" is a trademark of Copper Mountain Technologies. This is an independent open-source project.
Quick start
Install
pip install coppermountain-vna-mcp
Or from source:
git clone https://github.com/RFingAdam/copper-mountain-vna-mcp.git
cd copper-mountain-vna-mcp
pip install -e ".[dev]"
Supported instruments
| Family | Description | Example models | S-parameters |
|---|---|---|---|
| RVNA | 1-port reflectometer | R54, R60 | S11 |
| TRVNA | 2-port 1-path | TR1300 | S11, S21 |
| S2VNA | 2-port full reversing | M5090, Planar 804/1 | S11, S12, S21, S22 |
| S4VNA | 4-port full | S5048 | Full 4×4 matrix |
Two surfaces, same answer
<table> <tr> <td valign="top" width="50%">
Python
import asyncio
from coppermountain_vna_mcp.driver import CopperMountainVNADriver
from coppermountain_vna_mcp.models import SParameter, SweepConfig
async def main():
async with CopperMountainVNADriver("127.0.0.1", 5025) as vna:
await vna.configure_sweep(SweepConfig(
start_freq_hz=1e9, stop_freq_hz=2e9,
num_points=201, if_bandwidth_hz=1000, power_dbm=0,
))
await vna.trigger_sweep()
data = await vna.get_s_parameter_data(SParameter.S11)
marker = await vna.marker_search_min()
print(f"Best match: {marker.frequency_hz/1e9:.3f} GHz @ {marker.magnitude_db:.1f} dB")
asyncio.run(main())
</td> <td valign="top" width="50%">
MCP (Claude Desktop, Claude Code, any MCP client)
{
"mcpServers": {
"copper-mountain-vna": {
"command": "python",
"args": ["-m", "coppermountain_vna_mcp"],
"env": {
"VNA_DEFAULT_HOST": "127.0.0.1",
"VNA_DEFAULT_PORT": "5025"
}
}
}
}
Then ask your assistant in plain English:
"Connect to the VNA on 127.0.0.1, sweep 1–2 GHz at 201 points, and tell me where S11 is best matched."
The agent will call vna_connect, vna_configure_sweep, vna_trigger_sweep,
and vna_marker_search_min in sequence and report the result.
</td> </tr> </table>
Start the VNA software socket server
The VNA software runs on Windows. Enable the socket server via command line:
:: S2VNA / S4VNA
S2VNA.exe /SocketServer:on /SocketPort:5025 /visible:on
:: RVNA / TRVNA
RVNA.exe EnableSocket:5025
Or in the GUI: System > Socket Server > Enable.
Configuration
Configure via environment variables or .env file:
| Variable | Default | Description |
|---|---|---|
VNA_DEFAULT_HOST |
127.0.0.1 |
VNA software host IP |
VNA_DEFAULT_PORT |
5025 |
Socket server port |
VNA_CONNECTION_TIMEOUT |
5.0 |
TCP connection timeout (s) |
VNA_COMMAND_TIMEOUT |
30.0 |
SCPI command timeout (s) |
VNA_MAX_POWER_DBM |
10 |
Max output power |
VNA_MIN_POWER_DBM |
-55 |
Min output power |
VNA_MAX_FREQUENCY_HZ |
20e9 |
Upper sweep bound |
VNA_MAX_POINTS |
10001 |
Maximum sweep points |
Tools
45 MCP tools, grouped:
| Group | Tools |
|---|---|
| Connection | vna_discover, vna_connect, vna_disconnect, vna_identify, vna_get_status |
| Configuration | vna_configure_sweep, vna_set_center_span, vna_set_averaging, vna_set_port_power, vna_output_on, vna_output_off |
| Measurement | vna_trigger_sweep, vna_get_s_parameter, vna_measure_return_loss, vna_measure_vswr, vna_measure_insertion_loss |
| Markers | vna_set_marker, vna_get_marker, vna_marker_search_min, vna_marker_search_max, vna_marker_bandwidth |
| Calibration | vna_calibration_status, vna_calibration_start, vna_calibration_measure_standard, vna_calibration_apply, vna_correction_on, vna_correction_off |
| Export | vna_save_touchstone, vna_save_screenshot |
| Templates | vna_list_templates, vna_load_template, vna_apply_template |
| State | vna_save_state, vna_load_state, vna_get_full_state |
| Limits | vna_define_limit, vna_check_limits, vna_list_limits, vna_clear_limits |
| Software | vna_software_show, vna_software_hide |
| Low-level SCPI | vna_scpi_send, vna_scpi_query, vna_reset, vna_preset |
Full tool reference in docs/tools.md.
Calibration
Standard cal flows are exposed as discrete tools so an agent can walk them step by step.
SOL (1-port reflection):
vna_calibration_start(method="SOL")vna_calibration_measure_standard(standard="SHORT", port_num=1)vna_calibration_measure_standard(standard="OPEN", port_num=1)vna_calibration_measure_standard(standard="LOAD", port_num=1)vna_calibration_apply()vna_correction_on()
SOLT (2-port full): SHORT/OPEN/LOAD on both ports, then THRU between
them, then apply.
Calibration is frequency-specific — recalibrate when the sweep range changes substantially.
Measurement templates
Pre-configured sweep + marker + trace setups for common DUT classes. Load by
name with vna_load_template, then vna_apply_template to push to the VNA.
| Category | Examples |
|---|---|
| Antennas — WiFi/BLE | antenna_wifi_24ghz, antenna_ble_24ghz, antenna_wifi_5ghz, antenna_wifi_5ghz_unii1/unii3, antenna_wifi_6ghz, antenna_wifi_dual_band, antenna_wifi_tri_band |
| Antennas — MIMO | antenna_mimo_wifi_24ghz, antenna_mimo_wifi_5ghz, antenna_mimo_wifi_dual_band, antenna_mimo_cellular |
| Antennas — ISM/cellular/GNSS | antenna_ism_us915, antenna_ism_eu868, antenna_ism_worldwide, antenna_cellular, antenna_gps_l1, antenna_gnss_dual_band, antenna_nfc |
| Antennas — UWB | antenna_uwb_channel_5, antenna_uwb_channel_9, antenna_uwb_full_band |
| Cables | cable_dc_2_4ghz, cable_dc_8_5ghz |
| Filters | filter_wifi_24ghz, filter_wifi_5ghz, filter_ism_915mhz, filter_gps_l1, filter_bandpass_custom, filter_lowpass_custom |
await vna.load_template("antenna_wifi_5ghz")
await vna.apply_template()
# Custom filter — provide parameters at load time
await vna.load_template("filter_bandpass_custom",
center_freq_hz=1.5e9, bandwidth_hz=100e6)
await vna.apply_template()
Workflows
copper-mountain-vna-mcp fits in the following eng-mcp-suite
workflow bundles:
lab-automation— pair withmcp-rs-spectrum-analyzer,mcp-rs-siggen, andmcp-rs-cmw500for end-to-end RF bench-test workflows driven from a single agent session.antenna-tuning— feed return-loss / VSWR traces intomcp-nec2-antennaormcp-openemsfor iterative match optimization.
Install the bundle with:
eng-mcp-suite install --workflow lab-automation
Documentation
- 📘 Quick Start — install through first call.
- 🛠️ Tool reference — every MCP tool, every argument.
- 📐 Usage examples — a practical end-to-end S11 walkthrough.
- 🏗️ Architecture — how this MCP fits in eng-mcp-suite.
- 📝 Changelog
Part of eng-mcp-suite
<sub>This MCP server is part of</sub>
<sub>Part of eng-mcp-suite — an open
umbrella of MCP servers for RF / EMC / PCB / signal-integrity engineering. Drop
into the lab-automation workflow bundle with
eng-mcp-suite install --workflow lab-automation.</sub>
| Domain | Sibling MCPs |
|---|---|
| RF / Transmission lines | lineforge |
| EMC regulatory | mcp-emc-regulations |
| EM simulation | mcp-openems, mcp-nec2-antenna |
| Diagrams | drawio-engineering-mcp |
| Lab gear | copper-mountain-vna-mcp · mcp-rs-spectrum-analyzer · mcp-rs-siggen · mcp-rs-cmw500 |
Contributing
Contributions welcome.
- Pick a GitHub issue.
- Fork + branch (
feature/your-thingorfix/your-bug). - Run the local check suite:
ruff check . && mypy src/coppermountain_vna_mcp pytest --cov=coppermountain_vna_mcp - Open a PR — link the issue, request review.
License
AGPL-3.0-or-later. Copyright 2025-2026 Adam Engelbrecht (RFingAdam). Relicensed from Apache-2.0 in v0.3.0 to align with the eng-mcp-suite toolkit-wide AGPL move.
Acknowledgments
- Copper Mountain Technologies — for documenting the SCPI command set used by RVNA / TRVNA / S2VNA / S4VNA software.
- The MCP working group — for the Model Context Protocol specification.
<div align="center">
<sub>Part of <a href="https://github.com/RFingAdam/eng-mcp-suite">eng-mcp-suite</a> — built for RF engineers, PCB designers, EMC labs, and AI agents.</sub>
</div>
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.