fcc-spectrum-mcp-server について
fcc-spectrum-mcp-serverは、周波数の調査担当者や免許人、分析担当者がローカルインデックスから米国FCCの無線免許記録を検索するためのサーバーです。免許やサイト、周波数を検索し、参照コードを解読できます。フルパワー放送局と衛星地球局は対象外です。
主な機能
- 01免許とスペクトラムリースの検索
- 02免許のサイトと技術記録の参照
- 03近隣の免許済み送信局の検索
- 04周波数帯による割り当て検索
- 05ULS参照コードの解読
活用シーン
- 01コールサインから免許詳細を確認
- 02座標付近の免許済みサイトを特定
- 03指定周波数を含む免許を調査
- 04FCCのサービス・ステータスコードを解読
MCP 対応
STDIOまたはStreamable HTTP経由で、MCPクライアントに5つのツールと2つのリソースを提供します。検索にはローカルのSQLiteインデックスを使い、構築と更新にはネットワーク接続が必要です。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://fcc-spectrum.caseyjhand.com/mcpclaude mcp add --transport http cyanheads-fcc-spectrum https://fcc-spectrum.caseyjhand.com/mcp{"mcpServers":{"cyanheads-fcc-spectrum":{"type":"http","url":"https://fcc-spectrum.caseyjhand.com/mcp"}}}Cursor で開く{"servers":{"cyanheads-fcc-spectrum":{"type":"http","url":"https://fcc-spectrum.caseyjhand.com/mcp"}}}VS Code で開く{"mcpServers":{"cyanheads-fcc-spectrum":{"type":"http","url":"https://fcc-spectrum.caseyjhand.com/mcp"}}}{"mcpServers":{"cyanheads-fcc-spectrum":{"serverUrl":"https://fcc-spectrum.caseyjhand.com/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
5| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| frn | string | いいえ | FCC 登録番号。最大 10 桁で、空白とハイフンは削除され、左側がゼロで埋められます。 |
| limit | integer | いいえ | ページあたりのレコード数を表す正の整数です。100 を超える値は 100 に制限され、その旨が通知されます。 |
| state | enum | いいえ | ライセンシーの郵送先住所の州です。2 文字の USPS コード(DC、PR、VI、GU、AS、MP を含む)または州の正式名称を指定します。これはライセンシーの住所であり、設置場所ではありません。AL | AK | AZ | AR | CA | CO | CT | DE | DC | FL | GA | HI | ID | IL | IN | IA | KS | KY | LA | ME | MD | MA | MI | MN | MS | MO | MT | NE | NV | NH | NJ | NM | NY | NC | ND | OH | OK | OR | PA | RI | SC | SD | TN | TX | UT | VT | VA | WA | WV | WI | WY | AS | GU | MP | PR | VI |
| cursor | string | いいえ | 同じ検索の前ページで返された nextCursor です。最初のページでは省略してください。 |
| status | enum | いいえ | ライセンスのステータス:A は有効、L は法務保留中、X は期間保留中、E は期限切れ、C は取り消し済み、T は終了、P は親局取り消し済みです。または、すべてのステータスを対象にするには "any" を指定します。デフォルトは A です。A | C | E | L | P | T | X | any |
| callsign | string | いいえ | 完全一致するコールサインまたはリース ID。例:"KNKA123"、"L000012345"。大文字と小文字、空白、および末尾のポータブルサフィックス("/4")1 つは正規化されます。ULS ではコールサインが再利用されるため、複数のレコードが一致する場合があります。 |
| licensee | string | いいえ | ライセンシー名に含まれる単語。少なくとも 1 つの文字または数字が必要です。各単語は、順序を問わず、名前内の単語の先頭に一致する必要があります(例:"verizon wireless")。- または & で結合された単語("T-Mobile"、"AT&T")は、隣接する各部分として一致します。 |
| market_code | string | いいえ | 地理エリアライセンスのマーケットコード。完全一致で指定します。例:"PEA016"、"CMA020"、"D06037"、"NW"(全国)。結果には marketCode として含まれます。大文字と小文字、空白、ハイフンは無視され、数字の左側はゼロで埋められます("pea16" は PEA016 として扱われます)。 |
| radio_service | string | いいえ | 2 文字の無線サービスコード。例:"CD"(ページング)、"BR"(BRS)。fcc_spectrum_list_reference のトピック "radio_services" を参照してください。 |
詳細
@cyanheads/fcc-spectrum-mcp-server
MCP を通じて FCC の無線免許を検索し、近くの免許取得済みサイトを見つけ、特定の周波数の免許取得者を確認できます。STDIO または Streamable HTTP に対応しています。
公開ホスト型サーバー: https://fcc-spectrum.caseyjhand.com/mcp
概要
FCC の Universal Licensing System に登録された米国の無線周波数ライセンスを、オフラインで検索できます。コールサイン、ライセンシー、または市場を調べたり、ライセンスのサイト、アンテナ、周波数、マイクロ波回線を確認したり、地点の近くにある送信機を検索したり、任意の周波数または帯域で認可されている事業者を確認したりできます。陸上移動無線、マイクロ波、携帯電話、ポケットベル、アマチュア無線などに対応しています。フルパワーの放送局と衛星地球局は含まれません。API キーは不要です。
ツール
| ツール | 説明 |
|---|---|
fcc_spectrum_search_licenses | コールサイン、ライセンシー名、FRN、市場コード、無線サービス、ステータス、またはライセンシーの州でライセンスと周波数リースを検索します。 |
fcc_spectrum_get_license | コールサインまたは USI でライセンスまたはリースの全情報を取得します。ライセンシー、ステータスと日付、所在地、アンテナ、電波形式を含む周波数、マイクロ波回線、市場ブロック、リースへのリンクを確認できます。 |
fcc_spectrum_find_transmitters | 座標から指定した半径内にある FCC 認可済みサイトを近い順に検索し、申請時に登録された役割と認可済み周波数を表示します。 |
fcc_spectrum_search_frequencies | 占有帯域が指定した周波数または帯域と重なる、サイトの周波数割り当てと市場エリアの周波数ブロックを検索します。 |
fcc_spectrum_list_reference | ULS コード(無線サービス、局クラス、ステータス、所在地とアンテナの種類、申請者の種類、オペレータークラス)を解読し、インデックスの対象範囲と最新度を報告します。 |
リソース
| リソース | 説明 |
|---|---|
fcc-spectrum://license/{callsign} | コールサインごとのライセンスまたはリースを1件、JSON形式で返します。fcc_spectrum_get_license が返す最初のページです。 |
skill://fcc-spectrum-guide/SKILL.md | ULS 調査のワークフローガイダンスです。完全性の確認、識別子、共有サイト、市場の地理情報、リース、マイクロ波経路を扱います。 |
ライセンス記録には fcc_spectrum_get_license からもアクセスできます。調査ガイド は、resources/list と resources/read を通じてクライアントから利用できます。
機能リファレンス
fcc_spectrum_search_licenses tool
- フィルター:
callsign、licensee(名前の単語の先頭と一致する語がすべて含まれている必要があります)、frn、market_code(地理的エリアライセンスの市場。完全一致で照合します:PEA016、CMA020、D06037、NW。pea16はPEA016として扱われます)、radio_service、state(ライセンシーの郵送先州)。少なくとも1つが必須です。statusはA(デフォルト)、C、E、L、P、T、X、またはanyに絞り込みます - 正の整数
limit(デフォルトは25、上限は100)。カーソルによるページ分割に対応します。各行には、fcc_spectrum_get_licenseに渡すusiと、isLease、licenseeRedacted、位置情報および周波数の件数が含まれます - 型付きエラー:
no_criteria、unknown_radio_service、service_not_indexed、invalid_cursor、index_not_ready
fcc_spectrum_get_license tool
callsignまたはusiのいずれか一方のみを指定します(それ以外の場合はidentifier_required)。複数の記録に共有されているコールサインの場合、アクティブな記録があればそれを、なければ最も新しい記録を返し、その他の記録はotherCallsignRecordsに一覧表示します- 大きな記録はページ分割して返します。各ページには、サイト50件、アンテナ100件、マイクロ波経路100件までの位置情報全体(これを超える位置情報は単独で一覧表示)、リース100件まで、および
max_frequencies件の周波数行を含められます(max_frequenciesは正の整数で、デフォルトは100、上限は1000)。次の呼び出しでは、nextLocationOffsetとnextLeaseOffsetをlocation_offsetとlease_offsetに渡します - マイクロ波経路(FCC PA 記録)は、それらを送信するアンテナの下に
pathsとして一覧表示されます。内容は、申請時の経路番号、種類、パッシブかどうか、受信側のコールサイン、および受信側の位置番号とアンテナ番号を含むreceive端点です。ライセンスに受信番号の有効なサイトが1件だけ登録されている場合は座標も含まれ、該当するサイトがない、または複数ある場合はsiteCountが含まれます。アンテナ記録が一致しない場合はantennaFiled: falseが含まれます。pathTotalは、すべての位置情報にわたる記録内の経路数です(経路のインデックス化前に構築されたインデックスでは、mirror:initによって再構築されるまで存在しません)。後続の位置情報がある場合、通知にはその位置情報に対して一覧表示された経路が記載されます location_numberを指定すると、fcc_spectrum_find_transmittersまたはfcc_spectrum_search_frequenciesのサイトのlocationNumberから位置情報の一覧を開始します。ゼロ以外のlocation_offsetと併用すると失敗します(location_start_conflict)- 見つからない場合、エラーではなく、
guidanceと最大5件のコールサイン接頭辞候補を含むfound: falseが返されます。technicalRetained: falseは、ステータスのためサイトまたは周波数が保持されていない記録を示します
fcc_spectrum_find_transmitters tool
latitude/longitudeは十進度または DMS 文字列で指定し、radius_kmは 0.1~100(デフォルトは 5)です。unit(kHz、デフォルトのMHz、GHz)で指定する任意のfrequency_low/frequency_high、radio_service、location_type(ULS のロケーションタイプコードのいずれか。大文字と小文字は区別されません。Fは固定局のみ、Mは移動局、Tは一時的な固定エリアを保持します)、およびstatus(デフォルトはA、L、X、または3種類すべてを対象とするany)を指定できます- サイトは近い順に並びます。正の整数
limit(デフォルトは 25、上限は 100)でカーソルページングを利用できます。各サイトには最大max_frequencies_per_site件の周波数(正の整数、デフォルトは 10、上限は 50)が表示され、全件数はfrequencyCountに格納されます - 登録されている場合、各サイトには
locationTypeCode、locationTypeLabel、radiusKm、locationClassCode、locationClassLabelが含まれます。移動局または一時的な固定エリアは登録された中心地点で返され、distanceKmはその中心地点までの距離を示します。location_class(大文字と小文字は区別されないC、L、P、R、T)を指定すると、FCC クラスを1つに絞り込めます。結果が示すのは認可情報であり、実際の放送状況ではありません - 型付きエラー:
invalid_frequency_range、unknown_radio_service、service_not_indexed、invalid_cursor、index_not_ready
fcc_spectrum_search_frequencies tool
frequency_lowは必須で、frequency_highは任意です。どちらもunitで指定します。サイトの割り当ては、占有帯域を放射帯域幅分広げた範囲がクエリと重なる場合に一致し、市場ブロックは登録された上下端が重なる場合に一致します。kindはsite、market、both(デフォルト)のいずれかですstate、radio_service、licensee、frn、market_code、status(デフォルトはA、L、X、any)で絞り込めます。正の整数limit(デフォルトは 50、上限は 200)でカーソルページングを利用でき、周波数の昇順で表示されます。各行のkindは、それがサイトの割り当てか市場ブロックかを示しますmarket_codeとfrnはサイト行と市場行の両方を絞り込みます。frnによる検索では、個々のライセンシー名が伏せられます。単一サイトの行には、登録されている場合locationTypeCode、locationTypeLabel、radiusKm、locationClassCode、locationClassLabelが含まれます。共有番号の行と市場ブロックには含まれません- 型付きエラー:
invalid_frequency_range、unknown_radio_service、service_not_indexed、invalid_cursor、index_not_ready
fcc_spectrum_list_reference tool
topic:radio_services、station_classes、license_statuses、location_types、antenna_types、applicant_types、operator_classes、coverageのいずれかです。filterを指定すると、コードとラベルの両方に含まれるすべてのトークンに一致する無線サービスと局クラスに絞り込まれます。大文字と小文字およびアクセント記号は区別されず、句読点はトークンの区切りとして扱われます- 検索に使用する
filterには、ASCII 文字または数字を1つ以上含める必要があります(それ以外はinvalid_filter)。空欄の場合は未設定として扱われます。その他のトピックではフィルターは無視され、その旨が示されます {"topic":"station_classes","filter":"FXO"}のように指定すると、局クラスを照会できます(FXOは Operational Fixed、FB2は Mobile Relay、MOは Mobile)。ラベルは、FCC のuls_code_definitions_20240718.txtに基づく266コードの同梱テーブルから取得されます(アーカイブ版)。対応するコードがない場合は、該当項目なしで返されます。これらは認可された区分であり、実際の放送状況を示すものではありませんcoverageは、index.status(none、building、ready)、グループごとのレコード数、サイト数、周波数数とスナップショット時刻、および情報の秘匿化が有効かどうかを報告します。インデックスの構築前でも利用できます。index.antennaCoverageIncomplete: trueは、番号のないアンテナが欠落している古いインデックスを示し、index.pathCoverageIncomplete: trueは、マイクロ波経路のインデックス作成前に構築されたインデックスを示します。どちらもbun run mirror:initで再構築できます
fcc-spectrum://license/{callsign} resource
fcc_spectrum_get_licenseの最初のページ(最大100件の周波数行とマイクロ波経路)をapplication/jsonとして返します。dataAsOf、合計件数、および残りの情報を読み取るツール呼び出しの名前を示すnoticeが含まれます。1時間キャッシュされます- 型付きエラー:
index_not_ready、license_not_found
機能
@cyanheads/mcp-ts-core を基盤としており、stdio および Streamable HTTP トランスポート、プラグイン可能な認証(none/jwt/oauth)、切り替え可能なストレージ(in-memory、filesystem、Supabase、Cloudflare KV/R2/D1)、オプションの OpenTelemetry トレーシングを備えた構造化ログに対応しています。
FCC ULS 固有の機能:
- キー不要で、リクエスト時はローカルで処理 — クエリのたびに SQLite インデックスを読み取ります。ネットワークアクセスが必要なのは、インデックスの構築と更新時のみです
- 使用帯域を考慮した周波数照合 — 各割り当ての帯域は、電波型式から解析した帯域幅分だけ広げられるため、広帯域チャンネルの端に近いクエリでも結果に含まれます
- 周波数リースを第一級のレコードとして扱います —
isLeaseでリースを示し、表示するライセンシーは借受人です。また、リースリンクを両方向に一覧表示します - 申請データでサイトの州が空欄の場合(マイクロ波や BRS/EBS で一般的)、座標から州を判定し、
stateFromCoordinatesで示します - 個人ライセンシーはデフォルトで編集され、連絡先情報は取り込みません。詳しくは個人ライセンシーの編集をご覧ください
エージェント向けの出力:
- データの鮮度とフィルターの反映 — すべてのデータレスポンスに
dataAsOfが含まれ、検索ツールはappliedFiltersを返します - 切り詰めの明示 —
truncated、shown、cap、totalCountに加えて、次の呼び出しを示すnoticeが含まれるため、途中までのページが全件として扱われることはありません。出力予算が上限を超えると、その値に制限され、指定値と適用値を示すnoticeが付加されます - 欠損値は欠損のまま — ULS で空欄のフィールドは省略され、検証に失敗した座標は DMS テキスト(
coordinatesDms)として保持され、すべてゼロのプレースホルダー座標は除外されます - 判別可能な出力 —
found、kind、isLease、licenseeRedacted、technicalRetainedにより、呼び出し元は文字列の解析ではなくデータに基づいて処理を分岐できます
はじめに
インストールせずに、ホストされたインスタンスに接続します:
claude mcp add --transport http fcc-spectrum-mcp-server https://fcc-spectrum.caseyjhand.com/mcp
ホストされたインデックスは毎週再構築され、毎日更新されます。個人ライセンシーは編集されています。
または、初回セットアップで構築したインデックスを使ってローカルで実行します:
claude mcp add fcc-spectrum-mcp-server -e FCC_SPECTRUM_MIRROR_DIR=/path/to/fcc-uls -- bunx @cyanheads/fcc-spectrum-mcp-server
その他のクライアントでは、MCP 設定ファイルに以下を追加します:
{
"mcpServers": {
"fcc-spectrum-mcp-server": {
"command": "bunx",
"args": ["@cyanheads/fcc-spectrum-mcp-server"],
"env": { "FCC_SPECTRUM_MIRROR_DIR": "/path/to/fcc-uls" }
}
}
}
FCC_SPECTRUM_MIRROR_DIR には、mirror:init が構築したディレクトリを指定する必要があります。絶対パスを使用してください。MCP クライアントはプロセスの作業ディレクトリを選択するためです。最初の構築が完了するまでは、データツールは index_not_ready エラーになります。トピック coverage を指定した fcc_spectrum_list_reference で、構築状況を確認できます。
Docker またはソースからのビルドについては、サーバーの実行をご覧ください。
初回セットアップ
インデックスは、FCC の公開 ULS 一括ファイル(data.fcc.gov)から構築されます。サービスグループごとの週次フルスナップショットに加え、日次の差分ファイルも使用します。デフォルトのグループでは、ビルド時に約 1.1 GB の ZIP ファイルを 1 つずつダウンロードします。実測では、3,270,502 件のライセンスレコードと約 1.8 GB のインデックスを約 3 分で生成しました。
ソースをチェックアウトして bun run build を実行した後(サーバーの実行を参照)、インストール済みパッケージから、または Docker イメージを使って、一度ビルドします。
# Download the weekly snapshots and build the index (resumable; skips when nothing is newer)
FCC_SPECTRUM_MIRROR_DIR=/path/to/fcc-uls bun run mirror:init
# Check it: SQLite integrity plus per-file line counts against the FCC's counts files
FCC_SPECTRUM_MIRROR_DIR=/path/to/fcc-uls bun run mirror:verify
# Apply the daily incrementals published since the last build
FCC_SPECTRUM_MIRROR_DIR=/path/to/fcc-uls bun run mirror:refresh
各 mirror:* スクリプトは、Bun 上で dist/cli/ 内のコンパイル済みエントリーポイントを実行します。npm からインストールした場合は、パッケージディレクトリでスクリプトを実行するか、エントリーポイントを直接呼び出します。FCC_SPECTRUM_MIRROR_DIR=/path/to/fcc-uls bun node_modules/@cyanheads/fcc-spectrum-mcp-server/dist/cli/mirror-init.js(mirror-verify.js と mirror-refresh.js も同様です)。
Docker では、ボリュームに対して同じコマンドを実行します。docker run --rm -v fcc-uls:/usr/src/app/.mirror ghcr.io/cyanheads/fcc-spectrum-mcp-server:latest bun run mirror:init
最新の状態を維持する方法:
- HTTP トランスポート。 サーバーは、プロセスのローカル時刻で、日曜日の 16:00 に週次再構築、17:00 に日次更新をスケジュールします(Docker イメージは UTC で動作します。FCC は米国東部時間の日曜朝にスナップショットを公開します)。更新時には、利用可能な日次公開日を確認して、欠落や上書きされたファイルがないか調べます。それらのファイルでチェックポイントまでを補えない場合は、週次再構築を実行してから更新を再試行します。新しいスナップショットがない場合は、復旧可能になるまでジョブは失敗を報告します。最初のインデックスが公開されるまでは、どちらのジョブも実行されません。各ジョブはサーバーのランタイム上で子プロセスとして実行されるため、書き込み中もクエリと
/healthzは応答を続け、ログ行はサーバーログに出力されます。シャットダウン時に実行中のジョブは停止し、次回の実行時に再開します。 - stdio。 スケジュールは設定されません。cron や別のスケジューラーから、毎日
mirror:refresh、毎週mirror:initを実行してください。日次ファイルではライセンスが削除されないため、削除分は週次再構築で反映されます。 - ディスク。 再構築では、提供中の世代の隣に新しい世代を書き込むため、2 つ目のインデックスに加え、最大の ZIP ファイル(約 420 MB)を置ける空き容量を確保してください。古い世代は次回の再構築開始時に削除されます。
- 同時実行。 取り込みロックにより、
mirror:init、mirror:refresh、スケジュール済みジョブのいずれか 1 つだけが同時に書き込みを行います。中断されたmirror:initは、再実行すると最後に完了したステップから再開します。
設定
| 変数 | 説明 | デフォルト |
|---|---|---|
FCC_SPECTRUM_MIRROR_DIR | インデックスとビルドファイルを格納するディレクトリです。絶対パスを使用してください。 | .mirror/fcc-uls |
FCC_SPECTRUM_SERVICES | インデックス化する週次サービスグループをカンマ区切りで指定します。大文字と小文字は区別されません。オプトイン:gmrs、ship、aircr。不明な名前を指定すると、起動に失敗し、有効な値の一覧が表示されます。 | LMpriv,LMcomm,LMbcast,micro,cell,market,paging,coast,mdsitfs,amat |
FCC_SPECTRUM_REDACT_INDIVIDUALS | 個人のライセンス保有者名と受託者名を伏せ、個人を名前検索の対象から除外します。無効にするには、false、0、no、off のいずれかを指定します。 | true |
FCC_SPECTRUM_BASE_URL | ULS 一括ファイルのホストルートです。インデックスの構築または更新時のみ読み込まれます。 | https://data.fcc.gov/download/pub/uls |
MCP_TRANSPORT_TYPE | トランスポート:stdio または http。 | stdio |
MCP_SESSION_MODE | セッションモード:auto(ステートフルに解決)、stateful、または stateless。 | stateless |
MCP_HTTP_PORT | HTTP サーバーのポートです。 | 3010 |
MCP_HTTP_ENDPOINT_PATH | MCP サーバーをマウントする HTTP エンドポイントのパスです。 | /mcp |
MCP_AUTH_MODE | 認証モード:none、jwt、または oauth。 | none |
MCP_LOG_LEVEL | ログレベル(RFC 5424)です。 | info |
LOGS_DIR | ログファイルのディレクトリです(Node.js のみ)。 | <project-root>/logs |
OTEL_ENABLED | OpenTelemetry インストルメンテーション(スパン、メトリクス、完了ログ)を有効にします。 | false |
オプションの上書き設定の全一覧は、.env.exampleを参照してください。
サービスグループ
FCC は週次スナップショットをサービスグループに分けています。グループの追加は次回の mirror:init から反映され、削除したグループは次回の週次再構築で対象から外れます。
| グループ | 内容 | インデックス登録 |
|---|---|---|
LMpriv | 民間陸上移動無線(公共安全、業務用、産業用) | デフォルト |
LMcomm | 商用陸上移動無線 | デフォルト |
LMbcast | 放送補助陸上移動無線 | デフォルト |
micro | ポイントツーポイント・マイクロ波 | デフォルト |
cell | 携帯電話 | デフォルト |
market | 市場エリア無線(PCS、AWS、700 MHz、3.45 GHz および 3.7 GHz、その他のオークション対象帯域) | デフォルト |
paging | ページング | デフォルト |
coast | 海岸局 | デフォルト |
mdsitfs | ブロードバンド無線サービスおよび教育用ブロードバンドサービス(BRS/EBS) | デフォルト |
amat | アマチュア無線 | デフォルト |
gmrs | General Mobile Radio Service — ライセンシーの記録のみ | オプトイン |
ship | 船舶局 — ライセンシーの記録のみ | オプトイン |
aircr | 航空機局 — ライセンシーの記録のみ | オプトイン |
個人ライセンシーの情報のマスキング
ULS の記録には、アマチュア無線に限らず、多くのライセンスの所有者である個人の名前が含まれています。個人は陸上移動無線、ページング、マイクロ波のライセンスも保有しています。FCC_SPECTRUM_REDACT_INDIVIDUALS はデフォルトで有効になっており、安全側に動作します。
- 申請者の種別が
Iの場合、またはアマチュア無線および GMRS サービスで空欄の場合、その記録は個人のものと見なされます。どのサービスでも種別が空欄またはH(その他)で、申請に個人の氏名の各要素が含まれている場合、あるいはライセンシー名に組織を示す語(Inc、County、Church、Wirelessなど)が含まれていない場合も、個人のものと見なされます。そのため、組織名にそのような語が含まれていない場合もマスキングされます。ライセンシー名はnullになり、licenseeRedacted: trueが設定されます。また、個人が自分の名前をサイト名として申請する場合があるため、ライセンシーの市、サイトの住所、サイト名も省略されます。 - 受託者の名前は、すべてのライセンスで非公開になります。受託者は必ず個人だからです。
- ライセンシー名での検索では個人が除外され、その旨がレスポンスの
noticeに示されます。コールサイン、USI、または FRN による検索では、マスキングされた状態で記録が返されます。 - サイトの座標、市、郡、州、技術データはそのまま保持されます。これらはスペクトル記録の一部です。
- マスキングはレスポンスの生成時に適用されるため、設定を変更するには再構築ではなく再起動が必要です。
ライセンシーの郵送先住所、ZIP コード、私書箱、宛名行、電話番号、FAX 番号、メールアドレスは、対象者を問わず一切取り込まれません。
既知の制限事項
- 高密度帯域の周波数検索では、部分的なページが返されます。 混雑した帯域(150~174 MHz 全体、または全スペクトラム)では、ページに含まれる行数が
limitより少なくてもnextCursorが付与されることがあり、この場合、totalCountは下限値になります(totalIsLowerBound: true)。正確な件数を得るには、state、radio_service、licensee、frn、またはmarket_codeで絞り込んでください。 - サイト、周波数、市場ブロックが保持されるのは有効なライセンスのみです(
A有効、L法的手続き中、X期間満了手続き中)。期限切れ、取り消し、終了済みのレコードには、ライセンシー、ステータス、日付、リースへのリンクが保持されます。 - 市場ブロックは郡ではなく州で照合されます。 FCC の市場区域定義で市場がその州に含まれる場合(複数州にまたがる市場は各州に一致)、市場名に州コードが含まれる場合、またはライセンスのサイトがその州に登録されている場合に、
stateは市場ブロックに一致します。郡や座標から、それを含む市場を特定するマッピングはありません。全米規模の市場とメキシコ湾の市場はどの州にも一致しません。また、名称に州コードがない Tribal land(TL)および MVDDS(MVD)の市場は対象外です。stateを指定せずにmarket_codeを使えば、これらの市場も検索できます。 - 半径検索では、運用区域の中心を基準に一致判定します。 ULS では、移動局と臨時固定局の位置を、運用半径を伴う中心点として登録します。
fcc_spectrum_find_transmittersは、中心点がradius_km内にある場合、その区域を中心点とradiusKmとともに返します。検索地点が区域内にあるという理由では一致しません。多くの移動局、臨時局、移動運用局、管制局の位置情報のように、座標なしで登録された位置は返されません。 - 州境付近では、推定された州は近似値です。 州境から約 1 キロメートル以内では特にそうです。プエルトリコ以外の地域には、推定された州が割り当てられません。
- 削除の反映には最大 1 週間の遅れがあります。 日次ファイルではライセンスは削除されず、週次の再構築で削除されます。更新間隔が日次の期間を超えると、全面的な再構築が必要になります。
- 優先アクセスライセンスは周波数では検索できません。 ULS では各 3.5 GHz PAL が周波数なしの 10 MHz チャネル幅として登録されます。
fcc_spectrum_search_licensesをradio_servicePLで使って一覧表示してください。 - 同じ位置番号に登録された周波数をサイトに関連付けることはできません。 ULS では周波数は位置番号に関連付けて登録されるため、ライセンスで複数のサイトが同じ番号に登録されている場合、周波数を特定のサイトに割り当てることはできません。
- 匿名化はレコードごとに行われます。 非個人の申請者種別で登録されたライセンスも保有する個人は、それらのレコードでは名前が表示されます。これらのレコードには同じ FRN が付与されています。
- 局種別のラベルには、同梱された FCC スナップショットが使われます。 技術情報の応答では登録されたコードが保持されます。
fcc_spectrum_list_referenceにtopic: "station_classes"とfilterを指定すると、既知のコードを解読できます。新しいコードや不明なコードには、同梱のラベルがない場合があります。 - 座標は登録時の NAD83 です。 測地系の変換は行われません。
- 現実的でない放射帯域幅が一部通過します。 周波数の 20%以上の帯域幅を持つ電波型式記号は、登録エラーとして無視されます。それより狭く、現実的でない登録内容は、登録されたとおりに扱われます。
サーバーの実行
前提条件
- Bun v1.4 以上(または Node.js v24 以上)。
bun:sqliteは Bun に組み込まれています。Node では、サーバーと同じ場所にbetter-sqlite3をインストールしてください(任意の peer dependency として宣言されています)。 FCC_SPECTRUM_MIRROR_DIRにインデックスを保存するためのディスク容量。デフォルトのグループでは約 1.8 GB に加え、上記のとおり再構築用の容量が必要です。- インデックスの構築または更新時に
data.fcc.govにアクセスできるネットワーク環境。クエリにはネットワーク接続は不要です。
インストール
ローカル開発、またはソースからインデックスを構築する場合:
- リポジトリをクローンします:
git clone https://github.com/cyanheads/fcc-spectrum-mcp-server.git
- ディレクトリに移動します:
cd fcc-spectrum-mcp-server
- 依存関係をインストールします:
bun install
- サーバーをビルドします。
mirror:*エントリもコンパイルされます:
bun run build
- インデックスを構築します(初回セットアップを参照):
FCC_SPECTRUM_MIRROR_DIR=/path/to/fcc-uls bun run mirror:init
ローカル開発
-
ビルドして実行します:
# One-time build bun run rebuild # Build the index (see First-run setup) bun run mirror:init # Run the built server bun run start:stdio # or bun run start:http -
チェックとテストを実行します:
bun run devcheck # Lint, format, typecheck, security bun run test # Vitest test suite bun run lint:mcp # Validate MCP definitions against spec
Docker
# Build the index once against the volume:
docker run --rm -v fcc-uls:/usr/src/app/.mirror ghcr.io/cyanheads/fcc-spectrum-mcp-server:latest bun run mirror:init
# Serve over HTTP:
docker run --rm -p 3010:3010 -v fcc-uls:/usr/src/app/.mirror ghcr.io/cyanheads/fcc-spectrum-mcp-server:latest
イメージはデフォルトで、ステートレスセッションを使用する HTTP トランスポートを設定し、mirror:* CLI を含み、/var/log/fcc-spectrum-mcp-server にログを記録します。stdio を使用するには、docker run -i --rm -e MCP_TRANSPORT_TYPE=stdio -v fcc-uls:/usr/src/app/.mirror ghcr.io/cyanheads/fcc-spectrum-mcp-server:latest を実行してください。ローカルでビルドするには、docker build -t fcc-spectrum-mcp-server . を実行します。OpenTelemetry のピア依存関係はデフォルトでインストールされます。省略するには、--build-arg OTEL_ENABLED=false を指定してビルドしてください。
プロジェクト構成
| ディレクトリ | 目的 |
|---|---|
src/index.ts | createApp() エントリーポイント。ツール、リソース、スキルディレクトリを登録し、インデックスサービスを初期化して、HTTP トランスポートで取り込みスケジュールを開始します。 |
src/config | Zod によるサーバー環境変数の解析と検証。 |
src/mcp-server/tools | ツール定義(*.tool.ts)、共有入力スキーマ、フォーマットヘルパー。 |
src/mcp-server/resources | リソース定義(*.resource.ts)。 |
src/services/uls | ULS サービス。バルククライアント、レコードパーサー、取り込み処理、インデックス世代、墨消し処理を含む読み取り経路、および起動するジョブプロセスを含む取り込みスケジュール。 |
src/cli | インデックスのライフサイクル CLI — mirror:init、mirror:refresh、mirror:verify — は dist/cli/ にコンパイルされます。 |
tests/ | src/ に対応する単体テストと統合テスト、および ULS レコードのフィクスチャ。 |
skills/ | 公開されている調査ガイド。MCP リソースとして提供されます。 |
開発ガイド
開発ガイドラインとアーキテクチャ上のルールについては、CLAUDE.md/AGENTS.md を参照してください。要点は次のとおりです。
- ハンドラーは例外をスローし、フレームワークが捕捉します。ツールロジックでは
try/catchを使用しません。 - リクエスト単位のログ記録には
ctx.logを使用します。データアクセスは ULS インデックスサービスを経由します。 - 新しいツールとリソースは、
src/mcp-server/*/definitions/index.tsのバレル経由で登録します。 - 実行時の信頼できる情報源はインデックスです。インデックスは別途ビルドおよび更新し、空の ULS フィールドは存在しない状態に保ちます。
貢献
問題の報告を歓迎します。提出前にチェックとテストを実行してください。
bun run devcheck
bun run test
ライセンス
Apache-2.0 — 詳細は LICENSE を参照してください。
ライセンスデータは FCC Universal Licensing System(ULS)に由来する、パブリックドメインに属する米国政府の著作物です(17 U.S.C. §105)。各レスポンスに含まれる dataAsOf の時刻とともに、「FCC Universal Licensing System (ULS)」としてクレジットを表示してください。このプロジェクトはライセンスデータを再配布しません。運用者がインデックスの構築時に FCC からダウンロードします。パッケージには、FCC の地域定義に基づく市場から州への対応表(src/services/uls/data/market-states.json)が含まれています。この表は、FCC の郡から市場への対応ファイル FCCCNTY2K.txt、その Partial Economic Area の郡リスト、および 47 CFR 80.385(a)(3) に基づき、各市場が対象とする州のみを記録しています。Basic Trading Areas は、Rand McNally 1992 Commercial Atlas & Marketing Guide 第123版の38~39ページで区分され、その後、連邦通信委員会により拡張および改訂されました(59 FR 46195、1994年9月7日)。Major Trading Areas は、Rand McNally 1992 Commercial Atlas & Marketing Guide 第123版の38~39ページで区分され、その後、連邦通信委員会により拡張および一部除外されました(59 FR 14115、1994年3月25日)。このサーバーは FCC から独立しており、FCC の推奨を受けていません。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。