12 Preinstalled
Available in the base gnuradio-runtime image: osmosdr, satellites, gsm, rds, fosphor, air_modes, etc.
Out-of-Tree (OOT) modules extend GNU Radio with specialized functionality like LoRa demodulation, ADS-B decoding, or hardware support. GR-MCP provides tools to discover, install, and combine OOT modules into Docker images.
GR-MCP includes a curated catalog of 24 OOT modules accessible via MCP resources:
# List all modules# Resource: oot://directory
# Get details for a specific module# Resource: oot://directory/lora_sdr12 Preinstalled
Available in the base gnuradio-runtime image: osmosdr, satellites, gsm, rds, fosphor, air_modes, etc.
12 Installable
Built on-demand: lora_sdr, ieee802_11, adsb, iridium, dab, nrsc5, etc.
| Category | Modules |
|---|---|
| Hardware | osmosdr, funcube, hpsdr, limesdr |
| Satellite | satellites, satnogs, iridium, leo |
| Cellular | gsm |
| Broadcast | rds, dab, dl5eu, nrsc5 |
| Aviation | air_modes, adsb |
| IoT | lora_sdr, ieee802_15_4 |
| WiFi | ieee802_11 |
| Analysis | iqbal, radar, inspector |
| Visualization | fosphor |
| Utility | foo |
Enable runtime mode (required for Docker operations)
enable_runtime_mode()Install the module
For catalog modules:
install_oot_module( git_url="https://github.com/tapparelj/gr-lora_sdr", branch="master")This:
gnuradio-lora_sdr-runtime:latestUse the new image
launch_flowgraph( flowgraph_path="lora_rx.py", image="gnuradio-lora_sdr-runtime:latest")Some modules need extra packages for compilation:
install_oot_module( git_url="https://github.com/hboeglen/gr-dab", branch="maint-3.10", build_deps=["autoconf", "automake", "libtool", "libfaad-dev"], cmake_args=["-DENABLE_DOXYGEN=OFF"])GR-MCP can analyze flowgraphs to identify OOT dependencies:
detect_oot_modules(flowgraph_path="lora_rx.py")# Returns OOTDetectionResult:# detected_modules: ["lora_sdr"]# unknown_blocks: []# recommended_image: "gnuradio-lora_sdr-runtime:latest"For .grc files, detection uses prefix matching against the catalog.
For .py files, it parses Python imports for more accuracy.
The simplest approach: let GR-MCP handle everything:
launch_flowgraph( flowgraph_path="lora_rx.py", auto_image=True)This automatically:
Some flowgraphs need multiple OOT modules. Create a combo image:
build_multi_oot_image(module_names=["lora_sdr", "adsb"])# Returns ComboImageResult:# success: True# image: ComboImageInfo(# combo_key: "combo:adsb+lora_sdr",# image_tag: "gr-combo-adsb-lora_sdr:latest",# modules: ["adsb", "lora_sdr"]# )Missing modules are auto-built from the catalog.
launch_flowgraph( flowgraph_path="multi_protocol_rx.py", image="gr-combo-adsb-lora_sdr:latest")Or use auto-detection:
detect_oot_modules("multi_protocol_rx.py")# detected_modules: ["lora_sdr", "adsb"]# recommended_image: "gr-combo-adsb-lora_sdr:latest"# List installed OOT imageslist_oot_images()# Returns: [OOTImageInfo(module_name="lora_sdr", image_tag="..."), ...]
# List combo imageslist_combo_images()# Returns: [ComboImageInfo(combo_key="combo:adsb+lora_sdr", ...)]
# Remove a single-module imageremove_oot_image(module_name="lora_sdr")
# Remove a combo imageremove_combo_image(combo_key="combo:adsb+lora_sdr")For flowgraph design (without Docker), load OOT block definitions:
# Add a path containing .block.yml filesadd_block_path("/usr/local/share/gnuradio/grc/blocks")
# Check current paths and block countget_block_paths()# Returns BlockPathsModel with paths and total_blocks
# Load multiple paths at onceload_oot_blocks(paths=[ "/usr/local/share/gnuradio/grc/blocks", "/home/user/gr-modules/lib/grc"])Complete workflow for receiving LoRa packets:
# 1. Enable runtime modeenable_runtime_mode()
# 2. Check if lora_sdr is available# Resource: oot://directory/lora_sdr# -> preinstalled: False, installed: False
# 3. Install the moduleinstall_oot_module( git_url="https://github.com/tapparelj/gr-lora_sdr", branch="master")# -> image_tag: "gnuradio-lora_sdr-runtime:latest"
# 4. Load blocks for designadd_block_path("/usr/local/share/gnuradio/grc/blocks")
# 5. Build the flowgraphmake_block(block_type="lora_sdr_lora_sdr_lora_rx")# ... configure and connect ...
# 6. Generate codegenerate_code(output_dir="/tmp")
# 7. Launch with the new imagelaunch_flowgraph( flowgraph_path="/tmp/lora_rx.py", name="lora-receiver", image="gnuradio-lora_sdr-runtime:latest", device_paths=["/dev/bus/usb"])GR-MCP can also create OOT modules from scratch using the block development tools:
Enable block dev mode
enable_block_dev_mode()Generate a block
result = generate_sync_block( name="my_filter", description="Custom bandpass filter", input_signature=[{"dtype": "complex", "vlen": 1}], output_signature=[{"dtype": "complex", "vlen": 1}],)Generate GRC YAML (for GUI integration)
yaml_result = generate_grc_yaml( source_code=result.source_code, block_name="my_filter", module_name="custom", category="Filters")Export to OOT module
export_block_to_oot( source_code=result.source_code, block_name="my_filter", module_name="custom", output_dir="/tmp/gr-custom")# Creates: CMakeLists.txt, python/custom/my_filter.py, grc/custom_my_filter.block.ymlBuild as Docker image (for container deployment)
enable_runtime_mode()install_oot_module( git_url="file:///tmp/gr-custom", branch="main")