Skip to content
Projects

kiritomp3/rtl-sdr-mcp has 6 GitHub stars and 0 forks. GitHot measured 0 stars in 24 hours. Last checked 2026-11-14 16:14 UTC. Last push 2026-11-10.

How these counts are measured

Measured star growth

in 24h
0
in 7 days
Collecting history
in 15 days
Collecting history
in 1 month
Collecting history

Net star changes over overlapping periods, not daily totals. Missing measurements are left blank. Stars measure attention, not software quality.

About

Give your LLM agent a real radio: MCP server for RTL-SDR — spectrum, waterfall images, demodulation, speech-to-text, ISM decoding

AI

README.md

Original

rtl-sdr-mcp

Give your LLM agent a real radio. An MCP server that turns a $30 RTL-SDR dongle into tools an AI agent can use on its own: sweep the spectrum, look at waterfalls, demodulate and transcribe audio, watch for intermittent transmitters and decode ISM devices.

tests python license

rtl-sdr-mcp

Most SDR + AI projects pipe recordings into an LLM after the fact. Here the model drives the receiver. It picks frequencies, chooses what to look at, forms hypotheses about unknown signals and tests them. Spectra, waterfalls and audio spectrograms come back as images, so a multimodal model reasons about signal shape the way a human operator does.

A real session

Prompt: "There is an intermittent transmitter near 434.55 MHz. Figure out what it is." (Claude, 10 tool calls, ~11 minutes. Translated and condensed from the original run.)

📡 waterfall(434.55 MHz, ±200 kHz, 20 s)       → nothing in 20 s: rare transmitter, watch longer
📡 activity_monitor(433.9–435.2 MHz, 5 min)    → faint bursts at 434.55; repeating mark at 434.25 every ~55 s;
                                                 steady unmodulated line at 434.60 = tuner spur
📡 decode_devices(434.55 MHz, 120 s)           → rtl_433 decodes nothing: not a standard sensor/remote
📡 waterfall(434.25 MHz, ±50 kHz, 20 s)        → 2.5 s burst, 5 narrow lines spaced 6 kHz (−12…+12 kHz):
                                                 carrier with sidebands
📡 listen(434.25 MHz, nfm, 60 s)               → noise + short ~6 kHz tone at 22–24 s, matches the burst

💬 Hypotheses: (1) standard ISM sensor: rejected, rtl_433 is silent. (2) tuner spur: true for 434.60 only,
   434.25 varies in time. (3) non-standard periodic transmitter (DIY / alarm): plausible, unproven.
   Next step: catch a burst at 434.55 with a longer narrow waterfall.

In the same run it scanned the FM band, found the one station with speech rather than music (from the audio spectrogram) and summarized the interview that was on air.

Tools

Tool What it does Returns
sdr_info Detects tuner, frequency range, gain JSON
spectrum_sweep Sweeps a range, finds signals above the noise floor and tags each with its likely band allocation JSON + spectrum image
waterfall Captures IQ around a frequency: occupied bandwidth, duty cycle, bursts, SNR JSON + waterfall image
listen Demodulates WFM / NFM / AM / USB / LSB, saves WAV, transcribes speech with whisper.cpp JSON + audio spectrogram
activity_monitor Repeated sweeps for minutes, finds transmitters that are only on now and then JSON + frequency × time map
decode_devices Decodes 200+ ISM protocols with rtl_433: weather stations, TPMS, doorbells, meters JSON
satellite_passes Upcoming Meteor-M (LRPT 137.9 MHz) and ISS (145.800 MHz) passes JSON

The radio is a single shared resource, so calls are serialized with a lock.

Quick start

1. Hardware. Any RTL2832U dongle (RTL-SDR Blog V3/V4, NooElec, a generic DVB-T stick). The stock whip antenna works for FM, 433 MHz and cellular. Put it near a window.

2. System tools

# macOS
brew install librtlsdr rtl_433 whisper-cpp
# Debian / Ubuntu
sudo apt install rtl-sdr rtl-433   # whisper.cpp: build from https://github.com/ggml-org/whisper.cpp

Speech-to-text is optional. To enable it, download a model:

mkdir -p ~/.cache/whisper && curl -L -o ~/.cache/whisper/ggml-small.bin \
  https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-small.bin

3. Install the server

uv tool install git+https://github.com/kiritomp3/rtl-sdr-mcp
# or: pipx install git+https://github.com/kiritomp3/rtl-sdr-mcp

4. Connect it to your agent

Claude Code:

claude mcp add sdr -e SDR_LAT=52.52 -e SDR_LON=13.40 -- sdr-mcp

Claude Desktop, Cursor and other MCP clients:

{
  "mcpServers": {
    "sdr": { "command": "sdr-mcp", "env": { "SDR_LAT": "52.52", "SDR_LON": "13.40" } }
  }
}

Then just ask:

  • "What's on the air around me? Survey 24–1100 MHz and explain the strongest signals."
  • "Find an FM station where people are talking right now and summarize it."
  • "Watch 433–435 MHz for 5 minutes and identify every device you catch."
  • "Is that narrow peak at 115 MHz a real transmitter or a spur? Prove it."
  • "When is the next good ISS pass? Listen to 145.800 during it."

Prefer fully autonomous runs? examples/agent.sh runs Claude Code headless and streams the agent's reasoning and tool calls to your terminal.

Configuration

Env var Default Meaning
SDR_DEVICE 0 rtl-sdr device index
SDR_GAIN tuner max Gain in dB
SDR_LAT, SDR_LON unset Your location, for satellite passes
SDR_DATA_DIR ~/rtl-sdr-mcp-data Where WAV recordings and TLE cache go
WHISPER_MODEL ~/.cache/whisper/ggml-small.bin whisper.cpp model

Supported tuners (auto-detected): R820T/T2, R828D, R860 (V4), E4000, FC0012, FC0013, FC2580.

How it works

flowchart LR
    A[LLM agent] -- MCP tool call --> S[sdr-mcp]
    S -- rtl_power --> P[spectrum / activity]
    S -- rtl_sdr IQ --> W[waterfall + stats]
    S -- rtl_fm --> L[audio] --> T[whisper.cpp]
    S -- rtl_433 --> D[device packets]
    P & W & L --> I[PNG images]
    I & T & D -- JSON + images --> A

The signal-processing helpers (peak finding, IQ spectrogram and burst statistics, activity detection) are plain NumPy and covered by hardware-free tests (pytest).

Roadmap

Ideas and PRs welcome:

  • capture_on_trigger: wait for a burst on a frequency and record it (IQ + waterfall)
  • Meteor-M LRPT image capture via SatDump, with the agent describing the weather it sees
  • Radiosonde tracking (400–406 MHz) and landing prediction
  • ADS-B (dump1090) aircraft tool
  • SoapySDR backend for HackRF / Airspy / SDRplay
  • Long-running "radio memory": continuous logging plus a semantic search tool

Legal

Receive-only. Rules on listening to and especially disclosing the content of non-broadcast transmissions differ by country. Know yours before you ask an agent to summarize what it hears.

License

MIT