Skip to main content
Glama

Search Broadband Providers

fcc_search_providers
Read-onlyIdempotent

Searches for ISPs by holding company name, filtered by state and technology type. Returns a deduplicated list of matching providers with hoconum identifiers for follow-up calls to fcc_get_provider. Answers "which ISPs serve Washington with fiber?" and "find all Comcast entities." Geographic filtering is state-level; sub-state granularity requires cross-referencing block data. Against the live FCC API the search reads a bounded window of deployment rows to find which holding companies match, so when scanTruncated comes back true the providers are a sample of the matches rather than every one of them and no true match count is available; a narrower filter raises the share of matches the sample surfaces but cannot make it complete, and only a deployment running the local Form 477 mirror returns every match. The sample is of which companies come back — every company that does carries its complete national footprint, since statesServed and techCodes are resolved per company rather than read off the window, at the cost of one lookup per provider returned. Data is from FCC Form 477 (as of June 2021).

Tool call template

This tool declares no required parameters. Add optional parameters from the input schema as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {},
    "name": "fcc_search_providers"
  }
}

Input Schema

NameRequiredDescriptionDefault
limitNoMaximum number of distinct providers to return.
stateNo2-letter state abbreviation (e.g., "WA") to limit results to providers serving that state. Matches individual deployment filings, so every filter given must hold on one filing together — a provider is returned for state="WA" with tech_filter=["50"] only if it filed fiber in Washington, not if it filed fiber elsewhere and something else in Washington.
offsetNoNumber of sorted distinct providers to skip. Live continuation covers the sampled set only; samples may differ between calls.
name_searchNoPartial holding company name to search (case-insensitive). e.g., "Comcast", "T-Mobile", "Frontier". Omit to list all providers in a state.
tech_filterNoTechnology codes to filter, from the complete Form 477 taxonomy: 0=All other, 10=Asymmetric xDSL, 11=ADSL2, 12=VDSL, 20=Symmetric xDSL, 30=Other copper wireline, 40=Cable modem, 41=Cable modem DOCSIS 1/1.1/2.0, 42=Cable modem DOCSIS 3.0, 43=Cable modem DOCSIS 3.1, 50=Fiber to the end user, 60=Satellite, 70=Terrestrial fixed wireless, 90=Electric power line. Omit for all technologies. Matches individual deployment filings like state does, so pairing this with name_search narrows to filings made under the matched name — a holding company that files some technologies under an acquired brand name can come back empty here while its techCodes list the technology. To ask what one company deploys, search the name alone and read techCodes off the result.

Output Schema

