Skip to main content
Glama

Compare Broadband Coverage Across Areas

fcc_compare_areas
Read-onlyIdempotent

Compares broadband coverage metrics across multiple geographies of the same type and returns a ranked table sorted by unserved or underserved population. Answers "which counties in this state have the worst broadband access?" and drives BEAD funding prioritization. Provide up to 50 geography IDs, or set compare_all_states=true for all 50 states + DC. Data is from FCC Form 477 (as of June 2021).

Input Schema

NameRequiredDescriptionDefault
sort_byNo"unserved_pct" = share of population with no broadband (default). "unserved_pop" = raw headcount for BEAD funding. "coverage_pct" = share with any coverage. "competitive_pct" = share with 2+ providers. Every option ranks worst-first, so rank 1 is the highest unserved share or headcount, or the lowest coverage or competitive share.unserved_pct
speed_downNoDownload speed threshold in Mbps. 25 = FCC legacy standard. 100 = BEAD program standard.25
tech_filterNoTechnology filter, one value: "acfosw" = every technology (default). "f" = fiber, "c" = cable, "a" = ADSL/DSL, "o" = other (symmetric DSL, other copper, power line), "s" = satellite, "w" = fixed wireless.acfosw
geography_idsNoArray of FIPS GEOIDs to compare (up to 50). For all 50 states, omit and set compare_all_states=true.
geography_typeYesGeographic level to compare. Must be uniform across all geographies in the comparison.
compare_all_statesNoWhen true, compares all 50 states + DC. Overrides geography_ids. Requires geography_type="state".

Output Schema

