Make docs MCP-client agnostic

Replace Claude-specific terminology with generic language:
- "Ask Claude:" → "Say:"
- "Claude will:" → "Your assistant will:"
- "Claude uses:" → "Calls:" / "This uses:"
- Architecture diagrams: "Claude Code" → "MCP Client"
- Installation tabs: "Claude Code" → "MCP Client" (with Claude Code as example)
- Prerequisites: list multiple MCP clients (Claude Code, Cursor, Zed)

Docs now work for any MCP-compatible client or custom implementation.
This commit is contained in:
Ryan Malloy 2026-02-05 12:56:26 -07:00
parent 62af53c9d1
commit 0e5553c661
11 changed files with 69 additions and 69 deletions

View File

@ -10,10 +10,12 @@ import { Tabs, TabItem, Aside } from '@astrojs/starlight/components';
### From PyPI (Recommended) ### From PyPI (Recommended)
<Tabs> <Tabs>
<TabItem label="Claude Code"> <TabItem label="MCP Client">
For Claude Code:
```bash ```bash
claude mcp add mcnanovna -- uvx mcnanovna claude mcp add mcnanovna -- uvx mcnanovna
``` ```
For other MCP clients, configure `uvx mcnanovna` as a server.
</TabItem> </TabItem>
<TabItem label="Standalone"> <TabItem label="Standalone">
```bash ```bash
@ -53,10 +55,12 @@ MCNANOVNA_WEB_PORT=8080 uv run mcnanovna
### From PyPI ### From PyPI
<Tabs> <Tabs>
<TabItem label="Claude Code"> <TabItem label="MCP Client">
For Claude Code:
```bash ```bash
claude mcp add mcpositioner -- uvx mcpositioner claude mcp add mcpositioner -- uvx mcpositioner
``` ```
For other MCP clients, configure `uvx mcpositioner` as a server.
</TabItem> </TabItem>
<TabItem label="Standalone"> <TabItem label="Standalone">
```bash ```bash
@ -94,15 +98,12 @@ mcpositioner requires the ESP32 positioner hardware. See [Hardware Build](/hardw
## Both Servers Together ## Both Servers Together
For automated 3D antenna pattern measurement, run both servers: For automated 3D antenna pattern measurement, add both servers to your MCP client:
```bash ```bash
# Add both to Claude Code # Claude Code example
claude mcp add mcnanovna -- uvx mcnanovna claude mcp add mcnanovna -- uvx mcnanovna
claude mcp add mcpositioner -- uvx mcpositioner claude mcp add mcpositioner -- uvx mcpositioner
# Restart Claude Code to load both
claude
``` ```
Then use the `measure_antenna_range` prompt to run automated pattern sweeps. Then use the `measure_antenna_range` prompt to run automated pattern sweeps.

View File

@ -7,26 +7,25 @@ import { Steps, Tabs, TabItem, Aside } from '@astrojs/starlight/components';
## Prerequisites ## Prerequisites
- Claude Code CLI installed - An MCP client (Claude Code, Cursor, Zed, or any MCP-compatible app)
- NanoVNA-H connected via USB - NanoVNA-H connected via USB
- Python 3.11+ (handled automatically by uvx) - Python 3.11+ (handled automatically by uvx)
## Installation ## Installation
<Steps> <Steps>
1. **Add the MCP server to Claude Code** 1. **Add the MCP server to your client**
For Claude Code:
```bash ```bash
claude mcp add mcnanovna -- uvx mcnanovna claude mcp add mcnanovna -- uvx mcnanovna
``` ```
2. **Start a new Claude Code session** For other clients, configure `uvx mcnanovna` as an MCP server per your client's documentation.
```bash 2. **Start a new session**
claude
```
3. **Ask Claude to use your VNA** 3. **Ask your assistant to use your VNA**
Try these prompts: Try these prompts:
- "Scan my antenna from 144 to 148 MHz" - "Scan my antenna from 144 to 148 MHz"
@ -42,7 +41,7 @@ The VNA auto-connects on first tool call. No configuration needed if using defau
## Verify Connection ## Verify Connection
Ask Claude: "Get VNA info" Try: *"Get VNA info"*
You should see device details like firmware version, serial number, and frequency range. You should see device details like firmware version, serial number, and frequency range.

View File

@ -26,7 +26,7 @@ import nanoVNA from '../../assets/hardware/NanoVNA-H-2.jpg';
## What is this? ## What is this?
Two MCP servers that let Claude control RF test equipment: Two MCP servers that let LLMs control RF test equipment:
<CardGrid stagger> <CardGrid stagger>
<Card title="mcnanovna" icon="document"> <Card title="mcnanovna" icon="document">
@ -39,7 +39,7 @@ Two MCP servers that let Claude control RF test equipment:
</Card> </Card>
<Card title="Cross-Server Workflows" icon="rocket"> <Card title="Cross-Server Workflows" icon="rocket">
Both servers work together for automated 3D antenna pattern measurement. Both servers work together for automated 3D antenna pattern measurement.
Claude orchestrates positioning and VNA measurements across the grid. Your assistant orchestrates positioning and VNA measurements across the grid.
</Card> </Card>
<Card title="Web UI" icon="laptop"> <Card title="Web UI" icon="laptop">
Optional Three.js 3D viewer for radiation patterns. Optional Three.js 3D viewer for radiation patterns.
@ -73,12 +73,12 @@ Direct access to professional RF measurement capabilities:
## Quick Install ## Quick Install
```bash ```bash
# Add both servers to Claude Code # Add both servers (Claude Code example)
claude mcp add mcnanovna -- uvx mcnanovna claude mcp add mcnanovna -- uvx mcnanovna
claude mcp add mcpositioner -- uvx mcpositioner claude mcp add mcpositioner -- uvx mcpositioner
``` ```
Then ask Claude to analyze your antenna, measure a filter, or run a 3D pattern sweep. Then ask your assistant to analyze your antenna, measure a filter, or run a 3D pattern sweep.
## Hardware ## Hardware
@ -104,7 +104,7 @@ Then ask Claude to analyze your antenna, measure a filter, or run a 3D pattern s
## Example Prompts ## Example Prompts
Once installed, try asking Claude: Once installed, try prompts like:
- *"Connect to my NanoVNA and sweep 7.0-7.3 MHz to check my 40m dipole"* - *"Connect to my NanoVNA and sweep 7.0-7.3 MHz to check my 40m dipole"*
- *"Measure the insertion loss of this BPF from 144-148 MHz"* - *"Measure the insertion loss of this BPF from 144-148 MHz"*

View File

@ -5,7 +5,7 @@ description: MCP server for NanoVNA-H vector network analyzers
import { Aside } from '@astrojs/starlight/components'; import { Aside } from '@astrojs/starlight/components';
mcnanovna gives Claude direct control of NanoVNA-H vector network analyzers over USB serial. It exposes 78 MCP tools for frequency sweeps, S-parameter measurements, calibration, LCD capture, RF analysis, and 3D antenna radiation pattern visualization. mcnanovna gives LLMs direct control of NanoVNA-H vector network analyzers over USB serial. It exposes 78 MCP tools for frequency sweeps, S-parameter measurements, calibration, LCD capture, RF analysis, and 3D antenna radiation pattern visualization.
## Capabilities ## Capabilities
@ -49,7 +49,7 @@ Other NanoVNA variants using the same USB serial protocol (VID 0x0483, PID 0x574
``` ```
┌─────────────────────────────────────────────────────────┐ ┌─────────────────────────────────────────────────────────┐
Claude Code MCP Client
│ │ │ │ │ │
│ MCP Protocol │ │ MCP Protocol │
│ ▼ │ │ ▼ │

View File

@ -5,7 +5,7 @@ description: Guided workflow prompts for mcnanovna
import { Aside } from '@astrojs/starlight/components'; import { Aside } from '@astrojs/starlight/components';
Prompts are pre-built conversation templates that guide Claude through multi-step procedures. They set up context and provide step-by-step instructions for common workflows. Prompts are pre-built conversation templates that guide your assistant through multi-step procedures. They set up context and provide step-by-step instructions for common workflows.
## Available Prompts ## Available Prompts

View File

@ -130,30 +130,30 @@ import { Tabs, TabItem } from '@astrojs/starlight/components';
``` ```
User: Scan my antenna from 144 to 148 MHz with 201 points User: Scan my antenna from 144 to 148 MHz with 201 points
Claude uses: sweep(144000000, 148000000, 201) Calls: sweep(144000000, 148000000, 201)
Claude uses: scan(s11=true) Calls: scan(s11=true)
Claude uses: analyze() Calls: analyze()
``` ```
</TabItem> </TabItem>
<TabItem label="Filter Analysis"> <TabItem label="Filter Analysis">
``` ```
User: Analyze this bandpass filter from 1 to 500 MHz User: Analyze this bandpass filter from 1 to 500 MHz
Claude uses: sweep(1000000, 500000000, 201) Calls: sweep(1000000, 500000000, 201)
Claude uses: analyze_filter() Calls: analyze_filter()
``` ```
</TabItem> </TabItem>
<TabItem label="Calibration"> <TabItem label="Calibration">
``` ```
User: Calibrate for the 2m band User: Calibrate for the 2m band
Claude uses: sweep(144000000, 148000000, 101) Calls: sweep(144000000, 148000000, 101)
Claude uses: cal("load") # user connects load Calls: cal("load") # user connects load
Claude uses: cal("open") # user connects open Calls: cal("open") # user connects open
Claude uses: cal("short") # user connects short Calls: cal("short") # user connects short
Claude uses: cal("thru") # user connects through Calls: cal("thru") # user connects through
Claude uses: cal("done") Calls: cal("done")
Claude uses: save(0) Calls: save(0)
``` ```
</TabItem> </TabItem>
</Tabs> </Tabs>

View File

@ -5,7 +5,7 @@ description: MCP server for ESP32 dual-axis antenna positioner
import { Aside } from '@astrojs/starlight/components'; import { Aside } from '@astrojs/starlight/components';
mcpositioner gives Claude control of an ESP32-based dual-axis antenna positioner over WiFi. It drives two NEMA 17 stepper motors via TMC2209 drivers for theta (polar, 0-180°) and phi (azimuth, 0-360°) rotation. mcpositioner gives LLMs control of an ESP32-based dual-axis antenna positioner over WiFi. It drives two NEMA 17 stepper motors via TMC2209 drivers for theta (polar, 0-180°) and phi (azimuth, 0-360°) rotation.
## Purpose ## Purpose
@ -36,7 +36,7 @@ Full build instructions and KiCad schematics are in the [Hardware section](/hard
``` ```
┌─────────────────────────────────────────────────────────┐ ┌─────────────────────────────────────────────────────────┐
Claude Code MCP Client
│ │ │ │ │ │
│ MCP Protocol │ │ MCP Protocol │
│ ▼ │ │ ▼ │

View File

@ -86,12 +86,12 @@ This prompt requires both mcpositioner AND mcnanovna MCP servers to be running.
## Using Prompts ## Using Prompts
In Claude Code, invoke prompts by name: Invoke prompts by name:
``` ```
User: Run the measure_pattern_grid prompt for my Yagi on 70cm User: Run the measure_pattern_grid prompt for my Yagi on 70cm
Claude: [Uses measure_pattern_grid prompt with antenna_type="yagi", band="70cm"] [Uses measure_pattern_grid prompt with antenna_type="yagi", band="70cm"]
``` ```
The prompt provides step-by-step guidance, and Claude executes the tools from both mcpositioner and mcnanovna as needed. The prompt provides step-by-step guidance, and your assistant executes the tools from both mcpositioner and mcnanovna as needed.

View File

@ -11,9 +11,9 @@ This tutorial covers common antenna analysis tasks using mcnanovna.
The most common antenna measurement is SWR (Standing Wave Ratio) and impedance at the feedpoint. The most common antenna measurement is SWR (Standing Wave Ratio) and impedance at the feedpoint.
Ask Claude: "Analyze my antenna from 144 to 148 MHz" Say: "Analyze my antenna from 144 to 148 MHz"
Claude will: Your assistant will:
1. Run a sweep across the band 1. Run a sweep across the band
2. Find the resonant frequency (minimum SWR) 2. Find the resonant frequency (minimum SWR)
3. Calculate impedance at resonance 3. Calculate impedance at resonance
@ -32,17 +32,17 @@ Return loss at resonance: -23.4 dB
For antennas with multiple resonances (like a multi-band antenna): For antennas with multiple resonances (like a multi-band antenna):
Ask Claude: "Find all resonances from 1 to 30 MHz" Say: "Find all resonances from 1 to 30 MHz"
Claude uses `analyze_s11_resonance` to find all points where the antenna is resonant. This uses `analyze_s11_resonance` to find all points where the antenna is resonant.
## Impedance Matching ## Impedance Matching
If your antenna doesn't match 50Ω, design a matching network: If your antenna doesn't match 50Ω, design a matching network:
Ask Claude: "Design a matching network for 35+j25 ohms at 145 MHz" Say: "Design a matching network for 35+j25 ohms at 145 MHz"
Claude uses `analyze_lc_match` to compute L-network solutions: This uses `analyze_lc_match` to compute L-network solutions:
``` ```
Solution 1: Series L (27 nH) + Shunt C (18 pF) Solution 1: Series L (27 nH) + Shunt C (18 pF)
Solution 2: Shunt C (12 pF) + Series L (42 nH) Solution 2: Shunt C (12 pF) + Series L (42 nH)
@ -57,7 +57,7 @@ Solution 2: Shunt C (12 pF) + Series L (42 nH)
- Narrow bandwidth - Narrow bandwidth
- Figure-8 radiation pattern - Figure-8 radiation pattern
Ask Claude: "Analyze my dipole on 20m" Say: "Analyze my dipole on 20m"
</TabItem> </TabItem>
<TabItem label="Vertical"> <TabItem label="Vertical">
**Expected characteristics:** **Expected characteristics:**
@ -65,7 +65,7 @@ Solution 2: Shunt C (12 pF) + Series L (42 nH)
- Needs matching network or radials - Needs matching network or radials
- Omnidirectional pattern - Omnidirectional pattern
Ask Claude: "Analyze my vertical on 40m" Say: "Analyze my vertical on 40m"
</TabItem> </TabItem>
<TabItem label="Yagi"> <TabItem label="Yagi">
**Expected characteristics:** **Expected characteristics:**
@ -73,7 +73,7 @@ Solution 2: Shunt C (12 pF) + Series L (42 nH)
- Narrow bandwidth - Narrow bandwidth
- Directional pattern - Directional pattern
Ask Claude: "Analyze my Yagi from 144 to 148 MHz" Say: "Analyze my Yagi from 144 to 148 MHz"
</TabItem> </TabItem>
<TabItem label="Loop"> <TabItem label="Loop">
**Expected characteristics:** **Expected characteristics:**
@ -81,7 +81,7 @@ Solution 2: Shunt C (12 pF) + Series L (42 nH)
- High Q (narrow bandwidth) - High Q (narrow bandwidth)
- Figure-8 pattern (small loop) - Figure-8 pattern (small loop)
Ask Claude: "Analyze my magnetic loop on 40m" Say: "Analyze my magnetic loop on 40m"
</TabItem> </TabItem>
</Tabs> </Tabs>
@ -114,7 +114,7 @@ For a dipole, each side is approximately λ/4 in length. At 145 MHz, that's abou
The antenna is resonant but not at 50Ω. The antenna is resonant but not at 50Ω.
Ask Claude: "Design a matching network for my measured impedance" Say: "Design a matching network for my measured impedance"
### Narrow bandwidth ### Narrow bandwidth
@ -127,7 +127,7 @@ High-Q antennas (small loops, loaded verticals) have narrow bandwidth. Options:
For a quick analytical pattern based on antenna type: For a quick analytical pattern based on antenna type:
Ask Claude: "Show the radiation pattern for my dipole" Say: "Show the radiation pattern for my dipole"
This uses the S11 data to determine resonance and impedance, then generates an idealized 3D pattern. This uses the S11 data to determine resonance and impedance, then generates an idealized 3D pattern.

View File

@ -34,7 +34,7 @@ An SMA calibration kit includes precision standards. For casual use, a 50Ω term
<Steps> <Steps>
1. **Set the sweep range** 1. **Set the sweep range**
Ask Claude: "Set sweep from 144 to 148 MHz with 101 points" Say: "Set sweep from 144 to 148 MHz with 101 points"
Calibration is frequency-specific. Always calibrate at the frequencies you'll measure. Calibration is frequency-specific. Always calibrate at the frequencies you'll measure.
@ -42,43 +42,43 @@ An SMA calibration kit includes precision standards. For casual use, a 50Ω term
Connect the 50Ω load termination to Port 1. Connect the 50Ω load termination to Port 1.
Ask Claude: "Run cal load" Say: "Run cal load"
3. **Connect the OPEN** 3. **Connect the OPEN**
Remove the load, leave Port 1 open (or use an open standard). Remove the load, leave Port 1 open (or use an open standard).
Ask Claude: "Run cal open" Say: "Run cal open"
4. **Connect the SHORT** 4. **Connect the SHORT**
Connect the short standard to Port 1. Connect the short standard to Port 1.
Ask Claude: "Run cal short" Say: "Run cal short"
5. **Connect the THROUGH** 5. **Connect the THROUGH**
Connect Port 1 to Port 2 with a short cable or barrel adapter. Connect Port 1 to Port 2 with a short cable or barrel adapter.
Ask Claude: "Run cal thru" Say: "Run cal thru"
6. **Optional: Isolation** 6. **Optional: Isolation**
Connect 50Ω loads to both ports. Connect 50Ω loads to both ports.
Ask Claude: "Run cal isoln" Say: "Run cal isoln"
This corrects for crosstalk between ports. This corrects for crosstalk between ports.
7. **Apply calibration** 7. **Apply calibration**
Ask Claude: "Run cal done" Say: "Run cal done"
This computes and applies the error correction coefficients. This computes and applies the error correction coefficients.
8. **Save calibration** 8. **Save calibration**
Ask Claude: "Save calibration to slot 0" Say: "Save calibration to slot 0"
Saves to NanoVNA flash for later recall. Saves to NanoVNA flash for later recall.
</Steps> </Steps>
@ -109,7 +109,7 @@ Each slot holds one calibration. Common approach:
## Recalling Calibration ## Recalling Calibration
Ask Claude: "Recall calibration from slot 0" Say: "Recall calibration from slot 0"
The NanoVNA will use the stored calibration. Note that calibration must match the current sweep settings. The NanoVNA will use the stored calibration. Note that calibration must match the current sweep settings.

View File

@ -11,7 +11,7 @@ This tutorial walks through measuring a complete 3D antenna radiation pattern us
- NanoVNA-H connected via USB - NanoVNA-H connected via USB
- ESP32 positioner built and on WiFi - ESP32 positioner built and on WiFi
- Both MCP servers added to Claude Code: - Both MCP servers added to your client (e.g., for Claude Code):
```bash ```bash
claude mcp add mcnanovna -- uvx mcnanovna claude mcp add mcnanovna -- uvx mcnanovna
claude mcp add mcpositioner -- uvx mcpositioner claude mcp add mcpositioner -- uvx mcpositioner
@ -56,27 +56,27 @@ For accurate patterns, the transmit antenna should have a known, broad pattern (
<Steps> <Steps>
1. **Verify both servers are connected** 1. **Verify both servers are connected**
Ask Claude: "Check positioner status and VNA info" Say: "Check positioner status and VNA info"
Claude will call `positioner_status` and `info` to verify both devices respond. This will call `positioner_status` and `info` to verify both devices respond.
2. **Home the positioner** 2. **Home the positioner**
Ask Claude: "Home the positioner on both axes" Say: "Home the positioner on both axes"
This establishes the reference position (theta=0, phi=0). This establishes the reference position (theta=0, phi=0).
3. **Calibrate the VNA** 3. **Calibrate the VNA**
Ask Claude: "Calibrate for the 2m band" Say: "Calibrate for the 2m band"
Follow the SOLT calibration procedure. This is critical for accurate S21 measurements. Follow the SOLT calibration procedure. This is critical for accurate S21 measurements.
4. **Run the pattern measurement** 4. **Run the pattern measurement**
Ask Claude: "Measure a 3D radiation pattern for my dipole antenna on 2m" Say: "Measure a 3D radiation pattern for my dipole antenna on 2m"
Claude uses the `measure_pattern_grid` prompt to guide the measurement: This uses the `measure_pattern_grid` prompt to guide the measurement:
- Confirms grid resolution (default: 5° theta × 10° phi) - Confirms grid resolution (default: 5° theta × 10° phi)
- Moves through each grid point in serpentine order - Moves through each grid point in serpentine order
- Measures S21 at each position - Measures S21 at each position
@ -86,7 +86,7 @@ For accurate patterns, the transmit antenna should have a known, broad pattern (
If the mcnanovna web UI is running (`MCNANOVNA_WEB_PORT=8080`), the pattern renders in 3D automatically. If the mcnanovna web UI is running (`MCNANOVNA_WEB_PORT=8080`), the pattern renders in 3D automatically.
Or ask Claude: "Show the pattern statistics" Or say: *"Show the pattern statistics"*
</Steps> </Steps>
## Resolution Tradeoffs ## Resolution Tradeoffs