nr_band_lookup
Find 3GPP 5G NR band information such as frequency range and duplex mode by providing a band name like n77 or n260.
Instructions
Look up 3GPP 5G NR band information by band name (e.g., n77, n260).
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| band | Yes | NR band name (e.g., 'n77', 'n260') |
Implementation Reference
- src/mcp_emc_regulations/tools/cellular.py:61-71 (registration)The Tool definition registering 'nr_band_lookup' with its schema (input: 'band' string). Listed in CellularTools.list_tools().
Tool( name="nr_band_lookup", description="Look up 3GPP 5G NR band information by band name (e.g., n77, n260).", inputSchema={ "type": "object", "properties": { "band": {"type": "string", "description": "NR band name (e.g., 'n77', 'n260')"}, }, "required": ["band"], }, ), - The handler function that executes the nr_band_lookup tool logic. Calls find_nr_band() and formats the result.
@staticmethod def _nr_band_lookup(arguments: dict[str, Any]) -> list[TextContent]: band_name = arguments["band"] band = find_nr_band(band_name) if band: result = f"5G NR Band {band['band']} ({band.get('name', 'Unknown')})\n{'=' * 40}\n\n" if "uplink_mhz" in band: result += f"Uplink: {band['uplink_mhz'][0]} - {band['uplink_mhz'][1]} MHz\n" result += f"Downlink: {band['downlink_mhz'][0]} - {band['downlink_mhz'][1]} MHz\n" elif "range_mhz" in band: result += f"Range: {band['range_mhz'][0]} - {band['range_mhz'][1]} MHz\n" result += f"Duplex: {band.get('duplex', 'Unknown')}\n" result += f"Max BW: {band.get('max_bandwidth_mhz', '?')} MHz\n" if "notes" in band: result += f"Notes: {band['notes']}\n" else: result = f"NR Band '{band_name}' not found. Use format 'n77', 'n260', etc." return [TextContent(type="text", text=result)] - Dispatch in CellularTools.call_tool() that routes 'nr_band_lookup' to _nr_band_lookup.
elif name == "nr_band_lookup": return self._nr_band_lookup(arguments) elif name == "nr_bands_list": return self._nr_bands_list(arguments) elif name == "frequency_to_band": return self._frequency_to_band(arguments) return [TextContent(type="text", text=f"Unknown cellular tool: {name}")] # ------------------------------------------------------------------ @staticmethod def _lte_band_lookup(arguments: dict[str, Any]) -> list[TextContent]: band_num = arguments["band"] band = find_lte_band(band_num) if band: result = f"LTE Band {band_num} ({band.get('name', 'Unknown')})\n{'=' * 40}\n\n" if band.get("uplink_mhz"): result += f"Uplink: {band['uplink_mhz'][0]} - {band['uplink_mhz'][1]} MHz\n" if band.get("downlink_mhz"): result += f"Downlink: {band['downlink_mhz'][0]} - {band['downlink_mhz'][1]} MHz\n" result += f"Duplex: {band.get('duplex', 'Unknown')}\n" result += f"Bandwidths: {', '.join(str(b) for b in band.get('bandwidth_mhz', []))} MHz\n" result += f"Regions: {', '.join(band.get('regions', []))}\n" if "notes" in band: result += f"Notes: {band['notes']}\n" else: result = f"LTE Band {band_num} not found in database." return [TextContent(type="text", text=result)] @staticmethod def _lte_bands_list(arguments: dict[str, Any]) -> list[TextContent]: region = arguments.get("region", "").lower() carrier = arguments.get("carrier", "").lower() if carrier: carrier_bands = LTE_BANDS.get("us_carrier_bands", {}).get(carrier, {}) if carrier_bands: result = f"LTE Bands for {carrier.upper()}\n{'=' * 40}\n\n" result += f"Primary bands: {', '.join(str(b) for b in carrier_bands.get('primary', []))}\n" result += f"LTE-M bands: {', '.join(str(b) for b in carrier_bands.get('lte_m', []))}\n" else: result = f"Carrier '{carrier}' not found. Available: att, verizon, tmobile" else: bands = LTE_BANDS.get("bands", []) if region: bands = [b for b in bands if region in [r.lower() for r in b.get("regions", [])]] result = f"LTE Bands{' (' + region.title() + ')' if region else ''}\n{'=' * 50}\n\n" for band in bands[:30]: ul = band.get("uplink_mhz", [0, 0]) dl = band.get("downlink_mhz", [0, 0]) result += f"Band {band['band']:>2}: {dl[0]:>4}-{dl[1]:<4} MHz ({band['duplex']}) {band.get('name', '')}\n" return [TextContent(type="text", text=result)] @staticmethod def _nr_band_lookup(arguments: dict[str, Any]) -> list[TextContent]: band_name = arguments["band"] band = find_nr_band(band_name) if band: result = f"5G NR Band {band['band']} ({band.get('name', 'Unknown')})\n{'=' * 40}\n\n" if "uplink_mhz" in band: result += f"Uplink: {band['uplink_mhz'][0]} - {band['uplink_mhz'][1]} MHz\n" result += f"Downlink: {band['downlink_mhz'][0]} - {band['downlink_mhz'][1]} MHz\n" elif "range_mhz" in band: result += f"Range: {band['range_mhz'][0]} - {band['range_mhz'][1]} MHz\n" result += f"Duplex: {band.get('duplex', 'Unknown')}\n" result += f"Max BW: {band.get('max_bandwidth_mhz', '?')} MHz\n" if "notes" in band: result += f"Notes: {band['notes']}\n" else: result = f"NR Band '{band_name}' not found. Use format 'n77', 'n260', etc." return [TextContent(type="text", text=result)] - Helper function that searches NR_BANDS (loaded from nr_bands.json) for a matching band name across FR1 and FR2 bands.
def find_nr_band(band_name: str) -> dict | None: """Find NR band by name (e.g., 'n77').""" band_name = band_name.lower() for band in NR_BANDS.get("fr1_bands", {}).get("bands", []): if band["band"].lower() == band_name: return band for band in NR_BANDS.get("fr2_bands", {}).get("bands", []): if band["band"].lower() == band_name: return band return None