NameRequiredDescriptionDefault
areasNoRanked comparison of geographies by the selected sort field.
errorNoPresent when the call failed. Absent on success.
sortByNoRanking field used.
techFilterNoTechnology filter applied.
totalAreasNoTotal number of areas compared.
dataVintageNoData vintage — Form 477 data as of June 2021.
geographyTypeNoGeography type compared.
speedDownMbpsNoSpeed threshold in Mbps.
appliedFiltersNoFilters and parameters applied to this comparison.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / tech_filter / description
      Previous value: -"Technology filter. \"acfosw\" = any wired or fixed wireless. \"f\" = fiber only. \"c\" = cable only. \"a\" = DSL. \"s\" = satellite. \"w\" = fixed wireless."New value: +"Technology filter, one value: \"acfosw\" = every technology (default). \"f\" = fiber, \"c\" = cable, \"a\" = ADSL/DSL, \"o\" = other (symmetric DSL, other copper, power line), \"s\" = satellite, \"w\" = fixed wireless."
  2. Changed6 schema fields changed
    • changedInput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • addedInput schema / additionalProperties
      Added value: +false
    • changedOutput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • addedOutput schema / anyOf
      Added value: +[
      +  {
      +    "not": {
      +      "required": [
      +        "error"
      +      ]
      +    },
      +    "required": [
      +      "geographyType",
      +      "techFilter",
      +      "speedDownMbps",
      +      "sortBy",
      +      "areas",
      +      "totalAreas",
      +      "dataVintage",
      +      "appliedFilters"
      +    ]
      +  },
      +  {
      +    "required": [
      +      "error"
      +    ]
      +  }
      +]
    • addedOutput schema / properties / error
      Added value: +{
      +  "additionalProperties": {},
      +  "description": "Present when the call failed. Absent on success.",
      +  "properties": {
      +    "code": {
      +      "description": "JSON-RPC error code for this failure.",
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    },
      +    "data": {
      +      "additionalProperties": {},
      +      "properties": {
      +        "reason": {
      +          "description": "Machine-readable failure mode. Declared by this tool: `no_data_found`: No area table data found for any of the requested geography IDs. `invalid_all_states_combo`: compare_all_states=true used with geography_type other than \"state\". `missing_geography_ids`: No geography_ids provided and compare_all_states is false. `invalid_geography_id_shape`: A geography_ids entry has a digit count that does not match the geography_type (state=2, county=5, cd=4, cbsa=5, place=7). Other values are possible when a failure originates below the handler.",
      +          "examples": [
      +            "no_data_found",
      +            "invalid_all_states_combo",
      +            "missing_geography_ids",
      +            "invalid_geography_id_shape"
      +          ],
      +          "type": "string"
      +        },
      +        "recovery": {
      +          "additionalProperties": {},
      +          "description": "Actionable next step for the caller.",
      +          "properties": {
      +            "hint": {
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "hint"
      +          ],
      +          "type": "object"
      +        },
      +        "retryable": {
      +          "description": "Whether retrying may succeed.",
      +          "type": "boolean"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "message": {
      +      "description": "Human-readable description of what went wrong.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "code",
      +    "message"
      +  ],
      +  "type": "object"
      +}
    • removedOutput schema / required
      Removed value: -[
      -  "geographyType",
      -  "techFilter",
      -  "speedDownMbps",
      -  "sortBy",
      -  "areas",
      -  "totalAreas",
      -  "dataVintage",
      -  "appliedFilters"
      -]
  3. Changed1 schema field changed
    • changedInput schema / properties / sort_by / description
      Previous value: -"\"unserved_pct\" = share of population with no broadband (default). \"unserved_pop\" = raw headcount for BEAD funding. \"coverage_pct\" = share with any coverage. \"competitive_pct\" = share with 2+ providers."New value: +"\"unserved_pct\" = share of population with no broadband (default). \"unserved_pop\" = raw headcount for BEAD funding. \"coverage_pct\" = share with any coverage. \"competitive_pct\" = share with 2+ providers. Every option ranks worst-first, so rank 1 is the highest unserved share or headcount, or the lowest coverage or competitive share."
  4. Changed1 schema field changed
    • addedOutput schema / properties / areas / items / properties / name
      Added value: +{
      +  "description": "Human-readable geography name if resolved (e.g., \"Pontotoc County, MS\").",
      +  "type": "string"
      +}
  5. Changed2 schema fields changed
    • addedOutput schema / properties / appliedFilters
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Filters and parameters applied to this comparison.",
      +  "properties": {
      +    "areasCompared": {
      +      "description": "Total number of geographies compared.",
      +      "type": "number"
      +    },
      +    "geographyType": {
      +      "description": "Geographic level compared.",
      +      "type": "string"
      +    },
      +    "sortBy": {
      +      "description": "Field used for ranking.",
      +      "type": "string"
      +    },
      +    "speedDownMbps": {
      +      "description": "Download speed threshold in Mbps.",
      +      "type": "number"
      +    },
      +    "techFilter": {
      +      "description": "Technology filter applied.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "geographyType",
      +    "techFilter",
      +    "speedDownMbps",
      +    "sortBy",
      +    "areasCompared"
      +  ],
      +  "type": "object"
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "geographyType",
      -  "techFilter",
      -  "speedDownMbps",
      -  "sortBy",
      -  "areas",
      -  "totalAreas",
      -  "dataVintage"
      -]New value: +[
      +  "geographyType",
      +  "techFilter",
      +  "speedDownMbps",
      +  "sortBy",
      +  "areas",
      +  "totalAreas",
      +  "dataVintage",
      +  "appliedFilters"
      +]
  6. First observed

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent, closed-world), so the description's contribution is the data vintage and provenance: 'FCC Form 477 (as of June 2021)' tells the agent results are historical and not real-time. It also discloses the 50-geography cap and that the result is a ranked table rather than raw records. It does not discuss pagination or how ties/absent geographies are handled.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences, front-loaded with the core action and output, then the driving use case, then the input modes, then provenance. No filler, though the geography_ids/compare_all_states sentence is largely duplicative of the schema and could be trimmed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present the description needn't explain return fields, and annotations plus the rich schema cover parameters and safety. What it adds, data vintage and the comparison scope, is the right residual information; only minor operational details (rate limits, behavior when a FIPS GEOID is invalid) are unaddressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%: sort_by rankings direction, speed thresholds (25 legacy vs 100 BEAD), tech_filter codes, and the compare_all_states override are all exhaustively documented in the schema. The description only restates the 50-ID cap and the compare_all_states rule, adding no new syntax or default information, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (compares) and resource (broadband coverage metrics) plus the output shape (a ranked table) and the scope constraint (multiple geographies of the same type). The phrase 'across multiple geographies' distinguishes it from single-geography siblings like fcc_get_coverage_summary, and the sample question 'which counties in this state have the worst broadband access?' pins the intent.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear usage context: it answers a worst-access ranking question and drives BEAD funding prioritization, and it states the two mutually exclusive input modes (list up to 50 IDs, or compare_all_states=true for all 50 states + DC). It never explicitly says when NOT to use it or names a sibling as an alternative, which keeps it short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.