SAF-T税务文件分析服务器

一个用于解析和分析葡萄牙SAF-T税务文件的AI助手服务器,支持验证合规性、生成收入摘要、查询发票和进行税务分析。

  • by Bloomidea
  • Python
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 bybloom-ai/saft-mcp

使用说明

SAF-T MCP服务器

使用AI助手解析和分析葡萄牙SAF-T税务文件

入门指南 · 可用工具 · 配置

Versao 葡萄牙语 · 13个工具·152次测试


A. 模型上下文协议(MCP)服务器 它使Claude、Cursor和Windsurf等人工智能助手能够加载、验证和分析葡萄牙语 SAF-T (税务标准审计文件)XML文件。加载SAF-T文件并立即查询发票,获取收入摘要、增值税明细,并验证是否符合葡萄牙税务规则。

什么是SAF-T PT?

SAF-T PT是一个强制性的XML文件,所有葡萄牙公司都必须能够从其会计/计费软件导出。它包含公司的发票、付款、客户、产品、税务条目等。此MCP服务器将XML转换为AI助手的可查询数据源。


快速开始

先决条件

  • Python 3.11+ 和 紫外线 (推荐)或pip
  • A. SAF-T PT XML文件 从任何葡萄牙计费/会计软件(PHC、Sage、Primavera等)导出

1.安装

pip install saft-mcp

或来源:

git clone https://github.com/bybloom-ai/saft-mcp.git
cd saft-mcp
uv sync

2.添加到您的AI助手

Claude Code
claude mcp add saft-mcp -- /path/to/saft-mcp/.venv/bin/python -m saft_mcp
Claude Desktop

添加 ~/Library/Application Support/Claude/claude_desktop_config.json (macOS)或 %APPDATA%\Claude\claude_desktop_config.json (Windows):

{
  "mcpServers": {
    "saft-mcp": {
      "command": "/path/to/saft-mcp/.venv/bin/python",
      "args": ["-m", "saft_mcp"]
    }
  }
}
Cursor / VS Code / Other MCP clients

添加到MCP客户端配置中:

{
  "mcpServers": {
    "saft-mcp": {
      "command": "/path/to/saft-mcp/.venv/bin/python",
      "args": ["-m", "saft_mcp"]
    }
  }
}

3.开始使用它

问你的AI助手:

“在~/Documents/saft_2025.xml中加载我的SAF-T文件,并给我一个收入摘要”

服务器将解析文件,提取所有发票和税务数据,并通过自然对话进行查询。


可用工具

saft_load

加载并解析SAF-T PT XML文件。在使用任何其他工具之前,必须先调用此命令。

参数 类型 说明
file_path string SAF-T XML文件的路径

返回公司名称、NIF、会计期间、SAF-T版本和记录计数(客户、产品、发票、付款)。

处理Windows-1252和UTF-8编码、BOM剥离和自动命名空间检测。50MB以下的文件使用完整DOM进行解析;较大的文件使用流媒体。


saft_validate

根据官方XSD模式和葡萄牙语业务规则验证加载的文件。

参数 类型 默认值 说明
rules list[string] all 要检查的特定规则

可用规则:

规则 它检查什么
xsd 针对SAF-T PT 1.04_01 XSD模式的XML结构
numbering 每个系列中的顺序发票编号
nif NIF(税务ID)mod-11校验位验证
tax_codes 税率与已知的葡萄牙增值税税率相匹配
atcud ATCUD唯一文件代码存在且格式良好
hash_chain 发票序列之间的哈希连续性
control_totals 计算出的总计与声明的控制总计相匹配

返回结果,包括严重性(错误/警告)、位置和修复建议。


saft_summary

生成加载文件的执行摘要。不需要参数。

退货:

  • 收入总额(毛额、贷方票据、净额)
  • 发票和贷记单计数
  • 增值税税率明细
  • 按收入排名的前10位客户
  • 文件类型分布(FT、FR、NC、ND、FS)

saft_query_invoices

使用完整分页搜索和筛选发票。

参数 类型 默认值 说明
date_from string - 开始日期(YYYY-MM-DD)
date_to string - 结束日期(YYYY-MM-DD)
customer_nif string - 按税务ID筛选(部分匹配)
customer_name string - 按名称筛选(不区分大小写,部分)
doc_type string - FT、FR、NC、ND或FS
min_amount number - 最小总金额
max_amount number - 最大总金额
status string - N(正常),A(已取消),F(已开票)
limit integer 50 每页结果(最多500个)
offset 整数 0 分页偏移

返回具有文档编号、日期、类型、客户、金额、状态和行数的匹配发票。


saft_tax_summary

生成按费率、月份或文档类型分组的增值税分析。

