🇸🇦 ZATCA MCP
AI原生沙特电子发票——从自然语言生成符合ZATCA的发票。
     
"Generate an invoice for 10 hours of consulting at 500 SAR to Al-Rajhi Corp" → compliant XML + QR code in seconds
______________________________________________________________________
为什么选择ZATCA MCP?
沙特阿拉伯的ZATCA授权要求 所有业务 发布结构化电子发票——自2021年12月以来的第一阶段(生成),第二阶段(集成)将在2025年之前在纳税人中推广。这是一个基石 2030年愿景 数字化转型。
问题: ZATCA电子发票没有开源的人工智能原生工具。企业要么为专有的ERP插件付费,要么从头开始构建合规性。
本项目: 沙特电子发票的第一个开源MCP服务器——让克劳德等人工智能代理通过自然对话生成、验证和管理符合ZATCA的发票。
特性
- 9 MCP工具 --生成、签署、验证、提交发票+二维码、CSR、合规性检查、HTML渲染
- 3 MCP资源 --验证规则、发票类型、用于AI参考的示例发票
- 3个MCP提示 --创建发票、验证和贷记/借记单的指导工作流程
- UBL 2.1 XML --根据OASIS标准生成完全符合命名空间的发票
- 16规则验证引擎 --BR-01至BR-16业务规则检查
- XAdES BES数字签名 --嵌入证书的ECDSA secp256k1签名
- ZATCA API集成 --用于合规性、报告和清除端点的异步客户端
- 贷记/借记票据 --类型代码381/383,带计费参考和说明注释
- TLV QR编码 --第1阶段+第2阶段标签支持(标签1-8,加密数据)
- Fikra命令行界面 --Claude Code风格的会话代理,带有HTML发票输出
- 127测试 -单元、集成、签名、API客户端、资源/提示和边缘库覆盖
- CI/CD管道 --ruff+mypy+pytest跨Python 3.10/3.11/3.12+第二阶段作业
- 阿拉伯语支持 --卖方/买方姓名和地址的完整UTF-8处理
- 小数精度 —
Decimal随着ROUND_HALF_UP适用于所有金融数学 - 多税率增值税 --每行项目增值税税率(默认15%)
建筑
graph TD
subgraph Clients
A[Claude Desktop]
B[Claude Code]
C[Fikra CLI]
end
subgraph MCP Server
D[generate_invoice]
E[generate_qr_code]
F[validate_invoice]
G[decode_qr]
D2[generate_csr]
D3[sign_invoice]
D4[submit_invoice]
D5[check_compliance]
end
subgraph Processing Engine
H[XML Builder
UBL 2.1]
I[Validation Engine
16 Business Rules]
J[TLV Encoder
QR Phase 1 + 2]
S[Signing Engine
XAdES-BES]
API[ZATCA API Client
httpx async]
end
A -- MCP Protocol --> D
B -- MCP Protocol --> E
A -- MCP Protocol --> F
B -- MCP Protocol --> G
C -- Direct Call --> H
C -- Direct Call --> I
C -- Direct Call --> J
C -. HTML Pipeline .-> K[Browser Invoice
with QR Image]
D --> H
D --> J
E --> J
F --> I
G --> J
D2 --> S
D3 --> S
D4 --> API
D5 --> API快速开始
安装
pip install zatca-mcp # Phase 1 (generation + validation)
pip install zatca-mcp[phase2] # Phase 2 (signing + ZATCA API)与Claude Desktop一起使用
添加 ~/.claude/claude_desktop_config.json:
{
"mcpServers": {
"zatca": {
"command": "zatca-mcp"
}
}
}重新启动克劳德桌面。现在,您可以要求Claude生成符合ZATCA标准的发票。
Fikra命令行界面
export ANTHROPIC_API_KEY="sk-ant-..."
pip install zatca-mcp[phase2]
fikra # works from any directoryFikra命令行界面
一个Claude Code风格的会话代理,将自然语言转换为具有专业HTML输出的兼容发票。
特征:
- 渐变ASCII横幅
#c8e64a品牌主题化 ❯流式响应提示⏺工具使用指示器(反映Claude Code UX)- 自动生成内嵌二维码图像的HTML发票
- 在浏览器中自动打开发票
- 令牌使用情况显示(
↳ input · output tokens) /help/clear/quit命令
◇
◇◆◇
◇ ███████╗██╗██╗ ██╗██████╗ █████╗ ██╗ ██╗
╱ ╲ ██╔════╝██║██║ ██╔╝██╔══██╗██╔══██╗██║ ██║
╱ ╲ █████╗ ██║█████╔╝ ██████╔╝███████║███████║
╰───╯ ██╔══╝ ██║██╔═██╗ ██╔══██╗██╔══██║██╔══██║
██║ ██║██║ ██╗██║ ██║██║ ██║██║ ██║
╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝
Model: claude-sonnet-4-20250514 | Tools: 8 ZATCA tools | Phase 2 ✓ | cwd: ~/zatca-mcp
Tips: "I sold 10 laptops at 3000 SAR each to TechCo" to get started
/help for commands, /quit to exit
❯ I just closed a deal with Al-Rajhi Corp for consulting — 10 hours at 500 SAR
⏺ generate_invoice
✓ Invoice saved & opened in browser
~/zatca-mcp/examples/invoices/INV-2026-001_20260217.html
Great news on closing the deal! I've generated a ZATCA-compliant invoice
for Al-Rajhi Corp — 10 hours of consulting at 500 SAR each.
**Invoice Summary:**
- Subtotal: 5,000.00 SAR
- VAT (15%): 750.00 SAR
- **Total: 5,750.00 SAR**
The HTML invoice with embedded QR code is open in your browser.
↳ 1,847 input · 312 output tokens工具API参考
generate_invoice — Create a ZATCA-compliant UBL 2.1 XML e-invoice
根据沙特阿拉伯的ZATCA电子发票标准创建完整的XML发票。支持标准(B2B)、简化(B2C)、贷记单和借记单类型。自动计算增值税、行总计,并嵌入二维码数据。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
invoice_type | string | 是 | "standard", "simplified", "credit_note",或 "debit_note" |
invoice_number | string | 是 | 唯一标识符(例如。, "INV-2024-001") |
issue_date | string | 是 | YYYY-MM-DD 格式 |
seller_name | string | 是 | 卖家企业名称 |
seller_vat | string | 是 | 15位增值税号码 |
seller_address | string | 是 | 卖家街道地址 |
seller_city | string | 是 | 卖家所在城市 |
buyer_name | string | 是 | 买方/客户名称 |
items | string | Yes | JSON数组: [{"name": "...", "quantity": 1, "unit_price": 100.00, "vat_rate": 0.15}] |
currency | string | 否 | ISO货币代码(默认值: "SAR") |
buyer_vat | string | 否 | 标准(B2B)发票需要 |
buyer_address | string | 否 | 买方街道地址 |
buyer_city | string | 否 | 买家所在城市 |
note | string | 否 | 可选发票备注 |
billing_reference_id | string | 否 | 原始发票ID(贷记/借记单需要) |
billing_reference_date | string | 否 | 原始发票日期(用于贷方/借方票据) |
instruction_note | string | 否 | 贷记/借记单的原因 |
退货: 填写内嵌二维码的UBL 2.1 XML发票字符串。
generate_qr_code — Generate a TLV-encoded QR code
根据ZATCA的标签长度值(TLV)格式创建Base64编码的QR码有效载荷,以符合第1阶段和第2阶段的要求。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
seller_name | string | 是 | 企业/纳税人名称(阿拉伯语或英语) |
vat_number | string | 是 | 15位沙特增值税号码 |
timestamp | string | Yes | ISO 8601格式(例如。, "2024-01-15T10:30:00Z") |
total_amount | string | 是 | 发票总额,包括增值税(例如。, "1150.00") |
vat_amount | string | 是 | 征收的增值税总额(例如。, "150.00") |
退货: JSON格式 qr_base64 和 decoded_verification 数据。
validate_invoice — Check invoice XML against ZATCA business rules
运行16个业务规则检查,包括必填字段、增值税编号格式、行总计和增值税计算的数学准确性、贷记/借记单引用以及UBL 2.1 XML的结构完整性。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
invoice_xml | string | 是 | 完成UBL 2.1 XML发票字符串 |
退货: JSON格式 is_valid (布尔值), errors (列表), warnings (列表),以及 checks_run (16).
generate_csr — Generate a ZATCA-compliant Certificate Signing Request
生成ECDSA secp256k1密钥对和带有ZATCA必需主题字段的CSR。需要 cryptography (安装时 pip install zatca-mcp[phase2]).
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
common_name | string | 是 | 证书CN字段 |
organization | string | 是 | 组织名称 |
organizational_unit | string | 是 | 组织单位 |
country | string | 否 | 国家代码(默认值: "SA") |
serial_number | string | 否 | ZATCA设备序列号 |
invoice_type | string | 否 | ZATCA发票类型代码(默认值: "1100") |
location | string | 否 | 业务位置(默认值: "Riyadh") |
industry | string | 否 | 业务类别(默认值: "IT") |
退货: JSON格式 csr_pem, private_key_pem, warning,以及 next_step.
sign_invoice — Digitally sign an invoice with XAdES-BES
将XAdES BES数字签名注入到UBL 2.1发票XML中。使用第2阶段加密标签重建二维码(6-8)。需要 cryptography.
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
invoice_xml | string | 是 | 要签名的UBL 2.1 XML发票字符串 |
certificate_pem | string | 是 | PEM编码的X.509证书 |
private_key_pem | string | 是 | PEM编码的ECDSA私钥 |
退货: JSON格式 signed_xml, invoice_hash, qr_base64,以及 is_phase2_compliant.
submit_invoice — Submit a signed invoice to the ZATCA API
向ZATCA Fatoora API提交签署的发票,用于报告(简化)或清关(标准)。需要 httpx 和 pydantic.
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
signed_invoice_xml | string | 是 | 已签名的UBL 2.1 XML发票 |
invoice_hash | string | 是 | Base64编码的SHA-256哈希 |
invoice_uuid | string | 是 | 发票UUID |
certificate | string | 是 | Base64编码证书 |
secret | string | 是 | 来自CSID的API机密 |
mode | string | 否 | "reporting" (默认)或 "clearance" |
environment | string | 否 | "sandbox" (默认)或 "production" |
退货: ZATCA API响应 status, validationResults, warnings,以及 errors.
check_compliance — Check invoice compliance with ZATCA servers
向ZATCA合规性端点提交发票以进行服务器端验证。需要 httpx 和 pydantic.
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
signed_invoice_xml | string | 是 | 已签名的UBL 2.1 XML发票 |
invoice_hash | string | 是 | Base64编码的SHA-256哈希 |
invoice_uuid | string | 是 | 发票UUID |
certificate | string | 是 | Base64编码证书 |
secret | string | 是 | 来自CSID的API机密 |
退货: ZATCA合规性验证结果。
decode_qr — Decode a ZATCA TLV-encoded QR code string
从现有的ZATCA二维码中提取所有编码的标签值,以进行验证或检查。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
qr_base64 | string | 是 | 来自ZATCA QR码的Base64编码TLV字符串 |
退货: 带有解码标签名及其值的JSON。
程序化使用
from zatca_mcp.utils.xml_builder import build_invoice_xml
from zatca_mcp.utils.tlv import encode_tlv
from zatca_mcp.utils.validation import validate_invoice_xml
# Generate invoice
xml = build_invoice_xml(
invoice_type="simplified",
invoice_number="INV-2024-001",
issue_date="2024-01-15",
seller_name="Fikrah Tech",
seller_vat="300000000000003",
seller_address="123 King Fahd Road",
seller_city="Riyadh",
buyer_name="Walk-in Customer",
line_items=[
{"name": "AI Consulting", "quantity": 10, "unit_price": 500.00},
{"name": "Setup Fee", "quantity": 1, "unit_price": 1000.00},
],
)
# Validate
result = validate_invoice_xml(xml)
print(f"Valid: {result['is_valid']}") # True
print(f"Checks: {result['checks_run']}") # 16
# Generate QR code
qr = encode_tlv(
seller_name="Fikrah Tech",
vat_number="300000000000003",
timestamp="2024-01-15T10:00:00Z",
total_amount="6900.00",
vat_amount="900.00",
)
print(f"QR: {qr}")第二阶段:数字签名
from zatca_mcp.utils.signing import (
generate_private_key,
generate_csr,
inject_signature,
hash_invoice,
)
# Generate key pair and CSR
key = generate_private_key()
csr_pem = generate_csr(
key,
common_name="My Company",
organization="My Org",
organizational_unit="IT",
)
# Submit CSR to ZATCA to get a certificate, then sign:
# signed_xml = inject_signature(xml, cert_pem, key)
# invoice_hash = hash_invoice(xml)ZATCA合规性
验证规则(16条业务规则)
| 规则 | 检查 | 描述 |
|---|---|---|
| BR-01 | 发票ID | cbc:ID 是强制性的 |
| BR-02 | 发布日期 | cbc:IssueDate 必填,YYYY-MM-DD格式 |
| BR-03 | 类型代码 | cbc:InvoiceTypeCode 必须是388、381或383 |
| BR-04 | 货币 | cbc:DocumentCurrencyCode 是强制性的 |
| BR-05 | 卖方名称 | 卖方 RegistrationName 是强制性的 |
| BR-06 | 卖方增值税 | 15位增值税编号,以3开头/结尾 |
| BR-07 | 买方名称 | 买方 RegistrationName 是强制性的 |
| BR-08 | 买方增值税(B2B) | 标准发票子类型需要 01* |
| BR-09 | -- | 保留 |
| BR-10 | 行项目 | 至少一个 cac:InvoiceLine 必填项 |
| BR-11 | 行数学 | 数量×价格=行扩展金额(±0.01) |
| BR-12 | 税款总计 | cac:TaxTotal/cbc:TaxAmount 是强制性的 |
| BR-13 | 应付金额 | cbc:PayableAmount 是强制性的 |
| BR-14 | 总钩稽 | 不含税+含税=含税(±0.01) |
| BR-15 | 账单参考 | 贷记/借记单必须参考原始发票 |
| BR-16 | 说明单 | 贷记/借记单应包括原因 |
发票类型
| 类型 | 代码 | 子类型 | 用例 |
|---|---|---|---|
| 标准税务发票 | 388 | 0100000 | B2B交易 |
| 简化税务发票 | 388 | 0200000 | B2C/POS交易 |
| 标准贷记单 | 381 | 0100000 | B2B退货/退款 |
| 简化贷记单 | 381 | 0200000 | B2C退货/退款 |
| 标准借记单 | 383 | 0100000 | B2B附加费用 |
| 简化借记单 | 383 | 0200000 | B2C附加费 |
二维码TLV标签
| 标签 | 名称 | 阶段 |
|---|---|---|
| 1 | 卖方名称 | 1 |
| 2 | 增值税注册号 | 1 |
| 3 | 时间戳 | 1 |
| 4 | 发票总额(含增值税) | 1 |
| 5 | 增值税金额 | 1 |
| 6 | 发票哈希 | 2 |
| 7 | ECDSA签名 | 2 |
| 8 | ECDSA公钥 | 2 |
标签6-8由以下内容填充 sign_invoice 该工具具有真实的加密数据(SHA-256哈希、ECDSA签名、公钥)。工程质量
- 127测试 跨越7个测试模块(TLV、验证、发票、签名、贷记/借记、API客户端、资源/提示)
- CI/CD --GitHub操作:ruff-lint+格式检查、mypy类型检查、覆盖Python 3.10/3.11/3.12的pytest,以及一个专门的第2阶段作业
- 小数精度 --所有财务计算均使用
Decimal随着ROUND_HALF_UP,从不浮点 - UBL 2.1合规性 --完整的OASIS命名空间声明(
ubl,cac,cbc,ext,ds,xades) - 阿拉伯语/UTF-8 —
ensure_ascii=False自始至终;阿拉伯卖方/买方名称正确 - 优雅降级 --如果出现以下情况,第2阶段工具将返回有用的错误
cryptography/httpx未安装
项目结构
zatca-mcp/
├── src/zatca_mcp/
│ ├── server.py # MCP server — 9 tools, 3 resources, 3 prompts
│ ├── cli.py # Fikra CLI — global `fikra` command
│ ├── utils/
│ │ ├── xml_builder.py # UBL 2.1 XML invoice generator
│ │ ├── validation.py # 16-rule validation engine
│ │ ├── tlv.py # TLV QR encoder/decoder
│ │ └── signing.py # XAdES-BES digital signing (Phase 2)
│ └── api/
│ ├── __init__.py
│ ├── client.py # ZATCA Fatoora API client (Phase 2)
│ └── models.py # Pydantic v2 API models (Phase 2)
├── examples/
│ └── fikrah_agent.py # Legacy entry point (redirects to fikra command)
├── tests/
│ ├── test_invoice.py # Invoice generation tests
│ ├── test_tlv.py # TLV encoding/decoding tests
│ ├── test_validation.py # Validation engine tests
│ ├── test_resources_prompts.py # MCP resources & prompts tests
│ ├── test_signing.py # Digital signing tests (Phase 2)
│ ├── test_credit_debit.py # Credit/debit note tests (Phase 2)
│ └── test_api_client.py # API client tests (Phase 2)
├── .github/workflows/
│ └── test.yml # CI pipeline (Phase 1 + Phase 2 jobs)
├── pyproject.toml
└── LICENSE发展
git clone https://github.com/DoubleH10/zatca-mcp.git
cd zatca-mcp
# Phase 1 only
pip install -e ".[dev]"
# Phase 1 + Phase 2 (signing, API)
pip install -e ".[dev,phase2]"
# Tests
pytest tests/ -v # All tests
pytest tests/ -v -m "not sandbox" # Skip live sandbox tests
# Linting & types
ruff check src/ tests/
mypy src/zatca_mcp/ --ignore-missing-imports
# MCP Inspector (interactive testing)
mcp dev src/zatca_mcp/server.py路线图
- \[x\] TLV二维码生成(第1阶段+第2阶段标签)
- \[x\] UBL 2.1 XML发票生成
- \[x\] 16规则验证引擎(BR-01至BR-16)
- \[x\] 配备8个工具的MCP服务器
- \[x\] Fikra CLI(流媒体、HTML发票、QR图像)
- \[x\] CI/CD管道(ruff+mypy+pytest矩阵+第2阶段作业)
- \[x\] XAdES BES数字签名(ECDSA secp256k1)
- \[x\] ZATCA API集成(沙箱+生产)
- \[x\] 证书管理(CSR生成)
- \[x\] 贷记/借记单支持(381/383)
- \[\]PyPI包发布
- \[x\] MCP资源和提示
- \[\]HTTP/SSE传输
- \[\]阿拉伯RTL发票模板
使用zatca-mcp构建
| 项目 | 描述 |
|---|---|
| Fikrah | 金融运营的代理人工智能团队——将此服务器作为其ZATCA合规骨干 |
在你的项目中使用zatca-mcp?打开一个PR添加到这里。
贡献
许可证
Apache 2.0——请参阅 许可证
