fcc-spectrum-mcp-server
Server Details
Search FCC radio licenses, find nearby transmitter sites, and see who is licensed on a frequency.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- cyanheads/fcc-spectrum-mcp-server
- GitHub Stars
- 1
- Server Listing
- fcc-spectrum-mcp-server
TDQS
Scored across 5 tools
Three search tools (find_transmitters, search_frequencies, search_licenses) plus get_license could overlap, but the descriptions explicitly distinguish them by entry point (location-first, frequency-first, metadata-first) and cross-reference each other, so an agent can choose correctly. Only minor ambiguity remains around frequency-vs-transmitter results that both surface sites.
Every tool uses the same fcc_spectrum_ prefix followed by a clear verb_noun pattern (find_transmitters, get_license, list_reference, search_frequencies, search_licenses). The convention is consistent throughout with no stray casing or verb styles.
Five tools is well-scoped for a read-only FCC ULS data server, with each tool earning its place across spatial, frequency, metadata, detail, and reference-decode concerns. No redundancy or filler.
The surface covers the core read lifecycle: search by location, frequency, and license metadata, fetch full records, and decode reference codes/coverage. It is a read-only domain so CRUD is not expected, though pagination and cross-tool navigation are handled manually rather than via dedicated helpers.
Available Tools
5 toolsfcc_spectrum_find_transmittersFind FCC-licensed transmitters near a pointARead-onlyIdempotentInspect
Find FCC-licensed transmitter sites within a radius of a coordinate, nearest first, each with its callsign, licensee, distance, coordinates, location type, ground elevation, structure height, and the frequencies authorized there. Filter by frequency or band, radio service, location type, and live status (active by default). Coordinates are decimal degrees or DMS strings. Mobile and temporary-fixed operating areas are filed as a center and a radius of operation: they are returned at their center with radiusKm, and match when the center lies within radius_km. Locations filed without coordinates are not returned, and market-area licenses without site records are found with fcc_spectrum_search_frequencies.
| Name | Required | Description | Default |
|---|---|---|---|
| unit | No | Unit of the frequencies: kHz, MHz (default), or GHz. | MHz |
| limit | No | Sites per page (1–100). | |
| cursor | No | nextCursor from the previous page of the same search; omit for the first page. | |
| status | No | A active (default), L pending legal, X term pending, or "any" for all three. Other statuses keep no site records. | A |
| latitude | Yes | Search center latitude: decimal degrees (47.6205, "47.6205") or a DMS string with hemisphere ("47-37-13.8 N", "47°37'13.8"N"). | |
| longitude | Yes | Search center longitude: decimal degrees (-122.3493) or a DMS string with hemisphere ("122-20-57.5 W"). | |
| radius_km | No | Search radius in km (0.1–100). | |
| frequency_low | No | Only sites authorized on this frequency, in unit; with frequency_high, the band's lower edge. Matches any assignment whose occupied band overlaps. | |
| location_type | No | One ULS location type code, case-insensitive: "F" keeps fixed sites only, "M" mobile and "T" temporary-fixed operating areas; see fcc_spectrum_list_reference topic "location_types". Omit for every type. | |
| radio_service | No | Two-character radio service code, e.g. "IG" (industrial/business pool); see fcc_spectrum_list_reference topic "radio_services". | |
| frequency_high | No | Band upper edge in unit; requires frequency_low. | |
| max_frequencies_per_site | No | Most frequencies listed per site (1–50); frequencyCount carries the full count. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The page limit applied. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Sites on this page. |
| sites | No | Transmitter sites, nearest first. |
| notice | No | Why nothing matched and how to widen the search, or how to page further. |
| dataAsOf | No | Creation time of the newest applied ULS file (ISO 8601). |
| truncated | No | True when more sites follow this page. |
| nextCursor | No | Pass as cursor with the same inputs for the next page; absent on the last page. |
| totalCount | No | Sites within the radius matching the filters, across every page. |
| searchCenter | No | The search circle as the server applied it (DMS input converted). |
| appliedFilters | No | Filters as the server applied them, normalized values and defaults included. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry the safe-read profile (readOnlyHint, idempotentHint, openWorldHint=false), so the description's value is in edge-case behavior: non-coordinate filings are dropped, mobile/temporary areas are returned at their center with radiusKm and match on center-in-radius, and the active-status default. That is substantive beyond the structured fields, though the status default is also visible in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and ordering, then edge cases; every sentence carries information. The mid-sentence enumeration of returned fields is slightly redundant given an output schema exists, but it costs little and the whole is a tight paragraph.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter, defaulted, paginated search tool with an output schema and full annotation coverage, the description supplies the remaining operational context an agent needs: defaults, exclusion behavior, and where to go for the one class of records this tool cannot return.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds cross-parameter semantics not obvious from the schema alone: coordinates accept decimal degrees or DMS strings, and the center-radius matching rule explains how radius_km interacts with mobile/temporary-fixed records. Frequency overlap matching is also clarified, though much of it is echoed in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Find FCC-licensed transmitter sites within a radius'), fixes the ordering ('nearest first') and enumerates the salient returned attributes. It also differentiates itself from siblings by directing market-area license lookups to fcc_spectrum_search_frequencies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use conditions (radius search near a coordinate), when-not (locations filed without coordinates are not returned; market-area licenses go to another tool), and the default filter state ('active by default'). The named alternative tool and the condition selecting it are spelled out, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fcc_spectrum_get_licenseGet an FCC ULS licenseARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| usi | No | Unique 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. | |
| callsign | No | Callsign 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_offset | No | Lease to start at, counted from 0 in lease-ID order; pass nextLeaseOffset from the previous call to read the next 100. | |
| location_number | No | Location 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_offset | No | Location 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_frequencies | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The max_frequencies cap applied. |
| error | No | Present when the call failed. Absent on success. |
| found | No | True when a record matched; false returns guidance and candidates instead. |
| shown | No | Frequency rows returned. |
| notice | No | What 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. |
| license | No | The record; present when found is true. |
| dataAsOf | No | Creation time of the newest applied ULS file (ISO 8601). |
| guidance | No | Why nothing matched and where to look next; present when found is false. |
| locations | No | Locations 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. |
| siteTotal | No | Sites the record files, each site of a shared location number counted; present when found is true. |
| truncated | No | True 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. |
| candidates | No | Up to 5 records whose callsign starts with the one requested; present when a callsign lookup found nothing. |
| locationTotal | No | Location numbers the record files; present when found is true. |
| nextLeaseOffset | No | Pass as lease_offset to read the leases after these; absent when none follow. |
| technicalRetained | No | False 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. |
| nextLocationOffset | No | Pass as location_offset to read the locations after these; absent when none follow. |
| otherCallsignRecords | No | Other records under the same callsign (ULS reuses callsigns); present when found is true. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already covering the read-only/idempotent safety profile, the description adds substantial behavioral context beyond them: paging caps (50 locations, 100 antennas, max_frequencies rows, 100 leases), the nextLocationOffset/nextLeaseOffset paging protocol, truncation order ("rows beyond it are dropped from the last locations first"), the dedup rule for callsigns shared by several records, and the filter that technical detail is kept only for active, pending-legal, and term-pending records.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and scope are front-loaded, and the dense later clauses about paging, detail retention, and dedup all carry information an agent needs. It is a single long semicolon-chained passage rather than cleanly separated sections, which slightly hurts scannability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, yet the description still tells the agent what record types exist (geographic-area licenses with market/spectrum blocks, lease links in both directions) and how to page large records. Nothing needed to call this correctly appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all six parameters with patterns, defaults, and constraints; that sets the baseline at 3. The description reinforces the meaning of the offsets and max_frequencies but adds little semantic detail the schema does not already carry.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ("Fetch one FCC ULS license or spectrum lease in full") and enumerates the returned structure down to antenna emission designators, so an agent knows exactly what this tool produces. It also names the two lookup keys (callsign, USI) that separate it from the search siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is implied clearly: usi values come from fcc_spectrum_search_licenses / find_transmitters / search_frequencies, and location_number comes from find_transmitters or search_frequencies results, which routes the agent to use this after searching. There is no explicit when-not statement or direct contrast with fcc_spectrum_search_licenses beyond this sourcing of arguments.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fcc_spectrum_list_referenceList FCC ULS reference codes and coverageARead-onlyIdempotentInspect
Decode FCC ULS codes used by the other tools — radio service codes, license statuses, location types, antenna types, applicant types, amateur operator classes — or report coverage: which service groups this index holds, record counts, and when each was last updated. Works before the index is built.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | Yes | What to list: a code vocabulary (radio_services, license_statuses, location_types, antenna_types, applicant_types, operator_classes) or coverage, the index build state and loaded service groups. | |
| filter | No | Radio services only: keep entries whose code and label contain every word given, in any order (e.g. "700 public safety"). Case- and accent-insensitive. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| index | No | Index build state; present for coverage. |
| topic | No | The topic answered. |
| groups | No | Every weekly service group this server can index, with whether it is loaded; present for coverage. |
| notice | No | Guidance when a filter matched nothing, was not applied, or the index is not built yet. |
| entries | No | Decoded codes, in code order; present for every topic except coverage. |
| dataAsOf | No | Creation time of the newest applied ULS file (ISO 8601); absent before the index is built. |
| redactIndividuals | No | True when individual licensees are redacted and excluded from name search; present for coverage. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint=false, so the safety profile is covered structurally. The description adds genuinely useful context beyond that: this lookup works even before the index is built, and the coverage branch reports record counts and last-updated timestamps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences, front-loaded with the primary purpose (decode codes) followed by the secondary one (report coverage). Every clause earns its place and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and the description covers both invocation modes plus the pre-index availability. Only the `filter` parameter's behavior is left entirely to the schema, which is acceptable given the schema documents it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with the enum values and the filter semantics fully documented in the schema itself. The description restates the same vocabulary list already enumerated in the `topic` enum and says nothing about the `filter` parameter, so it adds little beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific dual purpose — decoding FCC ULS code vocabularies or reporting index coverage — and enumerates the exact vocabularies (radio services, license statuses, location types, antenna types, applicant types, operator classes). This clearly separates it from the find/get/search sibling tools, which operate on records rather than code lookups.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Decode FCC ULS codes used by the other tools' establishes the context (a helper for interpreting values returned by siblings), and 'Works before the index is built' signals a prerequisite-free availability window. No explicit when-not guidance or named alternative is given, but the usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fcc_spectrum_search_frequenciesSearch FCC ULS authorizations by frequencyARead-onlyIdempotentInspect
Find FCC ULS authorizations whose occupied band overlaps a frequency or band. Site assignments (land mobile, microwave, paging, cellular sites) return one row per site and frequency with the site's state and coordinates; market-area licenses and leases (PCS, AWS, 700 MHz, 3.45 and 3.7 GHz, and other auctioned blocks) return one row per spectrum block with its market code and name; 3.5 GHz Priority Access Licenses file no frequency, so list them with fcc_spectrum_search_licenses and radio_service PL. Filter by state, radio service, licensee, FRN, market code, and live status (active by default). For transmitter sites near a coordinate, use fcc_spectrum_find_transmitters.
| Name | Required | Description | Default |
|---|---|---|---|
| frn | No | Licensee's FCC Registration Number, up to 10 digits; spaces and hyphens are removed and it is left-padded with zeros. Individual licensees match and are returned redacted. | |
| kind | No | site: transmitter-site assignments only; market: market-area spectrum blocks only; both (default). | both |
| unit | No | Unit of the frequencies: kHz, MHz (default), or GHz. | MHz |
| limit | No | Rows per page (1–200). | |
| state | No | Two-letter USPS code or full state name. Sites match on their filed state, or the state derived from their coordinates. Market blocks match when their FCC market area reaches the state (a multi-state market matches each of its states), their market name carries the state code, or their license files a site there; nationwide and Gulf of Mexico markets match no state. | |
| cursor | No | nextCursor from the previous page of the same search; omit for the first page. | |
| status | No | A active (default), L pending legal, X term pending, or "any" for all three. Other statuses keep no frequency records. | A |
| licensee | No | Licensee name words, with at least one letter or digit; every word must match the start of a word in the name, in any order. A word joined by - or & ("T-Mobile", "AT&T") matches its pieces side by side. | |
| market_code | No | Market code of the license, matched exactly, e.g. "PEA016", "CMA020", or "NW" (nationwide); market rows carry it as marketCode. Applies to site and market rows alike, since cellular (CMA) licenses file sites rather than blocks. Case, spaces, and hyphens are ignored, and the digits are left-padded with zeros ("pea16" reads as PEA016). | |
| frequency_low | Yes | Frequency in unit; with frequency_high, the band's lower edge. Matches any authorization whose occupied band overlaps. | |
| radio_service | No | Two-character radio service code, e.g. "WU" (700 MHz upper band); see fcc_spectrum_list_reference topic "radio_services". | |
| frequency_high | No | Band upper edge in unit; omit to search a single frequency. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The page limit applied. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Rows on this page. |
| notice | No | Why nothing matched, what the state and redaction rules skipped, or how to page further. |
| dataAsOf | No | Creation time of the newest applied ULS file (ISO 8601). |
| truncated | No | True when more rows follow this page. |
| nextCursor | No | Pass as cursor with the same inputs for the next page; absent on the last page. A page over a dense band can hold fewer rows than limit and still carry one. |
| totalCount | No | Rows matching the filters, across every page; at least this many when totalIsLowerBound is true. |
| assignments | No | Matching site assignments and market blocks, frequency ascending. |
| appliedFilters | No | Filters as the server applied them, normalized values and defaults included. |
| totalIsLowerBound | No | True when a dense band was counted only in part, so totalCount is a lower bound; absent when the count is exact. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover safety (readOnly, idempotent, closed-world), but the description adds substantive behavior: the divergent row shapes for site vs market/lease records, the coverage gap that PALs file no frequency, and the default live-status filter. It doesn't mention pagination semantics beyond the schema's cursor/limit, but the depth here exceeds the annotation bar.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, purpose front-loaded, with the routing advice appended rather than buried. The long semicolon-delimited enumerations of license types and filters are dense but each clause carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation. For a 12-parameter search tool, the description covers purpose, result row semantics, coverage exclusions, and sibling alternatives – nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description enumerates the filterable dimensions (state, radio service, licensee, FRN, market code, live status) but adds little syntax or semantics beyond what the schema already documents for each parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource+scope: 'Find FCC ULS authorizations whose occupied band overlaps a frequency or band.' It then distinguishes result shapes (one row per site vs per spectrum block), which no sibling tool does, so an agent can route correctly without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes two cases to alternatives: 3.5 GHz Priority Access Licenses have no frequency and must go through fcc_spectrum_search_licenses with radio_service PL, and coordinate-proximity transmitter searches belong to fcc_spectrum_find_transmitters. Both when-not conditions are named with the substitute tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fcc_spectrum_search_licensesSearch FCC ULS licensesARead-onlyIdempotentInspect
Search FCC ULS licenses and spectrum leases by callsign, licensee name, FCC Registration Number (FRN), market code, radio service, status, and licensee state, returning one row per record with its unique system identifier (USI) for fcc_spectrum_get_license. At least one of callsign, licensee, frn, market_code, radio_service, or state is required; status only narrows. Defaults to active records; pass status "any" to include expired, cancelled, and terminated ones. Licensee name matching is word-based (every word must appear as a word prefix), not fuzzy.
| Name | Required | Description | Default |
|---|---|---|---|
| frn | No | FCC Registration Number, up to 10 digits; spaces and hyphens are removed and it is left-padded with zeros. | |
| limit | No | Records per page (1–100). | |
| state | No | Licensee mailing state: a two-letter USPS code (incl. DC, PR, VI, GU, AS, MP) or a full state name. This is the licensee's address, not the site location. | |
| cursor | No | nextCursor from the previous page of the same search; omit for the first page. | |
| status | No | License status: A active, L pending legal, X term pending, E expired, C canceled, T terminated, P parent station canceled, or "any" for every status. Defaults to A. | A |
| callsign | No | Exact callsign or lease ID, e.g. "KNKA123" or "L000012345". Case, spaces, and one trailing portable suffix ("/4") are normalized. ULS reuses callsigns, so several records can match. | |
| licensee | No | Licensee name words, with at least one letter or digit; every word must match the start of a word in the name, in any order (e.g. "verizon wireless"). A word joined by - or & ("T-Mobile", "AT&T") matches its pieces side by side. | |
| market_code | No | Market code of a geographic-area license, matched exactly, e.g. "PEA016", "CMA020", "D06037", or "NW" (nationwide); results carry it as marketCode. Case, spaces, and hyphens are ignored, and the digits are left-padded with zeros ("pea16" reads as PEA016). | |
| radio_service | No | Two-character radio service code, e.g. "CD" (paging) or "BR" (BRS); see fcc_spectrum_list_reference topic "radio_services". |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The page limit applied. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Records on this page. |
| notice | No | Why nothing matched, what redaction excluded, or how to page further. |
| dataAsOf | No | Creation time of the newest applied ULS file (ISO 8601). |
| licenses | No | Matching records, ranked by name-match relevance when licensee is given and in callsign order otherwise. |
| truncated | No | True when more records follow this page. |
| nextCursor | No | Pass as cursor with the same filters for the next page; absent on the last page. |
| totalCount | No | Records matching the filters, across every page. |
| appliedFilters | No | Filters as the server applied them, normalized values and defaults included. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it read-only and idempotent, so the safety profile is covered. The description still adds meaningful behavior beyond that: the default-to-active filtering and the word-prefix (non-fuzzy) matching semantics of licensee names, which an agent could otherwise get wrong.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose, then adds constraint, default-status, and matching-semantics sentences. Four sentences, all carrying distinct information with no repetition, though it is dense enough that a slight trim would improve it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained. The description fully covers the invocation constraints, default filtering, status override, and matching caveats for a nine-parameter search tool, leaving nothing an agent needs missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the schema documents each parameter's format, keeping this near the baseline of 3. The description goes beyond it by stating the cross-parameter constraint (at least one of callsign/licensee/frn/market_code/radio_service/state required), which is not expressed via JSON Schema required fields, plus the status-narrowing rule.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Search) and resource (FCC ULS licenses and spectrum leases), enumerates the filterable fields, and precisely describes the return shape (one row per record with USI). It also names the follow-up sibling fcc_spectrum_get_license, so an agent can distinguish it from find_transmitters and search_frequencies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete conditions: at least one of the six search fields is required, status only narrows, and status "any" is needed to include expired/cancelled/terminated records. It explains the follow-up tool by name, but does not explicitly contrast against the other search siblings, keeping 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.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
5 tool updates
- First observed
fcc_spectrum_find_transmitters - First observed
fcc_spectrum_get_license - First observed
fcc_spectrum_list_reference - First observed
fcc_spectrum_search_frequencies - First observed
fcc_spectrum_search_licenses
Related MCP Connectors
Explore FCC ULS licenses, ASR antenna structures, and microwave path elevation profiles.
Search FCC radio licenses by company, call sign, or FRN; monitor status changes and snapshots.
FCC Open Data (opendata.fcc.gov) Socrata MCP.
US telecom availability and intelligence by address, with FCC provenance. Fiber-first.
Related MCP Servers
- AlicenseAqualityBmaintenanceSearch 419,000+ LLM-extracted space regulatory filings from the FCC, ITU, UNOOSA, and FAA. Semantic search, entity dossiers, spectrum-band holdings, launch licenses, filing trends, and alerts.211MIT
- AlicenseNot gradedqualityBmaintenanceEnables querying and searching Fauquier County, Virginia open geospatial datasets (parcels, zoning, addresses, public works) via ArcGIS Feature Services.313 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables searching and querying of City of Falls Church GIS open geospatial data (parcels, zoning, public works) via ArcGIS feature services.261 npmMIT
- AlicenseNot gradedqualityAmaintenanceEnables AI agents and MCP clients to sync, search, and retrieve amateur radio repeater data from RepeaterBook.com through three typed tools.51 PyPI3MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.