SAT69 — Listas del SAT (69 y 69-B del CFF)

io.github.edbrorv1.0.0更新於 Oct 7, 2026

Verifica RFCs contra las listas del SAT (69/69-B CFF, EFOS): veredicto de riesgo fiscal.

已驗證Streamable HTTP可網頁執行FinanceBusiness & CommerceData & Analytics

概覽

AI 產生的概覽

將墨西哥 RFC 稅籍編號與 SAT 公開的 69 及 69-B(EFOS)名單比對,回傳稅務風險判定。

功能
此伺服器查詢 SAT 公開名單:69-B 條(EFOS,模擬交易)、69-B Bis 條(不當轉讓虧損扣抵權)以及 69 條(已確定、可強制執行、無法聯繫、已註銷或已豁免的納稅人)。工具包括 verificar_rfc(單一 RFC 風險判定)、verificar_lote(最多 500 個 RFC,僅依嚴重程度回傳命中項目)、buscar_nombre(不區分重音的名稱搜尋)、estado_datos(資料時效與筆數)、actualizar_datos(下載並同步名單)以及 resumen_cartera(自然語言執行摘要)。嚴重程度優先順序為 69-B 高於 69-B Bis 高於 69。
適用情境
適合在開立發票或簽約前,讓助理篩查供應商、客戶或一批 RFC 的墨西哥稅務風險。也適用於最多 500 個 RFC 的批次查核,以及依名稱查詢被列入名單的納稅人。
執行需求
可作為遠端端點 使用,也可在本地以 Python(FastMCP)執行,首次匯入需下載約 22 MB 的 SAT CSV 檔案。部署說明提到 MCP_API_KEY 用於 bearer 驗證,可選的 AUTHKIT_DOMAIN 與 BASE_URL 用於 OAuth,以及可選的 TURSO_DATABASE_URL 與 TURSO_AUTH_TOKEN 用於持久儲存。下載資料需要網路存取。
安裝前請注意
結果反映 SAT 公開檔案最近一次匯入,不構成稅務或法律建議。資料重新整理會破壞性地取代本地資料集,但設有新鮮度保護,在檔案為空、筆數縮減或日期較舊時中止。resumen_cartera 是唯一使用 AI 的工具,且只負責撰寫文字;風險判定由確定性規則引擎產生。可選的 LLM 供應商透過 LLM_PROVIDER 設定,可選的下載代理使用 FETCH_PROXY 或 DATAIMPULSE_* 變數。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 SAT69 — Listas del SAT (69 y 69-B del CFF),將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。

其他 MCP 客戶端

把它新增到你客戶端的 mcpServers 設定中。

{
  "mcpServers": {
    "sat69-mcp": {
      "type": "http",
      "url": "https://sat69.watr.mx/connect"
    }
  }
}

README

MCP SAT 69 / 69-B · WATR

Servidor MCP (Model Context Protocol) en Python / FastMCP para consultar las listas públicas del SAT:

  • Artículo 69-B del CFF (EFOS) — operaciones simuladas: Presunto, Desvirtuado, Definitivo, Sentencia Favorable.
  • Artículo 69-B Bis del CFF — transmisión indebida del derecho a disminuir pérdidas fiscales: Definitivo, Sentencia Favorable. Es señal de riesgo del contribuyente, pero no invalida sus CFDI por sí sola. Lista diminuta: 3 registros en todo el país (sep-2026), así que un conteo de un dígito es correcto, no una importación fallida.
  • Artículo 69 del CFF — situación fiscal firme: firmes, exigibles, no localizados, cancelados, condonados.

Misma arquitectura que el MCP de movilizaciones de la SSC-CDMX: FastMCP con transporte stdio + Streamable HTTP, OAuth 2.1 (WorkOS AuthKit) con fallback a bearer estático, persistencia en Turso (libSQL), proxy de descarga opcional, y despliegue en Render con cron externo (GitHub Actions). Sin OCR: los CSV del SAT ya vienen estructurados.

Tools

ToolQué hace
verificar_rfcVerifica un RFC → veredicto de riesgo (CRITICO…LIMPIO).
verificar_loteValida hasta 500 RFCs; devuelve sólo hallazgos por severidad.
buscar_nombreBúsqueda por nombre/razón social (FTS5, insensible a acentos).
estado_datosVigencia declarada por el SAT, conteos y última importación.
actualizar_datosDescarga + sincroniza los listados (idempotente por hash, con guard de frescura).
resumen_carteraBrief ejecutivo en lenguaje natural de una cartera (hasta 500 RFCs).

