Skip to main content
Glama

fcc-spectrum-mcp-server

Get an FCC ULS license

fcc_spectrum_get_license
Read-onlyIdempotent

Fetch one FCC ULS license or spectrum lease in full by callsign or unique system identifier (USI): licensee (the lessee on a lease), status and key dates, its locations with coordinates, elevation, structure height, and ASR number, each location's antennas, and each antenna's authorized frequencies with power, ERP/EIRP, station class, transmitter, and emission designators; geographic-area licenses list their market and spectrum blocks, and lease links are shown in both directions. Large records are paged: one call lists whole locations up to 50 sites and 100 antennas, up to max_frequencies frequency rows, and 100 leases, and names the location_offset or lease_offset that reads the rest; location_number starts the locations at a location number the search tools return. Technical detail is kept for active, pending-legal, and term-pending records only. A callsign shared by several records returns the active one, else the most recent.

Input Schema

NameRequiredDescriptionDefault
usiNoUnique system identifier, as digits: the usi field of fcc_spectrum_search_licenses, fcc_spectrum_find_transmitters, or fcc_spectrum_search_frequencies results. Pass this or callsign, not both.
callsignNoCallsign or lease ID, e.g. "KNKA123" or "L000012345". Case, spaces, and one trailing portable suffix ("/4") are normalized. Pass this or usi, not both.
lease_offsetNoLease to start at, counted from 0 in lease-ID order; pass nextLeaseOffset from the previous call to read the next 100.
location_numberNoLocation number to start at: the locationNumber of a fcc_spectrum_find_transmitters or fcc_spectrum_search_frequencies result. A number the record does not file starts at the next one it does. Pass this or a nonzero location_offset, not both; page on with nextLocationOffset.
location_offsetNoLocation to start at, counted from 0 in location-number order; pass nextLocationOffset from the previous call to read the next locations. To start at a location number instead, pass location_number.
max_frequenciesNoPositive integer frequency-row budget across the locations this call lists; values above 1000 are clamped to 1000 with a notice. Rows beyond it are dropped from the last locations first. Large microwave and land-mobile licenses exceed the default.

Output Schema

NameRequiredDescriptionDefault
capNoThe max_frequencies cap applied.
errorNoPresent when the call failed. Absent on success.
foundNoTrue when a record matched; false returns guidance and candidates instead.
shownNoFrequency rows returned.
noticeNoWhat this call left out and the call that reads it, where an unfiled location_number started the locations, or why an offset or location number listed nothing.
licenseNoThe record; present when found is true.
dataAsOfNoCreation time of the newest applied ULS file (ISO 8601).
guidanceNoWhy nothing matched and where to look next; present when found is false.
locationsNoLocations with antennas and frequency rows, one entry per location number (a number filed at several sites lists them in sites): whole locations from location_offset or location_number up to 50 sites and 100 antennas, or one larger location alone; present when found is true.
siteTotalNoSites the record files, each site of a shared location number counted; present when found is true.
truncatedNoTrue when this call leaves part of the record out: locations after the ones listed, frequency rows beyond max_frequencies, or leases after the ones listed.
candidatesNoUp to 5 records whose callsign starts with the one requested; present when a callsign lookup found nothing.
locationTotalNoLocation numbers the record files; present when found is true.
nextLeaseOffsetNoPass as lease_offset to read the leases after these; absent when none follow.
technicalRetainedNoFalse when the status is not A, L, or X (active, pending legal, term pending): sites and frequencies are kept only for those, so locations is empty.
nextLocationOffsetNoPass as location_offset to read the locations after these; absent when none follow.
otherCallsignRecordsNoOther records under the same callsign (ULS reuses callsigns); present when found is true.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed7 schema fields changed
    • changedInput schema / properties / max_frequencies / description
      Previous value: -"Most frequency rows to return across the locations this call lists (1–1000); rows beyond it are dropped from the last locations first. Large microwave and land-mobile licenses exceed the default."New value: +"Positive integer frequency-row budget across the locations this call lists; values above 1000 are clamped to 1000 with a notice. Rows beyond it are dropped from the last locations first. Large microwave and land-mobile licenses exceed the default."
    • changedInput schema / properties / max_frequencies / maximum
      Previous value: -1000New value: +9007199254740991
    • changedOutput schema / properties / locations / items / properties / antennas / items / properties / antennaNumber / description
      Previous value: -"Antenna number within the location."New value: +"Filed antenna number within the location; absent for an independently retained unnumbered AN record, which has no associated frequency rows."
    • changedOutput schema / properties / locations / items / properties / antennas / items / properties / frequencies / items / properties / stationClass / description
      Previous value: -"ULS class-of-station code, as filed (e.g. FB2, FXO)."New value: +"ULS class-of-station code, as filed (e.g. FB2, FXO); decode with fcc_spectrum_list_reference, topic \"station_classes\", filter set to this code. Unknown filed codes remain unchanged."
    • changedOutput schema / properties / locations / items / properties / antennas / items / required
      Previous value: -[
      -  "antennaNumber",
      -  "frequencies"
      -]New value: +[
      +  "frequencies"
      +]
    • addedOutput schema / properties / locations / items / properties / locationClassLabel
      Added value: +{
      +  "description": "FCC label of the filed location class; absent for an unknown code. This is authorization metadata, not actual on-air activity.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / locations / items / properties / sites / items / properties / locationClassLabel
      Added value: +{
      +  "description": "FCC label of the filed location class; absent for an unknown code. This is authorization metadata, not actual on-air activity.",
      +  "type": "string"
      +}
  2. First observed

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already cover readOnly/idempotent/closed-world, but the description adds substantial non-obvious behavior: paging limits (50 sites, 100 antennas, max_frequencies rows, 100 leases) with the offsets that resume them, frequency-budget clamping to 1000 with a notice, rows dropped from the last locations first, and the retention rule that technical detail is kept only for active/pending-legal/term-pending records. The callsign-collision resolution rule ('returns the active one, else the most recent') is exactly the kind of behavior an agent could not infer.

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?

Front-loaded correctly: the verb, resource, and lookup keys come first, with paging and edge-case rules following. However, the opening sentence is a very long semicolon chain and the paging rules are densely packed, making it heavier to parse than necessary for the amount of information conveyed.

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?

Given six parameters, non-trivial paging, and a present output schema, the description covers everything an agent needs: how to identify the record, what the record contains, how to page through locations/leases/frequencies, and which records retain technical detail. Return-value formatting is correctly left to the output schema.

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?

Schema coverage is 100%, so the baseline is 3, and the description exceeds it by tying the parameters into a coherent paging model — explaining what location_offset and lease_offset resume, how location_number interacts with offset, and that max_frequencies is a budget across locations that can be exceeded by large microwave/land-mobile licenses. It largely restates the per-parameter text rather than adding new syntax, so it is not a 5.

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 and resource: 'Fetch one FCC ULS license or spectrum lease in full by callsign or unique system identifier (USI).' It then enumerates the record contents (licensee, status, locations, antennas, frequencies), which distinguishes it clearly from the search/list siblings. An agent can tell this is the single-record detail fetch without opening a schema.

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?

The description gives clear context: it fetches ONE record 'in full', and references identifiers the search tools return ('location_number ... a location number the search tools return'), implying it is the detail step after a search. It does not, however, explicitly say when not to use it or name a sibling as the alternative, so it stops short of the top score.

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.