Fac について
Fac は、米国の単一監査申告データを提供する、監査担当者や連邦助成金の監督向け MCP サーバーです。週次更新のデータコピーを使い、監査、プログラム支出、監査所見、複数テーブルを検索できます。
主な機能
- 01監査申告の検索
- 02監査と連邦プログラム支出の確認
- 03監査所見の取得と検索
- 04州・プログラム・所見タイプを横断した絞り込み
- 05助成先の監査履歴の確認
活用シーン
- 01連邦資金を受ける組織の監査記録を確認
- 02連邦プログラム別の支出を集計
- 03特定の監査所見を探して問題を絞り込む
MCP 対応
監査検索、詳細、所見、複数テーブル横断検索のツールを MCP クライアントに提供します。データは FAC の公開データコピーを基に週次更新されます。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://gateway.pipeworx.io/fac/mcpclaude mcp add --transport http pipeworx-io-fac https://gateway.pipeworx.io/fac/mcp{"mcpServers":{"pipeworx-io-fac":{"type":"http","url":"https://gateway.pipeworx.io/fac/mcp"}}}Cursor で開く{"servers":{"pipeworx-io-fac":{"type":"http","url":"https://gateway.pipeworx.io/fac/mcp"}}}VS Code で開く{"mcpServers":{"pipeworx-io-fac":{"type":"http","url":"https://gateway.pipeworx.io/fac/mcp"}}}{"mcpServers":{"pipeworx-io-fac":{"serverUrl":"https://gateway.pipeworx.io/fac/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
詳細
@pipeworx/fac
Federal Audit Clearinghouse MCP — US の単一監査提出データ(Uniform Guidance、旧 OMB A-133):誰が連邦助成金を使い、どの Assistance Listing プログラムのもとで、監査人が何を発見したのかを確認できます。FAC 独自の一括データを毎週更新したコピー(fleet #2504)を使用しており、API キーは不要です。
Pipeworx の一部です。AI エージェントを1879以上の稼働中のデータソースに接続する MCP ゲートウェイです。これは独立した非公式の統合であり、上流のプロバイダーとは提携、承認、公開のいずれもしていません。
ツール
fac_search_audits(auditee_name|uei|ein|state|zip|audit_year|min_total_expended, ...)— 監査を検索します。report_id、組織の識別情報(登録されている ZIP を含む)、支出した連邦助成金の総額、監督機関、FAC の受理日を返します。fac_get_audit(report_id, ...)— 1件の監査と、その監査の連邦助成金支出明細書(Schedule of Expenditures of Federal Awards)にあるすべての連邦プログラム行(Assistance Listing 番号、プログラム名、支出額、主要プログラムかどうか、意見の種類)、監査法人、FAC に記録されている場合は所見を返します。fac_audit_findings(report_id | auditee_name | uei, ...)— 監査に記録された所見、または受領者が提出したすべての監査を横断して集計した所見を返します。重要な不備、重大な欠陥、疑義のある経費、再発所見、修正意見の重大度概要も含まれます。include_textを指定すると、所見の説明文が含まれます。fac_federal_awards_by_program(cfda | federal_agency_prefix + federal_award_extension, ...)— CFDA 番号(例:93.224)のもとで支出した組織を、支出額の多い順に並べ、受領者名、州、年と結合して返します。fac_recipient_audit_history(uei | auditee_name | ein, ...)— 1つの受領者について、年ごとの監査、各年の支出総額、傾向の変化率を返します。fac_findings_search(query, ...)— 新規。 所見の説明文を全文検索します(「規定された期間内に提出できなかった…」、「疑義のある経費」など)。テーブル間の結合ができないため、稼働中の FAC API ではまったく実現できません。GIN インデックス付き tsvector 列に対する Postgres のwebsearch_to_tsqueryRPC(fac_findings_search)を使用します。fac_cross_table_screen(state | cfda | finding_type | material_weakness_only | min_amount | audit_year, ...)— 州、CFDA プログラム、所見の種類を1回の呼び出しで横断して監査を絞り込みます(「CFDA 93.224 に基づくテキサス州の重要な不備」など)。fac_general+fac_federal_awards+fac_findingsを結合する3方向の SQL 結合 RPC(fac_cross_table_screen)を使用します。
全体を通して柔軟な別名に対応しています。auditee_name には query / q / name、ZIP には zip / auditee_zip / zipcode / zip_code / postal_code が使えます。cfda / program_number / assistance_listing / program はすべて、"93.224"、"93-224"、"93224"、またはその機関のすべてのプログラムを指定する単独の "93" を受け付けます。
このパックが認識しない引数は、破棄せず報告します。 未知のキーはすべて ignored_arguments に返され、フィルターが適用されなかったことと、ツールが受け付ける引数を列挙した warnings の行も追加されます。呼び出し元が指定した最も具体的な条件を黙って捨てると、応答が回答のように見えてしまうため、エラーにするよりも問題です。
すべての応答には data_as_of が含まれます。 これは最後に成功した更新のタイムスタンプ(fac_ingest_runs から取得)です。初回の更新が完了する前は null となり、「監査が存在しない」かのような空の結果を黙って返すのではなく、その旨を示す coverage_status の注記が追加されます。
このデータを事前に読み込む理由(fleet #2504)
このパックは以前、リクエストのたびに api.fac.gov(api.data.gov の傘下にある PostgREST API)をリアルタイムで呼び出していました。2026-09-29 までの60日間を測定したところ、外部呼び出し約1,620件のうち572件(35%、平均レイテンシ3.9秒)で fac_search_audits が upstream_down になっていました。これはカタログ内で最大の ask_pipeworx 不一致クラスターであり、質問の形は約25種類に及びます(名前+州+ZIPのバリエーション、report_id の検索、「X に関する指摘がある監査」など)。さらに、api.fac.gov 自身の PostgREST では、/general と /findings の間に外部キーが公開されていません(埋め込みを試みると常に PGRST200 が発生します)。そのため、「テキサス州で CFDA 93.224 に該当する重要な不備」のようなテーブル横断の質問は、単に遅いのではなく、ライブ API では構造上実行不可能でした。
Bruce の2026-09-23の判断(「ライブでは対応できない、または遅すぎる場合はコピーを作成する」)に従い、このパックは現在、定期的に更新される独自のテーブルを読み込みます。scripts/fac-upsert.sh によって毎週更新され、.github/workflows/fac-refresh.yml によってスケジュールされています。スキーマと RPC:supabase/migrations/220_fac_local_mirror.sql。
読み込み対象のテーブル: general、federal_awards、findings、findings_text、corrective_action_plans(それぞれ fac_general、fac_federal_awards、fac_findings、fac_findings_text、fac_corrective_action_plans として読み込みます)。まだ読み込んでいないテーブル(#2504の対象範囲外であり、今後の拡張項目であって、見落としではありません):notes_to_sefa(725MB)、passthrough(559MB)、および小規模な additional_ueis/additional_eins/secondary_auditors テーブル。
個人データなし
FAC の general.csv 抽出データには、個人名を含む連絡先フィールドがあります。監査対象者/監査人のCERTIFY name+title、CONTACT name+title、email、phoneです。これらは一切読み込まれません。組織の識別情報(auditee_name、auditor_firm_name、住所、EIN)は保持します。これは必須の連邦コンプライアンス開示を提出する事業体を特定するものであり、個人情報ではなく、samgov および fed-nic パックがすでに保持しているものと同じ種類のデータです。以前の fac_get_audit は、ライブ API のプロキシ時に監査対象者の連絡先名/メールアドレス/電話番号も返していました(GENERAL_CONTACT_SELECT)。この機能は意図的に廃止されており、低品質化したのではありません。fac_get_audit のすべての応答には、fac.gov にあるレポートの summary_url を示す personal_data_note が含まれます。列ごとの詳しい理由については、マイグレーションと scripts/fac-normalize.py のヘッダーを参照してください。
更新経路
node scripts/fac-upsert.sh # local dry run (needs the database connection secret in env — see the script header)
本番環境では、CF ゲートウェイ Worker ではなく、GitHub Actions ランナー(.github/workflows/fac-refresh.yml、毎週実行、workflow_dispatch で手動実行可能)上で実行します。federal_awards だけでも非圧縮で約1.34GBあり、Worker の実行予算を大幅に超えます。また、Worker のストリーミングパーサーでは不可能な一括読み込みを psql \copy なら一度で実行できます(samgov および openfema パックと同じ理由です)。ローダーは次の処理を行います。
- すべての
*_fac_*.sqlマイグレーションを適用します(冪等性があるため、「一度だけ手動で適用する」手順を忘れる心配はありません)。 - 各テーブルの CSV を
https://app.fac.gov/dissemination/public-data/gsa/full/{table}.csvからダウンロードします(約30秒で期限切れになる署名付き S3 URL への302リダイレクトに従います。Location ヘッダーを解決して再利用しないでください。マイグレーション135の samgov テーブルと同じ落とし穴です)。 scripts/fac-normalize.pyで正規化します。行ごとにストリーミング処理し(ファイル全体をメモリにバッファリングしません)、個人データ列を削除し、2022年以前に Census が運用していた FAC から移行されたレコードの所見テキスト/是正措置計画テキストにプレースホルダーとして使われている FAC 固有のリテラル"GSA_MIGRATION"を NULL にします(2026-09-29にライブデータで確認済み。2016年当時の report_id のうち数千件で、このリテラル文字列が内容であるかのように記録されています)。psql \copyを使ってステージングテーブルに読み込んだ後、バッチ単位でライブテーブルに upsert します(単一の巨大なトランザクションは使用しません)。- 実行結果(ステータス、行数、
finished_at)をfac_ingest_runsに記録します。data_as_ofはここから値を取得します。
データソース
https://www.fac.gov/data/download/current/— 一括抽出データの人間が読めるインデックスです。https://app.fac.gov/dissemination/public-data/gsa/full/{general,federal_awards,findings,findings_text,corrective_action_plans}.csv— 実際のダウンロード先です(302 → 署名付き S3、認証情報不要)。2026-09-29 に確認したサイズ:general 271MB、federal_awards 1.34GB、findings 68MB、findings_text 258MB、corrective_action_plans 110MB。- API ドキュメント(このデータの元となるライブ上流データの形式):https://www.fac.gov/developers/ · Assistance Listing の検索:https://sam.gov/content/assistance-listings
- 2 CFR 200 Subpart F に基づいて収集された米国連邦政府の単一監査データです。パブリックドメインです。
名称と ZIP の照合
ZIP は 2 つの形式で保存されているため、先頭部分で照合する必要があります。 auditee_zip には、一部の行では 5 桁(75082)、それ以外の行では区切り文字なしの 9 桁の ZIP+4(009601588、750814198)が格納されているため、eq. ではテーブルの大半に一致しません。プエルトリコの利用者が 00960 を渡した場合、まったく一致しなくなります。このパックでは 5 桁のプレフィックス(auditee_zip=like.00960*)で絞り込みます。これは両方の形式に共通する唯一の部分であり、ZIP+4 の入力は切り詰めて処理します。
監査対象の ZIP は、申請年度によって変わります。 CITY OF RICHARDSON TX は、同じ UEI で、2018~2021 年は 75080、2022 年は 75083、2025 年は 75082 として申請されています。そのため、現在の ZIP では過去の監査に正しく一致しない場合があります。zip フィルターによって、それ以外は一致する結果が空になった場合、このパックはそのフィルターを外して再照会し、単に一致なしと返して呼び出し側が原因を特定できない状態にするのではなく、FAC がその事業体について実際に保持している ZIP を示す reason: 'zip_no_match' を返します。
プエルトリコの自治体は 2 つの言語で申請されており、どちらが使われるかは提出年によって異なります。 FAC には MUNICIPALITY OF BAYAMON や MUNICIPALITY OF SAN JUAN だけでなく、MUNICIPIO DE MANATI、MUNICIPIO DE CAMUY、MUNICIPIO DE NARANJITO もあります。また、Corozal は同じ事業体で、2019 年は MUNICIPIO DE COROZAL、2017~2024 年は MUNICIPALITY OF COROZAL として登録されています。プエルトリコ政府の情報を参照する呼び出し側が持つのはスペイン語の正式名称であり、英語の行には一致する部分文字列がありません。一方、英語に一方向で書き換えると、スペイン語の行を見落としてしまいます。このパックは、どちらの言語の自治体名(MUNICIPIO DE X、MUNICIPIO AUTONOMO DE X、MUNICIPALIDAD DE X、(AUTONOMOUS) MUNICIPALITY OF X)も検出し、地名を取り出して、PostgREST の 1 つの or=(...) で両方の表記を照会し、実行した照合内容を name_match に記録します。
地名のスペイン語アクセント記号は、表記に一貫性がありません。 FAC には MUNICIPALITY OF AÑASCO(および 1 行では文字化けした MUNICIPALITY OF A?ASCO)と、アクセント記号のない MUNICIPIO DE ANASCO の両方があります。そのため、どちらか一方の表記だけではすべてに一致しません。ASCII の ANASCO では監査 1 件、アクセント記号付きの AÑASCO では 4 件が返されますが、この事業体には 5 件あります。そのため、各地名パターンはアクセント記号を無視した形でも照会され、スペイン語のアクセント記号が付く文字は LIKE の任意の 1 文字に一致するワイルドカードに置き換えられます(Municipality of ___SC_)。残る子音と固定された文字数によって、照合対象は十分に絞られます。
この処理を空の結果に対する再試行ではなく、主クエリに組み込んでいる点が重要です。再試行は、文字どおりの表記で何も見つからなかった場合にしか実行されません。しかし実際の問題は、一部の結果が見つかり、完全な結果に見える形で返されてしまうことです。or=(...) は単一の SQL 条件なので、追加の分岐は行を重複させずに統合され、2 回目のリクエストも必要ありません。
その他の注意点
federal_agency_prefix と federal_award_extension は別々に保存されており、連結した場合にのみ意味を持ちます。prefix 93 + extension 224 は Assistance Listing 93.224 となるため、ドット付きの番号を渡すと自動的に分割され、すべての応答で assistance_listing が返されます。extension は3文字になるようゼロ埋めして保存されます(47.076 であり、47.76 ではありません)。そのため、数値の extension は送信前にゼロ埋めされます。ゼロ埋めされていない値は、エラーにはならず、何にも一致しません。fac_federal_awards には被監査組織の列がありません。受領者名、州、監査年は fac_general にあるため、fac_federal_awards_by_program は report_id で両者を結合します。state または audit_year のフィルターが設定されている場合は、金額の大きい上位行を多めに取得してから結合後にフィルターを適用し、より深いスキャンが必要かどうか判断できるよう rows_scanned を報告します。所見がゼロであることも回答であり、データの欠落ではありません。問題のない単一監査では、fac_findings に行がないのが正当な状態です。この場合、確認済みの監査とともに found: false, reason: 'no_findings' が返され、reason: 'findings_table_unavailable' とは区別されます。連邦政府からの年間支出が約75万ドルのしきい値を下回る事業体はそもそも申告しないため、組織が見つからない場合は、通常はデータ欠落ではなくしきい値未満です。古い監査では、所見や是正措置に関する説明文がないことがよくあります。fac_findings_search と fac_audit_findings の include_text: true はどちらも、ファイル上にテキストがない行を単に省略します(GSA_MIGRATION のセンチネル値を NULL にした後)。実際の(簡潔な)回答であるかのように空文字列を表示することはありません。
クイックスタート
MCP クライアント(Claude Desktop、Cursor、Windsurf など)に追加します:
{
"mcpServers": {
"fac": {
"url": "https://gateway.pipeworx.io/fac/mcp"
}
}
}
このエンドポイントが実際に提供するもの
https://gateway.pipeworx.io/fac/mcp の tools/list は、上の表にあるツールに加えて、共有 Pipeworx メタツール(ask_pipeworx、discover_tools、search_within、remember/recall など、ゲートウェイ全体で利用できるその他のツール)も返します。そのため、表示されるツール数はこの表より多くなります。現在、単一パックのエンドポイントには、そのパック独自のツールとともに、共有ツールが約30個表示されます。接続の initialize 応答に正確な対象範囲が記載されており、その日の時点での確定情報となります。
これは意図的な仕様であり、偶然に多重化されているわけではありません。メタツールを使うと、このパックの対象外の質問にも対応できます。ask_pipeworx がカタログ全体にルーティングするため、MCP サーバーを追加する必要はありません。現在、メタツールなしでパックのエンドポイントをマウントする方法はありません。追加のスキーマによるコンテキスト消費がルーティングの利点を上回る場合は、複数のパックエンドポイントではなく、フルゲートウェイに一度接続してください。
または、Pipeworx のフルゲートウェイに接続すると、このパックだけでなく、すべてのパックのツールが直接一覧表示されます:
{
"mcpServers": {
"pipeworx": {
"url": "https://gateway.pipeworx.io/mcp"
}
}
}
どちらの URL も、同じゲートウェイと同じ1879以上のデータソースに接続します。違いは、どのパックのツールが直接一覧表示されるかだけです。どちらからでも、ask_pipeworx を通じてすべてのツールにアクセスできます。
MCP クライアントがない場合:HTTP で呼び出す
curl -X POST https://gateway.pipeworx.io/v1/tools/fac_search_audits \
-H 'Content-Type: application/json' \
-d '{"auditee_name":"stanford","limit":10}'
最初の呼び出しにアカウントは不要です。任意のツールを確認するには、GET https://gateway.pipeworx.io/v1/tools/fac_search_audits を実行します。ツールを探すには、{"query":"..."} を指定して POST https://gateway.pipeworx.io/v1/tools/search_packs を実行します。
スタンドアロン(ゲートウェイアカウント不要)
このパッケージは、ローカルの stdio MCP サーバーとしても実行できます。Pipeworx アカウントも、ゲートウェイへの往復通信も不要です:
{
"mcpServers": {
"fac": {
"command": "npx",
"args": ["-y", "@pipeworx/mcp-fac"]
}
}
}
または、直接実行して起動することを確認します:
npx -y @pipeworx/mcp-fac
stdin/stdout 経由で MCP を使用し、initialize/tools/list/tools/call に対してこのパックのツールのみを返します。上記のゲートウェイ接続で追加される共有メタツールは含まれません。同じソース、同じツールであり、ask_pipeworx によるルーティングはありません。
ask_pipeworx の使用
ツールを直接呼び出す代わりに、平易な英語で質問できます。この機能は、上記のパックエンドポイントでもフルゲートウェイでも使えます:
ask_pipeworx({ question: "your question about Fac data" })
ゲートウェイが適切なツールを選び、引数を自動的に設定します。
More
License
MIT
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。