frequency_conflict_check
Check frequency conflicts and coexistence issues for multi-radio designs, identifying overlapping bands, restricted band conflicts, and harmonic issues.
Instructions
Analyze frequency conflicts and coexistence issues for multi-radio designs. Identifies overlapping bands, restricted band conflicts, and harmonic issues.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| radios | Yes | List of radio technologies (e.g., ['wifi_2.4ghz', 'ble', 'lte_band_7', 'gps']) |
Implementation Reference
- Tool schema/registration for 'frequency_conflict_check' in AdvisorTools.list_tools(). Defines the tool name, description, and inputSchema (accepts 'radios' array).
Tool( name="frequency_conflict_check", description=( "Analyze frequency conflicts and coexistence issues for multi-radio designs. " "Identifies overlapping bands, restricted band conflicts, and harmonic issues." ), inputSchema={ "type": "object", "properties": { "radios": { "type": "array", "items": {"type": "string"}, "description": "List of radio technologies (e.g., ['wifi_2.4ghz', 'ble', 'lte_band_7', 'gps'])", }, }, "required": ["radios"], }, ), Tool( name="test_plan_generator", description=( "Generate a comprehensive EMC/RF test plan for a product. " "Covers emissions, immunity, RF performance, and safety based on target markets and product type." ), inputSchema={ "type": "object", "properties": { "product_type": { "type": "string", "enum": ["wifi_module", "ble_module", "wifi_ble_combo", "cellular_module", "lora_module", "automotive_ecu", "iot_gateway", "medical_device"], "description": "Product type", }, "markets": { "type": "array", "items": {"type": "string"}, "description": "Target markets", }, "environment": { "type": "string", "enum": ["residential", "industrial", "automotive", "medical"], "description": "Target environment for immunity levels", }, }, "required": ["product_type", "markets"], }, ), Tool( name="standard_cross_reference", description=( "Find equivalent standards across different markets. " "E.g., CISPR 32 equivalents: FCC Part 15B (US), ICES-003 (CA), EN 55032 (EU), VCCI (JP), KN 32 (KR)." ), inputSchema={ "type": "object", "properties": { "category": { "type": "string", "enum": ["emissions_it_av", "emissions_industrial", "emissions_automotive_component", "emissions_automotive_vehicle", "immunity_generic", "immunity_it_av", "immunity_automotive", "safety_it_av", "safety_medical", "wireless_2_4ghz", "wireless_5ghz", "wireless_sub_1ghz", "all"], "description": "Standard category to cross-reference", }, "market": { "type": "string", "description": "Filter by specific market (us, eu, japan, korea, china, etc.)", }, }, }, ), ] - src/mcp_emc_regulations/tools/advisor.py:124-133 (registration)Tool routing in AdvisorTools.call_tool(). Routes name 'frequency_conflict_check' to self._frequency_conflict().
async def call_tool(self, name: str, arguments: dict[str, Any]) -> list[TextContent]: if name == "product_certification_advisor": return self._certification_advisor(arguments) elif name == "frequency_conflict_check": return self._frequency_conflict(arguments) elif name == "test_plan_generator": return self._test_plan(arguments) elif name == "standard_cross_reference": return self._cross_reference(arguments) return [TextContent(type="text", text=f"Unknown advisor tool: {name}")] - Handler function _frequency_conflict(). Analyzes frequency conflicts/overlaps between radios, checks restricted bands, and performs harmonic analysis using the freq_map dictionary and RESTRICTED data.
@staticmethod def _frequency_conflict(arguments: dict[str, Any]) -> list[TextContent]: radios = arguments["radios"] result = "Frequency Conflict Analysis\n" + "=" * 55 + "\n\n" result += f"Radios: {', '.join(radios)}\n\n" # Map radio names to frequency ranges radio_freqs: list[dict] = [] radio_lower = [r.lower() for r in radios] freq_map = { "wifi_2.4ghz": {"name": "WiFi 2.4 GHz", "freq": [2400, 2483.5]}, "wifi_5ghz": {"name": "WiFi 5 GHz", "freq": [5150, 5850]}, "wifi_6ghz": {"name": "WiFi 6 GHz", "freq": [5925, 7125]}, "wifi_6e": {"name": "WiFi 6E", "freq": [5925, 7125]}, "ble": {"name": "BLE", "freq": [2402, 2480]}, "bluetooth": {"name": "Bluetooth", "freq": [2402, 2480]}, "zigbee": {"name": "Zigbee 2.4 GHz", "freq": [2400, 2483.5]}, "zigbee_868": {"name": "Zigbee 868 MHz", "freq": [868, 868.6]}, "thread": {"name": "Thread 2.4 GHz", "freq": [2400, 2483.5]}, "lora_us": {"name": "LoRa US", "freq": [902, 928]}, "lora_eu": {"name": "LoRa EU", "freq": [863, 870]}, "lora": {"name": "LoRa US", "freq": [902, 928]}, "uwb": {"name": "UWB", "freq": [6489, 6990]}, "gps": {"name": "GPS L1", "freq": [1575.42, 1575.42]}, "gnss": {"name": "GNSS", "freq": [1164, 1610]}, "lte_band_2": {"name": "LTE Band 2", "freq": [1850, 1990]}, "lte_band_4": {"name": "LTE Band 4", "freq": [1710, 2155]}, "lte_band_7": {"name": "LTE Band 7", "freq": [2500, 2690]}, "lte_band_12": {"name": "LTE Band 12", "freq": [699, 746]}, "lte_band_13": {"name": "LTE Band 13", "freq": [746, 787]}, "lte_band_41": {"name": "LTE Band 41", "freq": [2496, 2690]}, "lte_band_48": {"name": "CBRS Band 48", "freq": [3550, 3700]}, "nr_n77": {"name": "5G n77", "freq": [3300, 4200]}, "nr_n78": {"name": "5G n78", "freq": [3300, 3800]}, "nr_n260": {"name": "5G n260", "freq": [37000, 40000]}, "nr_n261": {"name": "5G n261", "freq": [27500, 28350]}, } for r in radio_lower: if r in freq_map: radio_freqs.append(freq_map[r]) else: # Try fuzzy match for key, val in freq_map.items(): if key in r or r in key: radio_freqs.append(val) break if not radio_freqs: result += "Could not determine frequencies for the provided radio names.\n" result += "Try using specific names like: wifi_2.4ghz, ble, lora_us, lte_band_7, gps, uwb\n" return [TextContent(type="text", text=result)] result += "## Frequency Allocations:\n" for rf in radio_freqs: result += f" {rf['name']}: {rf['freq'][0]}-{rf['freq'][1]} MHz\n" # Check overlaps conflicts = [] for i, r1 in enumerate(radio_freqs): for r2 in radio_freqs[i + 1:]: if r1["freq"][0] <= r2["freq"][1] and r2["freq"][0] <= r1["freq"][1]: overlap_start = max(r1["freq"][0], r2["freq"][0]) overlap_end = min(r1["freq"][1], r2["freq"][1]) conflicts.append({ "radio1": r1["name"], "radio2": r2["name"], "overlap": [overlap_start, overlap_end], }) if conflicts: result += "\n## Frequency Conflicts:\n" for c in conflicts: result += f" WARNING: {c['radio1']} and {c['radio2']} overlap at {c['overlap'][0]}-{c['overlap'][1]} MHz\n" if "WiFi 2.4" in c["radio1"] and "BLE" in c["radio2"] or "BLE" in c["radio1"] and "WiFi 2.4" in c["radio2"]: result += " Mitigation: Coexistence arbitration (time-sharing, frequency hopping). Common in combo chips.\n" elif "WiFi 2.4" in c["radio1"] and "Zigbee" in c["radio2"] or "Zigbee" in c["radio1"] and "WiFi 2.4" in c["radio2"]: result += " Mitigation: Use non-overlapping channels (WiFi ch1 + Zigbee ch26). Consider CSMA/CA timing.\n" elif "LTE Band 7" in c["radio1"] and "LTE Band 41" in c["radio2"] or "LTE Band 41" in c["radio1"] and "LTE Band 7" in c["radio2"]: result += " Mitigation: Adjacent band filtering. Check 3GPP coexistence specs.\n" else: result += "\n## No direct frequency conflicts detected.\n" # Check restricted band interactions restricted_bands = RESTRICTED.get("restricted_bands", []) result += "\n## Restricted Band Check:\n" has_restricted = False for rf in radio_freqs: for band in restricted_bands: if rf["freq"][0] <= band["freq_max_mhz"] and band["freq_min_mhz"] <= rf["freq"][1]: result += f" CAUTION: {rf['name']} overlaps FCC restricted band {band['freq_min_mhz']}-{band['freq_max_mhz']} MHz ({band['service']})\n" has_restricted = True if not has_restricted: result += " No restricted band conflicts.\n" # Harmonic analysis for fundamental frequencies result += "\n## Harmonic Considerations:\n" for rf in radio_freqs: fundamental = rf["freq"][0] if fundamental < 1000: h2 = fundamental * 2 h3 = fundamental * 3 result += f" {rf['name']} harmonics: 2nd={h2:.0f} MHz, 3rd={h3:.0f} MHz\n" # Check if harmonics fall in other radio bands or GPS for rf2 in radio_freqs: if rf2 is not rf: if rf2["freq"][0] <= h2 <= rf2["freq"][1]: result += f" WARNING: 2nd harmonic falls in {rf2['name']} band\n" if rf2["freq"][0] <= h3 <= rf2["freq"][1]: result += f" WARNING: 3rd harmonic falls in {rf2['name']} band\n" return [TextContent(type="text", text=result)] - Helper data loaded at module level: RESTRICTED = load_json('restricted_bands.json') used in restricted band check within _frequency_conflict.
CERT_MATRIX = load_json("certification_matrix.json") XREF = load_json("standard_cross_references.json") WIFI = load_json("wifi_standards.json") BLUETOOTH = load_json("bluetooth_standards.json") SHORT_RANGE = load_json("short_range_wireless.json") RESTRICTED = load_json("restricted_bands.json") - Reference to frequency_conflict_check in the standards list description string (informational only).
result += " frequency_conflict_check - Multi-radio coexistence\n" result += " test_plan_generator - Complete test plan\n" result += " standard_cross_reference - Equivalent standards across markets\n"