{
  "profile": "MVP 0.2",
  "capabilities": [
    {
      "name": "calculate_link",
      "description": "Calculate a reproducible free-space link budget and compare to the user-supplied margin and EIRP constraints",
      "effect": "read",
      "inputSchema": {
        "type": "object",
        "properties": {
          "frequencyMHz": {
            "type": "number",
            "minimum": 100,
            "maximum": 60000,
            "description": "Carrier frequency in MHz"
          },
          "distanceKm": {
            "type": "number",
            "minimum": 0.01,
            "maximum": 100,
            "description": "Path length in km"
          },
          "txPowerDbm": {
            "type": "number",
            "minimum": -30,
            "maximum": 50,
            "description": "Conducted transmitter power in dBm"
          },
          "txGainDbi": {
            "type": "number",
            "minimum": -10,
            "maximum": 40,
            "description": "Transmit antenna gain in dBi"
          },
          "rxGainDbi": {
            "type": "number",
            "minimum": -10,
            "maximum": 40,
            "description": "Receive antenna gain in dBi"
          },
          "txLossDb": {
            "type": "number",
            "minimum": 0,
            "maximum": 40,
            "description": "Transmit feedline loss in dB"
          },
          "rxLossDb": {
            "type": "number",
            "minimum": 0,
            "maximum": 40,
            "description": "Receive feedline loss in dB"
          },
          "extraLossDb": {
            "type": "number",
            "minimum": 0,
            "maximum": 80,
            "description": "Additional loss allowance in dB"
          },
          "sensitivityDbm": {
            "type": "number",
            "minimum": -150,
            "maximum": -10,
            "description": "Receiver threshold in dBm at the selected rate"
          },
          "targetMarginDb": {
            "type": "number",
            "minimum": 0,
            "maximum": 60,
            "description": "Desired reserve in dB"
          },
          "eirpLimitDbm": {
            "type": "number",
            "minimum": -30,
            "maximum": 80,
            "description": "User-entered EIRP design cap in dBm; not legal advice"
          }
        },
        "required": [
          "frequencyMHz",
          "distanceKm",
          "txPowerDbm",
          "txGainDbi",
          "rxGainDbi",
          "txLossDb",
          "rxLossDb",
          "extraLossDb",
          "sensitivityDbm",
          "targetMarginDb",
          "eirpLimitDbm"
        ],
        "additionalProperties": false
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "fsplDb": {
            "type": "number"
          },
          "eirpDbm": {
            "type": "number"
          },
          "receivedDbm": {
            "type": "number"
          },
          "marginDb": {
            "type": "number"
          },
          "headroomDb": {
            "type": "number"
          },
          "maxDistanceKm": {
            "type": "number"
          },
          "withinEirp": {
            "type": "boolean"
          },
          "meetsMargin": {
            "type": "boolean"
          },
          "radioPass": {
            "type": "boolean"
          },
          "formula": {
            "type": "string"
          },
          "model": {
            "type": "string"
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "required": [
          "fsplDb",
          "eirpDbm",
          "receivedDbm",
          "marginDb",
          "headroomDb",
          "maxDistanceKm",
          "withinEirp",
          "meetsMargin",
          "radioPass",
          "formula",
          "model",
          "assumptions"
        ]
      }
    },
    {
      "name": "compare_options",
      "description": "Compare up to eight explicit radio configurations, holding unspecified values constant",
      "effect": "read",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scenario": {
            "type": "object",
            "properties": {
              "frequencyMHz": {
                "type": "number",
                "minimum": 100,
                "maximum": 60000,
                "description": "Carrier frequency in MHz"
              },
              "distanceKm": {
                "type": "number",
                "minimum": 0.01,
                "maximum": 100,
                "description": "Path length in km"
              },
              "txPowerDbm": {
                "type": "number",
                "minimum": -30,
                "maximum": 50,
                "description": "Conducted transmitter power in dBm"
              },
              "txGainDbi": {
                "type": "number",
                "minimum": -10,
                "maximum": 40,
                "description": "Transmit antenna gain in dBi"
              },
              "rxGainDbi": {
                "type": "number",
                "minimum": -10,
                "maximum": 40,
                "description": "Receive antenna gain in dBi"
              },
              "txLossDb": {
                "type": "number",
                "minimum": 0,
                "maximum": 40,
                "description": "Transmit feedline loss in dB"
              },
              "rxLossDb": {
                "type": "number",
                "minimum": 0,
                "maximum": 40,
                "description": "Receive feedline loss in dB"
              },
              "extraLossDb": {
                "type": "number",
                "minimum": 0,
                "maximum": 80,
                "description": "Additional loss allowance in dB"
              },
              "sensitivityDbm": {
                "type": "number",
                "minimum": -150,
                "maximum": -10,
                "description": "Receiver threshold in dBm at the selected rate"
              },
              "targetMarginDb": {
                "type": "number",
                "minimum": 0,
                "maximum": 60,
                "description": "Desired reserve in dB"
              },
              "eirpLimitDbm": {
                "type": "number",
                "minimum": -30,
                "maximum": 80,
                "description": "User-entered EIRP design cap in dBm; not legal advice"
              }
            },
            "required": [
              "frequencyMHz",
              "distanceKm",
              "txPowerDbm",
              "txGainDbi",
              "rxGainDbi",
              "txLossDb",
              "rxLossDb",
              "extraLossDb",
              "sensitivityDbm",
              "targetMarginDb",
              "eirpLimitDbm"
            ],
            "additionalProperties": false
          },
          "options": {
            "type": "array",
            "minItems": 1,
            "maxItems": 8,
            "items": {
              "type": "object",
              "properties": {
                "label": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 80
                },
                "changes": {
                  "type": "object",
                  "properties": {
                    "frequencyMHz": {
                      "type": "number",
                      "minimum": 100,
                      "maximum": 60000,
                      "description": "Carrier frequency in MHz"
                    },
                    "distanceKm": {
                      "type": "number",
                      "minimum": 0.01,
                      "maximum": 100,
                      "description": "Path length in km"
                    },
                    "txPowerDbm": {
                      "type": "number",
                      "minimum": -30,
                      "maximum": 50,
                      "description": "Conducted transmitter power in dBm"
                    },
                    "txGainDbi": {
                      "type": "number",
                      "minimum": -10,
                      "maximum": 40,
                      "description": "Transmit antenna gain in dBi"
                    },
                    "rxGainDbi": {
                      "type": "number",
                      "minimum": -10,
                      "maximum": 40,
                      "description": "Receive antenna gain in dBi"
                    },
                    "txLossDb": {
                      "type": "number",
                      "minimum": 0,
                      "maximum": 40,
                      "description": "Transmit feedline loss in dB"
                    },
                    "rxLossDb": {
                      "type": "number",
                      "minimum": 0,
                      "maximum": 40,
                      "description": "Receive feedline loss in dB"
                    },
                    "extraLossDb": {
                      "type": "number",
                      "minimum": 0,
                      "maximum": 80,
                      "description": "Additional loss allowance in dB"
                    },
                    "sensitivityDbm": {
                      "type": "number",
                      "minimum": -150,
                      "maximum": -10,
                      "description": "Receiver threshold in dBm at the selected rate"
                    },
                    "targetMarginDb": {
                      "type": "number",
                      "minimum": 0,
                      "maximum": 60,
                      "description": "Desired reserve in dB"
                    },
                    "eirpLimitDbm": {
                      "type": "number",
                      "minimum": -30,
                      "maximum": 80,
                      "description": "User-entered EIRP design cap in dBm; not legal advice"
                    }
                  },
                  "required": [],
                  "additionalProperties": false
                }
              },
              "required": [
                "label",
                "changes"
              ],
              "additionalProperties": false
            }
          }
        },
        "required": [
          "scenario",
          "options"
        ],
        "additionalProperties": false
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "baseline": {
            "type": "object",
            "properties": {
              "fsplDb": {
                "type": "number"
              },
              "eirpDbm": {
                "type": "number"
              },
              "receivedDbm": {
                "type": "number"
              },
              "marginDb": {
                "type": "number"
              },
              "headroomDb": {
                "type": "number"
              },
              "maxDistanceKm": {
                "type": "number"
              },
              "withinEirp": {
                "type": "boolean"
              },
              "meetsMargin": {
                "type": "boolean"
              },
              "radioPass": {
                "type": "boolean"
              },
              "formula": {
                "type": "string"
              },
              "model": {
                "type": "string"
              },
              "assumptions": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            },
            "required": [
              "fsplDb",
              "eirpDbm",
              "receivedDbm",
              "marginDb",
              "headroomDb",
              "maxDistanceKm",
              "withinEirp",
              "meetsMargin",
              "radioPass",
              "formula",
              "model",
              "assumptions"
            ]
          },
          "options": {
            "type": "array",
            "minItems": 1,
            "maxItems": 8,
            "items": {
              "type": "object",
              "properties": {
                "label": {
                  "type": "string"
                },
                "input": {
                  "type": "object",
                  "properties": {
                    "frequencyMHz": {
                      "type": "number",
                      "minimum": 100,
                      "maximum": 60000,
                      "description": "Carrier frequency in MHz"
                    },
                    "distanceKm": {
                      "type": "number",
                      "minimum": 0.01,
                      "maximum": 100,
                      "description": "Path length in km"
                    },
                    "txPowerDbm": {
                      "type": "number",
                      "minimum": -30,
                      "maximum": 50,
                      "description": "Conducted transmitter power in dBm"
                    },
                    "txGainDbi": {
                      "type": "number",
                      "minimum": -10,
                      "maximum": 40,
                      "description": "Transmit antenna gain in dBi"
                    },
                    "rxGainDbi": {
                      "type": "number",
                      "minimum": -10,
                      "maximum": 40,
                      "description": "Receive antenna gain in dBi"
                    },
                    "txLossDb": {
                      "type": "number",
                      "minimum": 0,
                      "maximum": 40,
                      "description": "Transmit feedline loss in dB"
                    },
                    "rxLossDb": {
                      "type": "number",
                      "minimum": 0,
                      "maximum": 40,
                      "description": "Receive feedline loss in dB"
                    },
                    "extraLossDb": {
                      "type": "number",
                      "minimum": 0,
                      "maximum": 80,
                      "description": "Additional loss allowance in dB"
                    },
                    "sensitivityDbm": {
                      "type": "number",
                      "minimum": -150,
                      "maximum": -10,
                      "description": "Receiver threshold in dBm at the selected rate"
                    },
                    "targetMarginDb": {
                      "type": "number",
                      "minimum": 0,
                      "maximum": 60,
                      "description": "Desired reserve in dB"
                    },
                    "eirpLimitDbm": {
                      "type": "number",
                      "minimum": -30,
                      "maximum": 80,
                      "description": "User-entered EIRP design cap in dBm; not legal advice"
                    }
                  },
                  "required": [
                    "frequencyMHz",
                    "distanceKm",
                    "txPowerDbm",
                    "txGainDbi",
                    "rxGainDbi",
                    "txLossDb",
                    "rxLossDb",
                    "extraLossDb",
                    "sensitivityDbm",
                    "targetMarginDb",
                    "eirpLimitDbm"
                  ],
                  "additionalProperties": false
                },
                "marginChangeDb": {
                  "type": "number"
                },
                "fsplDb": {
                  "type": "number"
                },
                "eirpDbm": {
                  "type": "number"
                },
                "receivedDbm": {
                  "type": "number"
                },
                "marginDb": {
                  "type": "number"
                },
                "headroomDb": {
                  "type": "number"
                },
                "maxDistanceKm": {
                  "type": "number"
                },
                "withinEirp": {
                  "type": "boolean"
                },
                "meetsMargin": {
                  "type": "boolean"
                },
                "radioPass": {
                  "type": "boolean"
                },
                "formula": {
                  "type": "string"
                },
                "model": {
                  "type": "string"
                },
                "assumptions": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              },
              "required": [
                "label",
                "input",
                "marginChangeDb",
                "fsplDb",
                "eirpDbm",
                "receivedDbm",
                "marginDb",
                "headroomDb",
                "maxDistanceKm",
                "withinEirp",
                "meetsMargin",
                "radioPass",
                "formula",
                "model",
                "assumptions"
              ]
            }
          }
        },
        "required": [
          "baseline",
          "options"
        ]
      }
    },
    {
      "name": "find_feasible",
      "description": "Enumerate finite antenna-gain and transmitter-power candidates; minimize equal antenna gain, then transmit power",
      "effect": "read",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scenario": {
            "type": "object",
            "properties": {
              "frequencyMHz": {
                "type": "number",
                "minimum": 100,
                "maximum": 60000,
                "description": "Carrier frequency in MHz"
              },
              "distanceKm": {
                "type": "number",
                "minimum": 0.01,
                "maximum": 100,
                "description": "Path length in km"
              },
              "txPowerDbm": {
                "type": "number",
                "minimum": -30,
                "maximum": 50,
                "description": "Conducted transmitter power in dBm"
              },
              "txGainDbi": {
                "type": "number",
                "minimum": -10,
                "maximum": 40,
                "description": "Transmit antenna gain in dBi"
              },
              "rxGainDbi": {
                "type": "number",
                "minimum": -10,
                "maximum": 40,
                "description": "Receive antenna gain in dBi"
              },
              "txLossDb": {
                "type": "number",
                "minimum": 0,
                "maximum": 40,
                "description": "Transmit feedline loss in dB"
              },
              "rxLossDb": {
                "type": "number",
                "minimum": 0,
                "maximum": 40,
                "description": "Receive feedline loss in dB"
              },
              "extraLossDb": {
                "type": "number",
                "minimum": 0,
                "maximum": 80,
                "description": "Additional loss allowance in dB"
              },
              "sensitivityDbm": {
                "type": "number",
                "minimum": -150,
                "maximum": -10,
                "description": "Receiver threshold in dBm at the selected rate"
              },
              "targetMarginDb": {
                "type": "number",
                "minimum": 0,
                "maximum": 60,
                "description": "Desired reserve in dB"
              },
              "eirpLimitDbm": {
                "type": "number",
                "minimum": -30,
                "maximum": 80,
                "description": "User-entered EIRP design cap in dBm; not legal advice"
              }
            },
            "required": [
              "frequencyMHz",
              "distanceKm",
              "txPowerDbm",
              "txGainDbi",
              "rxGainDbi",
              "txLossDb",
              "rxLossDb",
              "extraLossDb",
              "sensitivityDbm",
              "targetMarginDb",
              "eirpLimitDbm"
            ],
            "additionalProperties": false
          },
          "gainCandidates": {
            "type": "array",
            "items": {
              "type": "number",
              "minimum": -10,
              "maximum": 40,
              "description": "Equal gain at both ends"
            },
            "minItems": 1,
            "maxItems": 30,
            "uniqueItems": true
          },
          "txPowerCandidates": {
            "type": "array",
            "items": {
              "type": "number",
              "minimum": -30,
              "maximum": 50,
              "description": "Conducted power"
            },
            "minItems": 1,
            "maxItems": 30,
            "uniqueItems": true
          }
        },
        "required": [
          "scenario",
          "gainCandidates",
          "txPowerCandidates"
        ],
        "additionalProperties": false
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "objective": {
            "type": "string"
          },
          "tested": {
            "type": "integer",
            "minimum": 1,
            "maximum": 900
          },
          "feasibleCount": {
            "type": "integer",
            "minimum": 0,
            "maximum": 900
          },
          "best": {
            "anyOf": [
              {
                "type": "null"
              },
              {
                "type": "object",
                "properties": {
                  "gainDbi": {
                    "type": "number"
                  },
                  "powerDbm": {
                    "type": "number"
                  },
                  "result": {
                    "type": "object",
                    "properties": {
                      "fsplDb": {
                        "type": "number"
                      },
                      "eirpDbm": {
                        "type": "number"
                      },
                      "receivedDbm": {
                        "type": "number"
                      },
                      "marginDb": {
                        "type": "number"
                      },
                      "headroomDb": {
                        "type": "number"
                      },
                      "maxDistanceKm": {
                        "type": "number"
                      },
                      "withinEirp": {
                        "type": "boolean"
                      },
                      "meetsMargin": {
                        "type": "boolean"
                      },
                      "radioPass": {
                        "type": "boolean"
                      },
                      "formula": {
                        "type": "string"
                      },
                      "model": {
                        "type": "string"
                      },
                      "assumptions": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      }
                    },
                    "required": [
                      "fsplDb",
                      "eirpDbm",
                      "receivedDbm",
                      "marginDb",
                      "headroomDb",
                      "maxDistanceKm",
                      "withinEirp",
                      "meetsMargin",
                      "radioPass",
                      "formula",
                      "model",
                      "assumptions"
                    ]
                  },
                  "input": {
                    "type": "object",
                    "properties": {
                      "frequencyMHz": {
                        "type": "number",
                        "minimum": 100,
                        "maximum": 60000,
                        "description": "Carrier frequency in MHz"
                      },
                      "distanceKm": {
                        "type": "number",
                        "minimum": 0.01,
                        "maximum": 100,
                        "description": "Path length in km"
                      },
                      "txPowerDbm": {
                        "type": "number",
                        "minimum": -30,
                        "maximum": 50,
                        "description": "Conducted transmitter power in dBm"
                      },
                      "txGainDbi": {
                        "type": "number",
                        "minimum": -10,
                        "maximum": 40,
                        "description": "Transmit antenna gain in dBi"
                      },
                      "rxGainDbi": {
                        "type": "number",
                        "minimum": -10,
                        "maximum": 40,
                        "description": "Receive antenna gain in dBi"
                      },
                      "txLossDb": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 40,
                        "description": "Transmit feedline loss in dB"
                      },
                      "rxLossDb": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 40,
                        "description": "Receive feedline loss in dB"
                      },
                      "extraLossDb": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 80,
                        "description": "Additional loss allowance in dB"
                      },
                      "sensitivityDbm": {
                        "type": "number",
                        "minimum": -150,
                        "maximum": -10,
                        "description": "Receiver threshold in dBm at the selected rate"
                      },
                      "targetMarginDb": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 60,
                        "description": "Desired reserve in dB"
                      },
                      "eirpLimitDbm": {
                        "type": "number",
                        "minimum": -30,
                        "maximum": 80,
                        "description": "User-entered EIRP design cap in dBm; not legal advice"
                      }
                    },
                    "required": [
                      "frequencyMHz",
                      "distanceKm",
                      "txPowerDbm",
                      "txGainDbi",
                      "rxGainDbi",
                      "txLossDb",
                      "rxLossDb",
                      "extraLossDb",
                      "sensitivityDbm",
                      "targetMarginDb",
                      "eirpLimitDbm"
                    ],
                    "additionalProperties": false
                  },
                  "feasible": {
                    "type": "boolean"
                  }
                },
                "required": [
                  "gainDbi",
                  "powerDbm",
                  "result",
                  "input",
                  "feasible"
                ]
              }
            ]
          },
          "candidates": {
            "type": "array",
            "minItems": 1,
            "maxItems": 900
          },
          "scope": {
            "type": "string"
          }
        },
        "required": [
          "objective",
          "tested",
          "feasibleCount",
          "best",
          "candidates",
          "scope"
        ]
      }
    },
    {
      "name": "sweep_distance",
      "description": "Calculate a bounded free-space distance sensitivity sweep",
      "effect": "read",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scenario": {
            "type": "object",
            "properties": {
              "frequencyMHz": {
                "type": "number",
                "minimum": 100,
                "maximum": 60000,
                "description": "Carrier frequency in MHz"
              },
              "distanceKm": {
                "type": "number",
                "minimum": 0.01,
                "maximum": 100,
                "description": "Path length in km"
              },
              "txPowerDbm": {
                "type": "number",
                "minimum": -30,
                "maximum": 50,
                "description": "Conducted transmitter power in dBm"
              },
              "txGainDbi": {
                "type": "number",
                "minimum": -10,
                "maximum": 40,
                "description": "Transmit antenna gain in dBi"
              },
              "rxGainDbi": {
                "type": "number",
                "minimum": -10,
                "maximum": 40,
                "description": "Receive antenna gain in dBi"
              },
              "txLossDb": {
                "type": "number",
                "minimum": 0,
                "maximum": 40,
                "description": "Transmit feedline loss in dB"
              },
              "rxLossDb": {
                "type": "number",
                "minimum": 0,
                "maximum": 40,
                "description": "Receive feedline loss in dB"
              },
              "extraLossDb": {
                "type": "number",
                "minimum": 0,
                "maximum": 80,
                "description": "Additional loss allowance in dB"
              },
              "sensitivityDbm": {
                "type": "number",
                "minimum": -150,
                "maximum": -10,
                "description": "Receiver threshold in dBm at the selected rate"
              },
              "targetMarginDb": {
                "type": "number",
                "minimum": 0,
                "maximum": 60,
                "description": "Desired reserve in dB"
              },
              "eirpLimitDbm": {
                "type": "number",
                "minimum": -30,
                "maximum": 80,
                "description": "User-entered EIRP design cap in dBm; not legal advice"
              }
            },
            "required": [
              "frequencyMHz",
              "distanceKm",
              "txPowerDbm",
              "txGainDbi",
              "rxGainDbi",
              "txLossDb",
              "rxLossDb",
              "extraLossDb",
              "sensitivityDbm",
              "targetMarginDb",
              "eirpLimitDbm"
            ],
            "additionalProperties": false
          },
          "minKm": {
            "type": "number",
            "minimum": 0.01,
            "maximum": 100,
            "description": "Sweep start"
          },
          "maxKm": {
            "type": "number",
            "minimum": 0.01,
            "maximum": 100,
            "description": "Sweep end"
          },
          "points": {
            "type": "integer",
            "minimum": 2,
            "maximum": 101
          }
        },
        "required": [
          "scenario",
          "minKm",
          "maxKm",
          "points"
        ],
        "additionalProperties": false
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "samples": {
            "type": "array",
            "minItems": 2,
            "maxItems": 101,
            "items": {
              "type": "object",
              "properties": {
                "distanceKm": {
                  "type": "number"
                },
                "fsplDb": {
                  "type": "number"
                },
                "eirpDbm": {
                  "type": "number"
                },
                "receivedDbm": {
                  "type": "number"
                },
                "marginDb": {
                  "type": "number"
                },
                "headroomDb": {
                  "type": "number"
                },
                "maxDistanceKm": {
                  "type": "number"
                },
                "withinEirp": {
                  "type": "boolean"
                },
                "meetsMargin": {
                  "type": "boolean"
                },
                "radioPass": {
                  "type": "boolean"
                },
                "formula": {
                  "type": "string"
                },
                "model": {
                  "type": "string"
                },
                "assumptions": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              },
              "required": [
                "distanceKm",
                "fsplDb",
                "eirpDbm",
                "receivedDbm",
                "marginDb",
                "headroomDb",
                "maxDistanceKm",
                "withinEirp",
                "meetsMargin",
                "radioPass",
                "formula",
                "model",
                "assumptions"
              ]
            }
          },
          "scope": {
            "type": "string"
          }
        },
        "required": [
          "samples",
          "scope"
        ]
      }
    },
    {
      "name": "explain_term",
      "description": "Explain an RF planning term with a primary technical source",
      "effect": "read",
      "inputSchema": {
        "type": "object",
        "properties": {
          "term": {
            "type": "string",
            "enum": [
              "fspl",
              "eirp",
              "margin",
              "fresnel"
            ]
          }
        },
        "required": [
          "term"
        ],
        "additionalProperties": false
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string"
          },
          "unit": {
            "type": "string"
          },
          "explanation": {
            "type": "string"
          },
          "source": {
            "type": "string"
          }
        },
        "required": [
          "title",
          "unit",
          "explanation",
          "source"
        ]
      }
    },
    {
      "name": "check_clearance",
      "description": "Screen a single obstruction for Fresnel clearance and effective Earth bulge using a common height datum",
      "effect": "read",
      "inputSchema": {
        "type": "object",
        "properties": {
          "frequencyMHz": {
            "type": "number",
            "minimum": 100,
            "maximum": 60000,
            "description": "Carrier frequency in MHz"
          },
          "distanceKm": {
            "type": "number",
            "minimum": 0.01,
            "maximum": 100,
            "description": "Path length in km"
          },
          "txHeightM": {
            "type": "number",
            "minimum": 0,
            "maximum": 500,
            "description": "Endpoint A antenna elevation in m, common datum"
          },
          "rxHeightM": {
            "type": "number",
            "minimum": 0,
            "maximum": 500,
            "description": "Endpoint B antenna elevation in m, common datum"
          },
          "obstacleHeightM": {
            "type": "number",
            "minimum": 0,
            "maximum": 500,
            "description": "Top of sampled obstruction in m, same datum"
          },
          "obstacleFraction": {
            "type": "number",
            "minimum": 0.01,
            "maximum": 0.99,
            "description": "Obstruction position as fraction of path from A"
          },
          "kFactor": {
            "type": "number",
            "minimum": 0.5,
            "maximum": 3,
            "description": "Effective Earth radius factor; nominal example 4/3"
          },
          "clearanceFraction": {
            "type": "number",
            "minimum": 0.6,
            "maximum": 1,
            "description": "Required clear fraction of first Fresnel radius"
          }
        },
        "required": [
          "frequencyMHz",
          "distanceKm",
          "txHeightM",
          "rxHeightM",
          "obstacleHeightM",
          "obstacleFraction",
          "kFactor",
          "clearanceFraction"
        ],
        "additionalProperties": false
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "radiusM": {
            "type": "number"
          },
          "earthBulgeM": {
            "type": "number"
          },
          "lineHeightM": {
            "type": "number"
          },
          "availableM": {
            "type": "number"
          },
          "requiredM": {
            "type": "number"
          },
          "deficitM": {
            "type": "number"
          },
          "equalMastRaiseM": {
            "type": "number"
          },
          "txOnlyRaiseM": {
            "type": "number"
          },
          "rxOnlyRaiseM": {
            "type": "number"
          },
          "screenPass": {
            "type": "boolean"
          },
          "formula": {
            "type": "string"
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "required": [
          "radiusM",
          "earthBulgeM",
          "lineHeightM",
          "availableM",
          "requiredM",
          "deficitM",
          "equalMastRaiseM",
          "txOnlyRaiseM",
          "rxOnlyRaiseM",
          "screenPass",
          "formula",
          "assumptions",
          "sources"
        ]
      }
    }
  ],
  "localActions": [
    {
      "name": "get_scenario",
      "effect": "read"
    },
    {
      "name": "save_scenario",
      "effect": "write",
      "confirmation": "Always required, exact arguments reviewed"
    },
    {
      "name": "delete_saved",
      "effect": "write",
      "confirmation": "Always required"
    }
  ]
}
