关于 SAT69 — Listas negras del SAT (69, 69-B, 69-B Bis y CSD)
用于根据墨西哥 SAT 公开税务风险名单核验 RFC 的 MCP 服务,提供确定性风险判定、批量核验和名称搜索,并可选生成自然语言组合摘要。
主要功能
- 01跨 SAT 名单判定 RFC 风险
- 02最多核验 500 个 RFC
- 03支持重音不敏感的名称搜索
- 04查看名单状态和导入数量
- 05带新鲜度检查的数据更新
- 06可选 AI 生成组合摘要
适用场景
- 01供应商入驻前筛查 RFC
- 02审查最多 500 个 RFC 的组合
- 03按个人或公司名称搜索 SAT 记录
MCP 相关
向 MCP 客户端提供 RFC 核验、批量核验、名称搜索、数据状态、更新和组合摘要工具。支持 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
用于查询 SAT 公开名单的 Python / FastMCP MCP(Model Context Protocol) 服务:
- CFF 第 69-B 条(EFOS) — 模拟交易:推定、已驳回、最终认定、判决有利。
- CFF 第 69-B Bis 条 — 不当转让减少税务亏损的权利:最终认定、判决有利。这是纳税人的风险信号,但其本身不会使纳税人的 CFDI 无效。名单很小:全国共有 3 条记录(2026 年 9 月),因此个位数的计数是正常的,并非导入失败。
- CFF 第 69 条 — 税务状况已确定:已确定、可强制执行、无法定位、已取消、已免除。
架构与 SSC-CDMX 调动 MCP 相同:FastMCP,采用 stdio + Streamable HTTP 传输,使用 OAuth 2.1(WorkOS AuthKit),并回退到静态 bearer,持久化至 Turso(libSQL),可选用下载代理,并在 Render 上通过外部 cron(GitHub Actions)部署。无需 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(M2M bearer),/mcp(OAuth 或 bearer)。pipeline.py— 下载 → SHA-256(未变化则跳过)→ Latin-1 解析 → 新鲜度保护 → 替换 SQLite 中的数据 → 推送至 Turso。 如果新文件在已有数据时包含 0 行、行数比之前减少超过 10%,或声明的 SAT 日期早于已导入日期,新鲜度保护就会中止替换:替换操作具有破坏性,且数据源来自第三方。下限按比例计算,而非绝对最小值,因为名单规模从 243k 行到 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" }
}
}
(也可以在虚拟环境已激活时使用 "command": "python", "args": ["-m", "sat69"]。)
在 Render 上部署
render.yaml 使用原生 Python 运行时配置 Web 服务(无需 Docker):
- 将仓库推送到 GitHub,并在 Render 中创建一个指向
render.yaml的 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。
身份验证(两种模式,与 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(11:30 UTC ≈ 05:30 CDMX)。仓库 Secrets: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 · Datos Abiertos)
- 69-B:
Listado_Completo_69-B.csv(约 14 k 条记录,20 列,第 3 行为表头)。 - 69:
Firmes.csv、Cancelados.csv、NoLocalizados.csv、Exigibles.csv、Sentencias.csv、Condonados.csv(约 ½ 百万条记录,6 列)。URL 位于config.py中。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。