NameRequiredDescriptionDefault
capNoThe limit that was applied. Present when capped.
errorNoPresent when the call failed. Absent on success.
shownNoNumber of providers returned. Present when capped.
noticeNoGuidance about the result set — that the list was capped at the limit, that the upstream scan returned a sample rather than every match, and how to broaden the search when nothing matched. Absent when none applies.
offsetNoNumber of sorted providers skipped.
providersNoMatching providers, deduplicated by holding company.
truncatedNoTrue when results were capped at the limit and more providers may exist. Absent when not capped.
nextOffsetNoNext offset when another page remains in the computed match set.
scanRowCapNoRaw upstream row ceiling that bound the scan. Present only when scanTruncated is true.
totalCountNoDistinct providers matching the query, before the limit. Present only when the scan read every matching row — absent when scanTruncated is true, because the true match count is then unknown.
totalFoundNoProviders in this response. Not the number matching the query — that is totalCount, and it is only knowable when the scan read every matching row.
dataVintageNoData vintage — Form 477 data as of June 2021.
scanTruncatedNoTrue when the upstream row scan stopped at its ceiling before reaching the end of the matching data, so the providers returned are a sample of the matches rather than the complete set. Bounds which companies came back, not what each one reports — statesServed and techCodes are resolved per company and stay complete. Absent when the scan read every matching row.
appliedFiltersNoFilters applied to this query.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed6 schema fields changed
    • addedInput schema / properties / offset
      Added value: +{
      +  "default": 0,
      +  "description": "Number of sorted distinct providers to skip. Live continuation covers the sampled set only; samples may differ between calls.",
      +  "maximum": 9007199254740991,
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • changedOutput schema / anyOf
      Previous value: -[
      -  {
      -    "not": {
      -      "required": [
      -        "error"
      -      ]
      -    },
      -    "required": [
      -      "providers",
      -      "totalFound",
      -      "dataVintage",
      -      "appliedFilters"
      -    ]
      -  },
      -  {
      -    "required": [
      -      "error"
      -    ]
      -  }
      -]New value: +[
      +  {
      +    "not": {
      +      "required": [
      +        "error"
      +      ]
      +    },
      +    "required": [
      +      "offset",
      +      "providers",
      +      "totalFound",
      +      "dataVintage",
      +      "appliedFilters"
      +    ]
      +  },
      +  {
      +    "required": [
      +      "error"
      +    ]
      +  }
      +]
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode. Declared by this tool: `live_search_timeout`: A live FCC Open Data provider search exceeded its 30-second budget, on either the bounded windowed read or one of the per-provider footprint lookups; both are shapes that answer in seconds or not at all, so a retry reaches the same result. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `unknown_state`: The state input is not a USPS state or territory abbreviation. `live_search_timeout`: A live FCC Open Data provider search exceeded its 30-second budget, on either the bounded windowed read or one of the per-provider footprint lookups; both are shapes that answer in seconds or not at all, so a retry reaches the same result. Other values are possible when a failure originates below the handler."
    • changedOutput schema / properties / error / properties / data / properties / reason / examples
      Previous value: -[
      -  "live_search_timeout"
      -]New value: +[
      +  "unknown_state",
      +  "live_search_timeout"
      +]
    • addedOutput schema / properties / nextOffset
      Added value: +{
      +  "description": "Next offset when another page remains in the computed match set.",
      +  "type": "number"
      +}
    • addedOutput schema / properties / offset
      Added value: +{
      +  "description": "Number of sorted providers skipped.",
      +  "type": "number"
      +}
  2. Changed2 schema fields changed
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode. Declared by this tool: `no_providers_found`: No providers matched the search criteria. `live_search_timeout`: A live FCC Open Data provider search exceeded its 30-second budget, on either the bounded windowed read or one of the per-provider footprint lookups; both are shapes that answer in seconds or not at all, so a retry reaches the same result. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `live_search_timeout`: A live FCC Open Data provider search exceeded its 30-second budget, on either the bounded windowed read or one of the per-provider footprint lookups; both are shapes that answer in seconds or not at all, so a retry reaches the same result. Other values are possible when a failure originates below the handler."
    • changedOutput schema / properties / error / properties / data / properties / reason / examples
      Previous value: -[
      -  "no_providers_found",
      -  "live_search_timeout"
      -]New value: +[
      +  "live_search_timeout"
      +]
  3. 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": [
      +      "providers",
      +      "totalFound",
      +      "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_providers_found`: No providers matched the search criteria. `live_search_timeout`: A live FCC Open Data provider search exceeded its 30-second budget, on either the bounded windowed read or one of the per-provider footprint lookups; both are shapes that answer in seconds or not at all, so a retry reaches the same result. Other values are possible when a failure originates below the handler.",
      +          "examples": [
      +            "no_providers_found",
      +            "live_search_timeout"
      +          ],
      +          "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: -[
      -  "providers",
      -  "totalFound",
      -  "dataVintage",
      -  "appliedFilters"
      -]
  4. Changed2 schema fields changed
    • changedInput schema / properties / tech_filter / description
      Previous value: -"Technology codes to filter. 50=Fiber, 40–43=Cable, 10–12=DSL, 60=Satellite, 70=Fixed wireless. Omit for all technologies. Matches individual deployment filings like state does, so pairing this with name_search narrows to filings made under the matched name — a holding company that files some technologies under an acquired brand name can come back empty here while its techCodes list the technology. To ask what one company deploys, search the name alone and read techCodes off the result."New value: +"Technology codes to filter, from the complete Form 477 taxonomy: 0=All other, 10=Asymmetric xDSL, 11=ADSL2, 12=VDSL, 20=Symmetric xDSL, 30=Other copper wireline, 40=Cable modem, 41=Cable modem DOCSIS 1/1.1/2.0, 42=Cable modem DOCSIS 3.0, 43=Cable modem DOCSIS 3.1, 50=Fiber to the end user, 60=Satellite, 70=Terrestrial fixed wireless, 90=Electric power line. Omit for all technologies. Matches individual deployment filings like state does, so pairing this with name_search narrows to filings made under the matched name — a holding company that files some technologies under an acquired brand name can come back empty here while its techCodes list the technology. To ask what one company deploys, search the name alone and read techCodes off the result."
    • changedInput schema / properties / tech_filter / items / enum
      Previous value: -[
      -  "10",
      -  "11",
      -  "12",
      -  "40",
      -  "41",
      -  "42",
      -  "43",
      -  "50",
      -  "60",
      -  "70"
      -]New value: +[
      +  "0",
      +  "10",
      +  "11",
      +  "12",
      +  "20",
      +  "30",
      +  "40",
      +  "41",
      +  "42",
      +  "43",
      +  "50",
      +  "60",
      +  "70",
      +  "90"
      +]
  5. Changed10 schema fields changed
    • changedInput schema / properties / state / description
      Previous value: -"2-letter state abbreviation (e.g., \"WA\") to limit results to providers serving that state."New value: +"2-letter state abbreviation (e.g., \"WA\") to limit results to providers serving that state. Matches individual deployment filings, so every filter given must hold on one filing together — a provider is returned for state=\"WA\" with tech_filter=[\"50\"] only if it filed fiber in Washington, not if it filed fiber elsewhere and something else in Washington."
    • changedInput schema / properties / tech_filter / description
      Previous value: -"Technology codes to filter. 50=Fiber, 40–43=Cable, 10–12=DSL, 60=Satellite, 70=Fixed wireless. Omit for all technologies."New value: +"Technology codes to filter. 50=Fiber, 40–43=Cable, 10–12=DSL, 60=Satellite, 70=Fixed wireless. Omit for all technologies. Matches individual deployment filings like state does, so pairing this with name_search narrows to filings made under the matched name — a holding company that files some technologies under an acquired brand name can come back empty here while its techCodes list the technology. To ask what one company deploys, search the name alone and read techCodes off the result."
    • changedOutput schema / properties / notice / description
      Previous value: -"Recovery hint when no providers are found — suggests how to broaden the search. Absent on successful results."New value: +"Guidance about the result set — that the list was capped at the limit, that the upstream scan returned a sample rather than every match, and how to broaden the search when nothing matched. Absent when none applies."
    • changedOutput schema / properties / providers / items / properties / holdingCompanyName / description
      Previous value: -"Holding company name."New value: +"Holding company name as filed on the deployment rows this search matched. One holding company number can carry more than one name in Form 477 — an acquired brand still filing under the parent number — and this is the name the matched rows carry, not necessarily every name filed under the number."
    • changedOutput schema / properties / providers / items / properties / statesServed / description
      Previous value: -"State abbreviations where this provider has reported filings."New value: +"Every state, district, and territory this holding company filed deployments in nationally — its complete footprint, resolved per company. Not narrowed by the state filter, and complete even when the provider list is a sample."
    • changedOutput schema / properties / providers / items / properties / techCodes / description
      Previous value: -"Technology codes reported by this provider."New value: +"Every technology code this holding company deployed nationally — its complete set, resolved per company. Not narrowed by tech_filter, and complete even when the provider list is a sample. Drawn from block-level deployment filings, so it can exceed the technologies fcc_get_provider reports, which counts only those with reported covered population."
    • addedOutput schema / properties / scanRowCap
      Added value: +{
      +  "description": "Raw upstream row ceiling that bound the scan. Present only when scanTruncated is true.",
      +  "type": "number"
      +}
    • addedOutput schema / properties / scanTruncated
      Added value: +{
      +  "description": "True when the upstream row scan stopped at its ceiling before reaching the end of the matching data, so the providers returned are a sample of the matches rather than the complete set. Bounds which companies came back, not what each one reports — statesServed and techCodes are resolved per company and stay complete. Absent when the scan read every matching row.",
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / totalCount
      Added value: +{
      +  "description": "Distinct providers matching the query, before the limit. Present only when the scan read every matching row — absent when scanTruncated is true, because the true match count is then unknown.",
      +  "type": "number"
      +}
    • changedOutput schema / properties / totalFound / description
      Previous value: -"Number of distinct providers returned."New value: +"Providers in this response. Not the number matching the query — that is totalCount, and it is only knowable when the scan read every matching row."
  6. Changed3 schema fields changed
    • addedOutput schema / properties / cap
      Added value: +{
      +  "description": "The limit that was applied. Present when capped.",
      +  "type": "number"
      +}
    • addedOutput schema / properties / shown
      Added value: +{
      +  "description": "Number of providers returned. Present when capped.",
      +  "type": "number"
      +}
    • addedOutput schema / properties / truncated
      Added value: +{
      +  "description": "True when results were capped at the limit and more providers may exist. Absent when not capped.",
      +  "type": "boolean"
      +}
  7. Changed3 schema fields changed
    • addedOutput schema / properties / appliedFilters
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Filters applied to this query.",
      +  "properties": {
      +    "nameSearch": {
      +      "description": "Name fragment searched. Absent when no name search was used.",
      +      "type": "string"
      +    },
      +    "state": {
      +      "description": "State filter applied. Absent for nationwide searches.",
      +      "type": "string"
      +    },
      +    "techFilter": {
      +      "description": "Technology code filter applied. Absent when no tech filter was used.",
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    }
      +  },
      +  "type": "object"
      +}
    • changedOutput schema / properties / notice / description
      Previous value: -"Recovery hint when results are empty — suggests how to broaden the search."New value: +"Recovery hint when no providers are found — suggests how to broaden the search. Absent on successful results."
    • changedOutput schema / required
      Previous value: -[
      -  "providers",
      -  "totalFound",
      -  "dataVintage"
      -]New value: +[
      +  "providers",
      +  "totalFound",
      +  "dataVintage",
      +  "appliedFilters"
      +]
  8. First observed