参数 类型 默认值 说明
date_from string - 开始日期(YYYY-MM-DD)
date_to string - 结束日期(YYYY-MM-DD)
group_by 字符串 rate 分组方式 rate, month,或 doc_type

返回应税基数、增值税金额、每组总金额以及总金额。


saft_query_customers

搜索和过滤客户主数据,增加收入。

参数 类型 默认值 说明
name string - 公司名称(不区分大小写,部分)
nif string - 税务ID(部分匹配)
city string - 计费城市(不区分大小写,部分)
country string - 国家代码(精确,例如“PT”、“ES”)
limit integer 50 每页结果(最多500个)
offset 整数 0 分页偏移

向客户返回发票计数和每位客户的总收入。


saft_query_products

使用销售统计数据搜索和筛选产品目录。

参数 类型 默认值 说明
description string - 产品描述(不区分大小写,局部)
code string - 产品代码(部分匹配)
product_type string - P(产品),S(服务),O(其他),I(进口),E(出口)
group string - 产品组(不区分大小写,局部)
limit integer 50 每页结果(最多500个)
offset 整数 0 分页偏移

返回产品,包括销售次数、总数量和总收入。


saft_get_invoice

获取单个发票的完整详细信息,包括所有行项目。

参数 类型 说明
invoice_no string 确切的发票号码(例如“FR 2025A15/90”)

返回完整的发票,包括标题、文件总计、特殊制度以及所有包含产品、数量、价格、税费、免税额和参考的行。


saft_anomaly_detect

检测加载文件中的可疑模式和异常。

参数 类型 默认值 说明
checks list[string] all 要运行的特定检查

可用支票:

检查 它检测到什么
duplicate_invoices 相同客户+金额+日期组合
numbering_gaps 每个系列中缺少序列号
weekend_invoices 周六或周日开具的发票
unusual_amounts 发票金额与平均值的偏差超过3个标准差
cancelled_ratio 每个系列的取消率很高
zero_amount 总金额为零的发票

返回异常,包括类型、严重性、描述和受影响的文档。


saft_compare

将加载的SAF-T文件与第二个文件进行比较(例如,按月、按年)。

参数 类型 默认值 说明
file_path string - 第二个SAF-T XML文件的路径
metrics list[string] all 要比较的指标

可用指标: revenue, customers, products, doc_types, vat.

返回周期标签和一个按度量返回before/after/delta的变化字典。包括最新/最流失的客户、最活跃的客户和百分比变化。


saft_aging

根据发票和付款计算应收账款账龄。

参数 类型 默认值 说明
reference_date string 今天 从(YYYY-MM-DD)到年龄的日期
buckets list[int] [30,60,90120] 以天为单位的老化桶边界

每个客户的退货,按未付总额排序,每个桶中的金额。根据发票使用FIFO分配付款。


saft_export

将数据导出到CSV文件,以便在电子表格或其他工具中使用。

参数 类型 默认值 说明
export_type string - invoices, customers, products, tax_summary,或 anomalies
file_path string - 输出CSV文件路径
filters dict - 可选过滤器(与相应的查询工具相同)

返回文件路径、行数和列名。


saft_stats

生成发票数据的统计概述。

参数 类型 默认值 说明
date_from string - 开始日期(YYYY-MM-DD)
date_to string - 结束日期(YYYY-MM-DD)

返回发票统计数据(平均值、中位数、标准偏差)、每日/每周/每月分布、客户集中度(帕累托分析)和顶部/底部发票。


典型工作流程

1. saft_load            -> Parse the XML file
2. saft_validate        -> Check compliance (XSD + business rules)
3. saft_summary         -> Get the big picture (revenue, top customers, VAT)
4. saft_query_invoices  -> Drill into specific invoices
5. saft_get_invoice     -> Full detail for a single invoice
6. saft_tax_summary     -> VAT analysis by rate, month, or doc type
7. saft_anomaly_detect  -> Flag suspicious patterns
8. saft_stats           -> Statistical distributions and trends
9. saft_compare         -> Diff against another SAF-T file
10. saft_export         -> Export results to CSV

加载文件后可以问的示例问题:

  • “公司今年的收入是多少?”
  • “给我看看所有500欧元以上的贷记单”
  • “每月的增值税明细是多少?”
  • “此文件中是否存在任何验证错误?”
  • “列出第三季度客户XPTO的发票”
  • “前五名客户占收入的百分比是多少?”
  • “有任何可疑的模式或异常吗?”
  • “将此文件与上个月的SAF-T进行比较”
  • “应收账款账龄如何?”
  • “将所有发票导出为CSV”

配置

所有设置都可以通过环境变量进行配置 SAFT_MCP_ 前缀:

变量 默认值 描述
SAFT_MCP_STREAMING_THRESHOLD_BYTES 52428800(50 MB) 以上的文件使用流解析器
SAFT_MCP_MAX_FILE_SIZE_BYTES 524288000(500 MB) 可接受的最大文件大小
SAFT_MCP_SESSION_TIMEOUT_SECONDS 1800(30分钟) 不活动后会话到期
SAFT_MCP_MAX_CONCURRENT_SESSIONS 5 最大同时加载文件数
SAFT_MCP_DEFAULT_QUERY_LIMIT 50 每页默认结果
SAFT_MCP_MAX_QUERY_LIMIT 500 每页最大结果数
SAFT_MCP_LOG_LEVEL 信息 日志记录级别

建筑

AI Assistant (Claude, Cursor, etc.)
        |
        | MCP Protocol (stdio)
        v
+------------------------------------------+
|           saft-mcp server                |
|                                          |
|  server.py       FastMCP entry point     |
|  state.py        Session management      |
|                                          |
|  parser/                                 |
|    detector.py   Namespace detection     |
|    encoding.py   Charset handling        |
|    full_parser.py   DOM parse (< 50 MB)  |
|    models.py     Pydantic data models    |
|                                          |
|  tools/                                  |
|    load.py            saft_load          |
|    validate.py        saft_validate      |
|    summary.py         saft_summary       |
|    query_invoices.py  saft_query_invoices|
|    query_customers.py saft_query_customer|
|    query_products.py  saft_query_products|
|    get_invoice.py     saft_get_invoice   |
|    tax_summary.py     saft_tax_summary   |
|    anomaly_detect.py  saft_anomaly_detect|
|    compare.py         saft_compare       |
|    aging.py           saft_aging         |
|    export.py          saft_export        |
|    stats.py           saft_stats         |
|                                          |
|  validators/                             |
|    xsd_validator.py   XSD 1.04_01        |
|    business_rules.py  Numbering, totals  |
|    nif.py             NIF mod-11         |
|    hash_chain.py      Hash continuity    |
|                                          |
|  schemas/                                |
|    saftpt1.04_01.xsd  Official XSD       |
+------------------------------------------+

关键设计决策:

  • 所有货币价值使用 Decimal 避免税务计算中的浮点四舍五入
  • lxml 文件 对于XML解析,使用自动XSD 1.1功能剥离(葡萄牙官方XSD使用 xs:assert 和 xs:all 具有无界子项,lxml的XSD 1.0引擎无法原生处理)
  • Pydantic v2型号 根据真实的PHC公司出口进行验证
  • 命名空间自动检测 通过扫描文件的前4KB(从不硬编码)
  • Windows-1252编码 通过XML声明本机处理

发展

# Install with dev dependencies
uv sync --extra dev

# Run tests (152 tests)
pytest

# Lint
ruff check src/ tests/

# Format
ruff format src/ tests/

# Type check
mypy src/

项目结构

saft-mcp/
  src/saft_mcp/         # Source code
    server.py           # FastMCP entry point, tool registration
    config.py           # Settings (pydantic-settings, env vars)
    state.py            # Session store, parsed file state
    exceptions.py       # SaftError hierarchy
    parser/             # XML parsing (encoding, detection, models)
    tools/              # One file per MCP tool
    validators/         # XSD, business rules, NIF, hash chain
    schemas/            # Official XSD file
  tests/                # Mirrors src/ structure
  pyproject.toml        # Project config (hatch build, ruff, mypy, pytest)

路线图

  • [x] saft_query_customers --搜索和过滤客户主数据
  • [x] saft_query_products --搜索和筛选产品目录
  • [x] saft_get_invoice --包含行项目的完整发票详细信息
  • [x] saft_anomaly_detect --标记重复发票、编号缺口、异常金额
  • [x] saft_compare --区分两个SAF-T文件(例如,按月)
  • [x] saft_aging --应收账款账龄分析
  • [x] saft_export --将数据导出到CSV
  • [x] saft_stats --统计概述和分布
  • [ ] 流解析器 对于大文件(>=50MB)
  • []会计SAF-T支持(日记账分录、总账、试算表)
  • [ ] saft_trial_balance --根据会计数据生成试算表
  • [ ] saft_ies_prepare --预填IES年度纳税申报表字段
  • [ ] saft_cross_check --交叉引用发票与会计SAF-T
  • [x] PyPI包(pip install saft-mcp)
  • [x] GitHub操作CI(pytest+ruff+mypy)

支持的SAF-T版本

  • SAF-T PT 1.04_01 (现行葡萄牙标准)

用PHC公司的实际出口进行测试。应使用任何兼容的葡萄牙软件(Sage、Primavera、PHC、Moloni、InvoiceXpress等)中的SAF-T文件。


许可证

麻省理工学院


建造于 bybloom.ai,一个业务部门 Bloomidea