fishball-sdr-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| SDR_MCP_URI | No | Where the board is | ip:192.168.2.1 |
| SDR_MCP_TIMEOUT | No | Socket timeout, seconds | 10 |
| SDR_MCP_ALLOW_TX | No | Set to '1' to permit transmitting | |
| SDR_MCP_TX_BANDS | No | Restrict TX, e.g. '2400-2483.5' (MHz) | |
| SDR_MCP_CAPTURE_DIR | No | Where sdr_capture_iq writes | ~/.cache/fishball-sdr |
| SDR_MCP_NO_TX_QUIESCE | No | Leave the transmitter exactly as found |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| sdr_get_statusA | Report how the SDR is currently configured: RX local oscillator, converter and delivered sample rates, whether the FPGA channel filter is engaged, RF bandwidth, gain, RSSI, die temperature and firmware version. Start here. |
| sdr_tx_chain_stateA | Report whether the AD9361's transmit chain is actually energised, and why. The board boots into ENSM 'fdd' with the TX synthesiser running and only 10 dB of attenuation, so TX is live from power-on even with no data in the DAC DMA - it emits LO leakage rather than silence. This tool shows the ENSM mode, TX LO powerdown state and both attenuator settings, and says plainly whether anything is being emitted. Use sdr_tx_disable to silence it. |
| sdr_list_devicesA | List every IIO device, channel and attribute the board exposes. Use this to discover exact names before calling sdr_read_attribute, or to check what a particular firmware build provides. |
| sdr_read_attributeA | Read any single IIO attribute by name - an escape hatch for anything the other tools do not cover. Use sdr_list_devices to find valid names. Reading an attribute called '_available' shows the legal values for ''. |
| sdr_board_healthA | Read the Zynq XADC: internal supply rails and die temperature. Useful for checking the board is healthy, or whether it is running hot. |
| sdr_tuneA | Set the receive local oscillator, in Hz. Valid range 70 MHz to 6 GHz. Note this tunes the LO, which becomes the CENTRE of the captured band. To keep the AD9361's LO leakage and DC offset out of a signal, tune deliberately off it and look at the resulting offset instead. |
| sdr_configure_rxA | Set any of: converter sample rate (Hz), RF analog bandwidth (Hz), gain control mode, and manual gain (dB). Omitted settings are left alone. Values are checked against the radio's own '*_available' attributes, so an illegal request is rejected with the legal options rather than silently ignored. Manual gain only applies when gain_mode is 'manual'. |
| sdr_set_fpga_filterA | Switch the FPGA's decimate-by-8 channel filter into or out of the receive path. On firmware built from this devkit's channelizer patch, engaging it selects a sharp FIR that removes everything outside the wanted channel, and drops the delivered rate to one eighth of the converter rate. It works by writing the cf-ad9361-lpc sample rate, which is what drives GP_CONTROL bit 0 and the bypass mux in the bitstream - there is no separate on/off attribute. Bypassing is the way to A/B whether the filter is really doing anything: a neighbouring signal that reappears when bypassed is the proof. |
| sdr_capture_iqA | Capture raw IQ samples and WRITE THEM TO A FILE, returning the path plus level statistics. Samples are never returned inline - even a short capture is megabytes. The file is interleaved little-endian int16 (I,Q,I,Q,...), which GNU Radio reads as a file source of type short, and which sdr_transmit_iq accepts directly. |
| sdr_spectrumA | Capture IQ and return the strongest signals as a table of frequency and level, with the noise floor and capture statistics, optionally with a compact ASCII plot. This is the tool for 'what is on this frequency right now'. Levels are dBFS referred to the 12-bit converter's full scale. Only the sample rate's worth of spectrum around the current LO is visible - use sdr_scan_band to cover more. |
| sdr_scan_bandA | Step the LO across a range and report the signals found, strongest first. Use it to discover what is receivable - for example which FM broadcast stations are audible at this location. The radio is left tuned to the last step, so re-tune afterwards if you care where it sits. A wide scan at a low sample rate takes many steps and is slow; raise the sample rate to cover ground faster at coarser resolution. |
| sdr_tx_statusA | Report what the transmitter is doing: whether transmitting is enabled at all, the TX LO and its powerdown state, sample rate, bandwidth, every DDS tone generator, and whether this server started a cyclic buffer that is still running. Always available, even when transmitting is disabled. |
| sdr_tx_disableA | Stop all transmission immediately: silence every DDS tone, close any sample buffer, and power down the TX local oscillator. Never gated - it works even when transmitting is otherwise disabled, because an off switch that can be unavailable is not an off switch. Safe to call at any time. |
| sdr_tx_toneA | Transmit a continuous single-tone carrier using the FPGA's DDS generators, at an offset from the TX local oscillator. TRANSMITS UNTIL STOPPED. Call sdr_tx_disable to stop it. Requires SDR_MCP_ALLOW_TX=1. Only transmit into a dummy load or on frequencies you are licensed to use. |
| sdr_transmit_iqA | Transmit an arbitrary IQ waveform read from a file on this machine. Formats: 'int16' interleaved little-endian I,Q (what sdr_capture_iq writes), 'complex64' (what a GNU Radio file sink writes), 'wav' (2 channels as I and Q), or 'auto' to infer from the extension. With cyclic=true the buffer REPEATS FOREVER and transmission continues after this call returns - use sdr_tx_disable to stop. With cyclic=false the buffer plays once. Requires SDR_MCP_ALLOW_TX=1. Only transmit into a dummy load or on frequencies you are licensed to use. |
| sdr_transmit_waveformA | Synthesise and transmit a test signal without needing an IQ file: a single tone, two tones (for intermodulation testing), a linear chirp, or band-limited noise. Always cyclic, so it repeats until sdr_tx_disable is called. Requires SDR_MCP_ALLOW_TX=1. Only transmit into a dummy load or on frequencies you are licensed to use. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 16 tools
Most tools have clearly distinct purposes, but sdr_tx_chain_state and sdr_tx_status overlap significantly by both reporting TX LO powerdown state and transmit-chain activity. Similarly, sdr_get_status and sdr_board_health both expose die temperature, which could cause selection confusion.
The names mostly follow a consistent sdr_<verb>_<noun> pattern, like sdr_capture_iq, sdr_configure_rx, and sdr_tx_disable. Minor deviations exist: sdr_spectrum and sdr_board_health are noun-style, and sdr_tx_tone vs sdr_transmit_iq mix 'tx' and 'transmit'.
Sixteen tools is slightly above the ideal range, but the count is reasonable for a full SDR server covering RX, TX, capture, scanning, and health diagnostics. Each tool addresses a real operational need rather than being redundant filler.
The RX path is well covered with tuning, configuration, filtering, capture, spectrum analysis, and scanning. However, the TX path lacks a dedicated tool to set the transmit LO frequency, which is a notable gap since TX tones and IQ transmission only operate relative to that LO.