SAT69 — Listas negras del SAT (69, 69-B, 69-B Bis y CSD) について
メキシコ SAT の公開税務リスク名簿で RFC を照合する MCP サーバーです。決定論的なリスク判定、バッチ照合、名称検索を備え、任意で自然言語のポートフォリオ要約も作成します。
主な機能
- 01SAT 名簿に基づく RFC リスク判定
- 02最大 500 件の一括照合
- 03アクセントを区別しない名称検索
- 04名簿の状態と取込件数の確認
- 05鮮度チェック付きデータ更新
- 06任意の AI ポートフォリオ要約
活用シーン
- 01取引先登録前の RFC 確認
- 02最大 500 件の RFC ポートフォリオ審査
- 03個人名や会社名による SAT 記録検索
MCP 対応
RFC 照合、一括照合、名称検索、データ状態確認、更新、ポートフォリオ要約のツールを MCP クライアントに公開します。stdio と Streamable HTTP に対応し、OAuth 2.1 または bearer 認証を利用できます。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://sat69.watr.mx/connectclaude mcp add --transport http edbror-sat69 https://sat69.watr.mx/connect{"mcpServers":{"edbror-sat69":{"type":"http","url":"https://sat69.watr.mx/connect"}}}Cursor で開く{"servers":{"edbror-sat69":{"type":"http","url":"https://sat69.watr.mx/connect"}}}VS Code で開く{"mcpServers":{"edbror-sat69":{"type":"http","url":"https://sat69.watr.mx/connect"}}}{"mcpServers":{"edbror-sat69":{"serverUrl":"https://sat69.watr.mx/connect"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
詳細
MCP SAT 69 / 69-B · WATR
Python / FastMCP 製の MCP(Model Context Protocol)サーバーです。SAT の公開リストを照会します。
- CFF 第69-B条(EFOS) — 架空取引:Presunto(推定), Desvirtuado(反証済み), Definitivo(確定), Sentencia Favorable(有利な判決)。
- CFF 第69-B Bis条 — 税務上の損失を控除する権利の不正な譲渡:Definitivo(確定), Sentencia Favorable(有利な判決)。納税者のリスクを示す情報ですが、それだけでCFDI が無効になるわけではありません。リストは非常に小さく、全国で3件(2026年9月)です。そのため、一桁の件数は正常であり、インポートの失敗ではありません。
- CFF 第69条 — 確定した税務状況:確定、執行可能、所在不明、取消済み、免除済み。
SSC-CDMX の動員情報 MCP と同じアーキテクチャです。FastMCP による stdio + Streamable HTTP トランスポート、OAuth 2.1(WorkOS AuthKit) と 静的 bearer へのフォールバック、Turso(libSQL) への永続化、任意のダウンロードプロキシ、外部 cron(GitHub Actions)を使った Render へのデプロイを備えています。OCR は不要です。SAT の CSV はすでに構造化されています。
ツール
| ツール | 機能 |
|---|---|
verificar_rfc | RFC を確認し、リスク判定(CRITICO…LIMPIO、いずれかのリストにデータがない場合は NO_VERIFICADO)を返します。 |
verificar_lote | 最大500件の RFC を検証し、重要度別の該当項目のみを返します。 |
buscar_nombre | 名前/法人名で検索します(FTS5、アクセント記号を区別しません)。 |
estado_datos | SAT が公表した有効期間、件数、最終インポート日時を返します。 |
actualizar_datos | リストをダウンロードして同期します(ハッシュによる冪等処理、新鮮性ガード付き)。 |
resumen_cartera | ポートフォリオの自然言語によるエグゼクティブブリーフを作成します(最大500件の RFC)。 |
リスト間の重要度の優先順位: 69-B > 69-B Bis > 69。
⚠️ resumen_cartera は AI を使う唯一のツールで、文章の作成だけを行います。 各 RFC のリスクはルールエンジンが決定論的に計算します。モデルは、すでに確定した判定を受け取ってブリーフを作成するだけで、リスクの決定や変更は行いません。LLM_PROVIDER でプロバイダーを切り替えられます(デフォルトは DashScope 経由の qwen。anthropic と gemini も利用できます)。AI を設定していなくても、ツールは応答します。決定論的なデータを resumen: null とともに返します。
リスク: CRITICO(EFOS 確定) · ALTO(EFOS 推定) · MEDIO(69 確定/執行可能/所在不明) · BAJO(反証済み/有利な判決) · INFORMATIVO(69 取消済み/免除済み) · LIMPIO。
結果は、SAT の公開ファイルを最後にインポートした時点の情報を反映しています。税務または法務に関する助言ではありません。
アーキテクチャ
CSV del SAT (Latin-1) ┌────────── FastMCP ──────────┐
│ fetcher (httpx + proxy opcional) │ verificar_rfc / _lote │
▼ │ buscar_nombre / estado_datos │
pipeline (parse 69 / 69b) ──► SQLite ──┤ actualizar_datos │
│ (FTS5 unicode61, triggers) ▲ │ └──────────┬──────────────────┘
▼ │ │ stdio (server.py) + HTTP (web.py)
Turso (libSQL, durable) ◄── push │ └► pull al arranque │
└─────────────────── /health /refresh /reload
server.py— FastMCP(stdio)+ ツール + AuthKit。web.py— Starlette/uvicorn(HTTP):/health(公開)、/refreshと/reload(bearer M2M)、/mcp(OAuth または bearer)。pipeline.py— ダウンロード → SHA-256(変更がなければスキップ)→ Latin-1 で解析 → 新鮮性ガード → SQLite で置換 → Turso にプッシュ。 新しいファイルの行数が、既存データがあるのに0行の場合、以前の行数から10%を超えて減少した場合、または SAT の公表日がすでにインポート済みの日付より古い場合、新鮮性ガードが置換を中止します。置換は破壊的な処理であり、データソースは第三者が提供するものだからです。リストには24万3000行のものもあれば3行のものもあるため、下限は絶対値ではなく相対値です。database.py— トリガー付きの SQLite + FTS5。RFC は B-tree インデックスで検索します(ホットパス)。turso.py— Turso ↔ ローカル間の永続同期。risk.py— RFC の正規化 + 判定ツリー(69-B は69より優先)。
ローカルへのインストール
cd sat69-mcp
python -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
# Primera ingesta (descarga ~22 MB; el 69 son ~½ millón de filas)
python -c "from sat69 import database as db, config; db.init_db(config.settings.db_path)"
python -c "from sat69.pipeline import process_import; print(process_import())"
# Probar
pytest -q
Claude Desktop / Cowork に接続する(stdio)
{
"mcpServers": {
"sat69": { "command": "sat69-mcp" }
}
}
(または、venv が有効な状態で "command": "python", "args": ["-m", "sat69"] を使用します。)
Render へのデプロイ
render.yaml は、ネイティブ Python ランタイム(Docker なし)でウェブサービスをプロビジョニングします。
- リポジトリを GitHub にプッシュし、
render.yamlを指定して Render で Blueprint を作成します。 - 変数(
sync:falseとして設定):MCP_API_KEY(Bearer)、任意のAUTHKIT_DOMAIN+BASE_URL(OAuth)、TURSO_DATABASE_URL+TURSO_AUTH_TOKEN。 - MCP エンドポイント:
POST https://<servicio>.onrender.com/mcp。
認証(2 つのモード。movilizaciones と同様)
- 静的 Bearer(
MCP_API_KEY):シンプルな方式で、/mcp、/refresh、/reloadを保護します。 - OAuth 2.1(WorkOS AuthKit):
AUTHKIT_DOMAIN+BASE_URLを設定すると、/mcpは Dynamic Client Registration を使用する OAuth に切り替わります。Bearer は引き続き M2M エンドポイントを保護します。
自動更新
.github/workflows/refresh.yml が毎日 POST /refresh を実行します(UTC 11:30 ≈ CDMX 05:30)。リポジトリのシークレット:RENDER_BASE_URL、MCP_API_KEY。手動実行:workflow_dispatch(force 付き)。
永続化(Turso)
ローカルの SQLite(Render 上では一時的で、/tmp に配置)がクエリを処理し、Turso が再デプロイ後も保持される永続ストアとなります。起動時に Turso からプルし、actualizar_datos//refresh の実行後にプッシュします。TURSO_* がない場合は、完全なローカルモードで動作します。
ダウンロードプロキシ(任意)
FETCH_PROXY または DATAIMPULSE_* は、CSV のダウンロードのみを経由させます。テストでは SAT はデータセンターの IP をブロックしませんでした(直接ダウンロードで 200 が返りました)。そのため通常は不要ですが、互換性と回復力のために残しています。
データソース(SAT · オープンデータ)
- 69-B:
Listado_Completo_69-B.csv(約 1.4 万件、20 列、ヘッダーは 3 行目)。 - 69:
Firmes.csv、Cancelados.csv、NoLocalizados.csv、Exigibles.csv、Sentencias.csv、Condonados.csv(約 50 万件、6 列)。URL はconfig.pyにあります。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。