Discover MCPs & agents
Loading MCPs and agents…
Loading MCPs and agents…
MCP server for Software Defined Radio — control RTL-SDR & HackRF from Claude/LLM. ADS-B aircraft tracking, AIS ship tracking, POCSAG pager decoding, Meteor-M satellite imaging, ISM band scanning, spectrum analysis, and more.
From the repo.
Control Software Defined Radios and decode radio protocols through an AI-friendly Model Context Protocol interface.
pip install aetherlink
aetherlink --setup
That's it. The --setup command auto-configures Claude Desktop -- it detects your OS, finds the config file, and adds AetherLink without touching your other MCP servers. Then restart Claude Desktop.
Or if you prefer uvx (no install needed):
uvx aetherlink --setup
Note: You still need RTL-SDR system drivers installed. See System Dependencies below.
macOS / Linux:
curl -fsSL https://raw.githubusercontent.com/N-Erickson/AetherLink-SDR-MCP/main/install.sh | bash
Windows (PowerShell):
irm https://raw.githubusercontent.com/N-Erickson/AetherLink-SDR-MCP/main/install.ps1 | iex
The installer handles everything: system drivers, Python package, optional decoders, and Claude Desktop configuration.
Windows users: You also need Zadig to replace the RTL-SDR USB driver with WinUSB. The installer will walk you through this.
AetherLink requires RTL-SDR drivers installed at the system level:
| Tool | macOS | Ubuntu/Debian | Purpose |
|---|---|---|---|
| RTL-SDR | brew install rtl-sdr | sudo apt install rtl-sdr librtlsdr-dev | Required - SDR drivers |
| dump1090 | brew install dump1090-fa | sudo apt install dump1090-fa | Optional - ADS-B aircraft tracking |
| rtl_433 | brew install rtl_433 | sudo apt install rtl-433 | Optional - ISM band devices |
| SatDump | brew install satdump | PPA instructions | Optional - satellite imaging |
| multimon-ng | Built from source by installer | sudo apt install multimon-ng | Optional - POCSAG pagers |
git clone https://github.com/N-Erickson/AetherLink-SDR-MCP
cd AetherLink-SDR-MCP
python3 -m venv venv
source venv/bin/activate
pip install -e ".[dev]"
Edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or equivalent:
{
"mcpServers": {
"aetherlink": {
"command": "/path/to/AetherLink-SDR-MCP/venv/bin/python",
"args": ["-m", "sdr_mcp.server"],
"cwd": "/path/to/AetherLink-SDR-MCP"
}
}
}
Important: Replace /path/to/ with your actual path. Run which python with your venv activated to find the correct Python path.
Quit completely (Cmd+Q) and restart Claude Desktop to load the MCP server.
In Claude Desktop:
Connect to my RTL-SDR
You should see: "Successfully connected to RTL-SDR"
~/Library/Logs/Claude/mcp-server-aetherlink.log/etc/udev/rules.d/20-rtlsdr.rules) and blacklist the dvb_usb_rtl28xxu kernel module.| Device | RX Frequency | TX Support | Status | Tested |
|---|---|---|---|---|
| RTL-SDR | 24 MHz - 1766 MHz | ❌ | ✅ Stable | ✅ Yes |
| HackRF One | 1 MHz - 6 GHz | ✅ | ✅ Working | ⚠️ Limited |
| Nooelec E4000 | 55 MHz - 2300 MHz | ❌ | ✅ Stable | ✅ Yes |
| Protocol | Description | Status |
|---|---|---|
| ADS-B | Aircraft tracking | ✅ Ready |
| POCSAG | Pager decoding | ✅ Ready |
| AIS | Ship tracking | ✅ Ready |
| Meteor-M LRPT | Weather satellites (M2-3, M2-4) | ✅ Ready |
| ISM Band | 433MHz/315MHz devices | ✅ Ready |
ADS-B (1090 MHz):
dump1090 subprocess for demodulation and raw TCP outputduration=0 to run until stoppedPOCSAG (152/454/929 MHz):
multimon-ng for professional decodingAIS (161.975/162.025 MHz):
Meteor-M LRPT (137 MHz):
satdump subprocess for OQPSK demodulationISM Band (433/315/868/915 MHz):
rtl_433 subprocess for decodingsdr_connect - Connect to RTL-SDR or HackRFsdr_disconnect - Disconnect from SDRsdr_set_frequency - Set center frequency in Hzsdr_set_gain - Set gain (dB or 'auto')sdr_get_status - Get hardware statusaviation_track_aircraft - Start ADS-B tracking on 1090 MHzaviation_stop_tracking - Stop trackingaviation_get_aircraft - Get list of tracked aircraftpager_start_decoding - Start POCSAG decoderpager_stop_decoding - Stop decodingpager_get_messages - Get decoded messagesmarine_track_vessels - Start AIS ship trackingmarine_stop_tracking - Stop trackingmarine_get_vessels - Get vessel listsatellite_decode_meteor - Decode Meteor-M2-3/M2-4 LRPT satellite passism_start_scanning - Start scanning ISM bands (433/315/868/915 MHz) with multi-frequency hoppingism_stop_scanning - Stop ISM band scanningism_get_devices - Get detected devices (weather stations, sensors, etc.)spectrum_analyze - Analyze RF spectrum (FFT, signal detection)spectrum_scan - Scan frequency rangerecording_start/recording_stop - Record raw IQ samples (saved to /tmp/sdr_recordings/)audio_record_start/audio_record_stop - Record demodulated audio as WAV (FM/AM)hackrf_set_tx_gain - Set transmit gainsignal_generator - Generate and transmit signalsTrack aircraft in my area
After 30-60 seconds:
Show me the aircraft
Set frequency to 152.240 MHz
Start paging decoder at 1200 baud
Wait a few minutes, then:
Get pager messages
Note: Check RadioReference.com for active pager frequencies in your area.
Set frequency to 100 MHz
Analyze the spectrum
Scan from 430 MHz to 440 MHz with 1 MHz steps
Set frequency to 103.7 MHz
Start audio recording with FM modulation and description "Local FM station"
Wait for desired duration (e.g., 30 seconds), then:
Stop audio recording
Files saved to: /tmp/sdr_recordings/audio_YYYYMMDD_HHMMSS_XXXMHz_FM.wav
Set frequency to 103.7 MHz
Start recording with description "Raw baseband data"
Wait for desired duration, then:
Stop recording
Files saved to: /tmp/sdr_recordings/recording_YYYYMMDD_HHMMSS_XXXMHz.iq
Use case: Advanced analysis, replay, or processing with GNU Radio/SDR#
Decode Meteor-M2-4 satellite for 600 seconds
Requirements:
brew install satdump)What you get:
/tmp/sdr_recordings/meteor_METEOR-M2-4_*/Tips:
Start ISM scanning on 433.92 MHz and 315 MHz with 30 second hop interval
Wait 1-2 minutes for devices to transmit, then:
Show me the ISM devices
Common devices detected:
Tips:
[433.92, 315] or [868, 915]AetherLink-SDR-MCP/
├── sdr_mcp/
│ ├── server.py # Main MCP server (26 tools)
│ ├── __main__.py # python -m sdr_mcp entry point
│ ├── hardware/
│ │ ├── base.py # Abstract SDR device base class
│ │ ├── rtlsdr.py # RTL-SDR interface
│ │ └── hackrf.py # HackRF interface
│ ├── decoders/
│ │ ├── pocsag.py # POCSAG pager decoder
│ │ ├── ais.py # AIS ship decoder
│ │ ├── rtl433.py # ISM band device decoder
│ │ └── meteor_lrpt.py # Meteor-M LRPT satellite decoder
│ ├── analysis/
│ │ └── spectrum.py # Spectrum analysis, signal detection
│ └── utils/
│ └── validators.py # Input validation and safety checks
├── tests/ # All test scripts
├── pyproject.toml # Package configuration
└── readme.md # This file
Device Management:
Decoders:
dump1090 subprocess + pyModeS + optional hexdb.io lookuprtl_433 subprocess with JSON output + multi-frequency hoppingrtl_fm + multimon-ng pipelineReplace {MCP_ENDPOINT_URL} with this MCP’s endpoint URL (from its repo or docs above). No API key — you connect directly.
Tool
OS
Config file: ~/.cursor/mcp.json
{
"mcpServers": {
"mcp-server": {
"url": "{MCP_ENDPOINT_URL}"
}
}
}Paste into mcpServers in the config file. Restart Cursor after saving.
If this MCP is also published on mcpchannel.ai, you can subscribe from Browse and use the gateway config there instead.