TDQS

A4.4/5.0
Behavior4/5

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

Well beyond the readOnly/idempotent annotations: it discloses that the live API samples deployment rows, that scanTruncated=true means a non-exhaustive sample with no true match count, that narrower filters only raise coverage, and that an exhaustive result requires a local Form 477 mirror. It also notes the per-provider lookup cost and the June 2021 data vintage. The disclosure is dense but genuinely useful; the one gap is that it never states a result-size or rate-limit ceiling.

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?

Purpose and example queries are front-loaded in the first two sentences, with the sampling caveat after. Most sentences carry unique information, though the long scanTruncated sentence is a run-on that restates the sample limitation twice ('a sample of the matches' and 'a narrower filter ... cannot make it complete').

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

Completeness5/5

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

An output schema exists and annotations cover the safety profile, so the description's job is to explain the sampling semantics and data vintage — both handled thoroughly. An agent knows how to call it, what it will and will not get back, and how to continue with fcc_get_provider.

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

Parameters4/5

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

With 100% schema coverage the baseline is 3, but the description adds meaning the schema does not: results are deduplicated by holding company, hoconum is the key for chaining into fcc_get_provider, and statesServed/techCodes are resolved per company rather than read off the sampled window. That last point explains a non-obvious semantic of the tech_filter and state parameters.

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?

Opens with a specific verb and resource ('Searches for ISPs by holding company name, filtered by state and technology type') and states the return shape (deduplicated providers with hoconum identifiers). Concrete example queries ('which ISPs serve Washington with fiber?', 'find all Comcast entities') make the distinction from fcc_get_provider and fcc_search_availability unmistakable.

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 when-to-use examples, states the state-level geographic limitation explicitly ('sub-state granularity requires cross-referencing block data'), and routes follow-up work to fcc_get_provider. It also advises narrowing filters when scanTruncated is true. It does not name the sibling tools an agent should use for sub-state or address-level lookups, leaving that inference to the caller.

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.