Prioridad de severidad entre listas: 69-B > 69-B Bis > 69.

⚠️ resumen_cartera es el único tool con IA, y sólo redacta. El riesgo de cada RFC lo calcula el motor de reglas (determinista); el modelo recibe esos veredictos ya resueltos y escribe el brief — nunca decide un riesgo ni cambia uno. Proveedor conmutable con LLM_PROVIDER (qwen por default vía DashScope; también anthropic y gemini). Sin IA configurada el tool igual responde: devuelve los datos deterministas con resumen: null.

Riesgo: CRITICO (EFOS definitivo) · ALTO (EFOS presunto) · MEDIO (69 firme/exigible/no localizado) · BAJO (desvirtuado/sentencia favorable) · INFORMATIVO (69 cancelado/condonado) · LIMPIO.

Los resultados reflejan la última importación de los archivos públicos del SAT. No constituyen asesoría fiscal ni legal.

Arquitectura

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) + tools + AuthKit.
  • web.py — Starlette/uvicorn (HTTP): /health (abierto), /refresh y /reload (bearer M2M), /mcp (OAuth o bearer).
  • pipeline.py — descarga → SHA-256 (omite si no cambió) → parse Latin-1 → guard de frescura → reemplazo en SQLite → push a Turso. El guard aborta el reemplazo si el archivo nuevo trae 0 filas habiendo datos, pierde más del 10% de las filas previas, o declara una fecha del SAT anterior a la ya importada: el reemplazo es destructivo y la fuente es de un tercero. El piso es relativo, no un mínimo absoluto, porque conviven listas de 243k filas y de 3.
  • database.py — SQLite + FTS5 con triggers; RFC por índice B-tree (camino caliente).
  • turso.py — sync durable Turso ↔ local.
  • risk.py — normalización de RFC + árbol de veredicto (69-B manda sobre 69).

Instalación local

bash
cd sat69-mcppython -m venv .venv && source .venv/bin/activatepip 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())"
# Probarpytest -q

Conectar en Claude Desktop / Cowork (stdio)

json
{  "mcpServers": {    "sat69": { "command": "sat69-mcp" }  }}

(o "command": "python", "args": ["-m", "sat69"] con el venv activo.)

Despliegue en Render

render.yaml provisiona el servicio web con runtime Python nativo (sin Docker):

  1. Sube el repo a GitHub y crea un Blueprint en Render apuntando a render.yaml.
  2. Variables (marcadas sync:false): MCP_API_KEY (bearer), opcional AUTHKIT_DOMAIN+BASE_URL (OAuth), TURSO_DATABASE_URL+TURSO_AUTH_TOKEN.
  3. Endpoint MCP: POST https://<servicio>.onrender.com/mcp.

Auth (dos modos, igual que movilizaciones)

  • Bearer estático (MCP_API_KEY): simple, protege /mcp, /refresh, /reload.
  • OAuth 2.1 (WorkOS AuthKit): define AUTHKIT_DOMAIN + BASE_URL y /mcp pasa a OAuth con Dynamic Client Registration; el bearer sigue protegiendo los endpoints M2M.

Refresco automático

.github/workflows/refresh.yml hace POST /refresh diario (11:30 UTC ≈ 05:30 CDMX). Secrets del repo: RENDER_BASE_URL, MCP_API_KEY. Manual: workflow_dispatch (con force).

Persistencia (Turso)

SQLite local (efímero en Render, /tmp) atiende las consultas; Turso es el almacén durable que sobrevive redeploys. Al arrancar se hace pull de Turso; tras cada actualizar_datos//refresh se hace push. Sin TURSO_*, corre en modo local puro.

Proxy de descarga (opcional)

FETCH_PROXY o DATAIMPULSE_* enrutan sólo la descarga de los CSV. En pruebas el SAT no bloqueó IPs de datacenter (descargas 200 directas), así que normalmente no hace falta; se conserva por paridad y resiliencia.

Fuentes de datos (SAT · Datos Abiertos)

  • 69-B: Listado_Completo_69-B.csv (~14 k registros, 20 columnas, header en línea 3).
  • 69: Firmes.csv, Cancelados.csv, NoLocalizados.csv, Exigibles.csv, Sentencias.csv, Condonados.csv (~½ millón de registros, 6 columnas). URLs en config.py.

來源:README.md,提交 97601ba

工具

0
工具後設資料尚未被收錄。

版本歷史

1
  1. v1.0.0最新Sep 16, 2026