pdf-invoice-extractor — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited pdf-invoice-extractor (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Extracts structured invoice data from PDFs for accounting reconciliation and ERP import. Uses mistral_ocr for document understanding, then mistral_chat with json_schema for strict field extraction.
Profile requirements:
mistral_ocr + mistral_chat — available in core profile (default)files_upload (to upload a local PDF) — requires MISTRAL_MCP_PROFILE=fullbatch_create (for bulk invoice processing) — requires MISTRAL_MCP_PROFILE=fullWorks with French, English, and multi-language invoices. Handles scanned PDFs, digital PDFs, and receipts.
Ask the user for one of:
files_upload (requires MISTRAL_MCP_PROFILE=full), note the file_idIf the user has multiple invoices, offer to use batch_create (requires full profile) to process them concurrently.
Call mistral_ocr:
{
"document": {
"type": "document_url",
"documentUrl": "<URL>"
}
}Use "type": "document_id", "documentId": "<file_id>" for uploaded files.
Concatenate structuredContent.pages[*].markdown for multi-page invoices.
Pass the OCR text to mistral_chat with response_format: json_schema:
{
"model": "mistral-small-latest",
"temperature": 0,
"response_format": {
"type": "json_schema",
"json_schema": {
"name": "invoice",
"strict": true,
"schema": {
"type": "object",
"properties": {
"invoice_number": { "type": "string" },
"vendor_name": { "type": "string" },
"vendor_address": { "type": "string" },
"vendor_vat_number": { "type": "string" },
"client_name": { "type": "string" },
"client_address": { "type": "string" },
"issue_date": { "type": "string", "description": "ISO 8601 if determinable" },
"due_date": { "type": "string" },
"currency": { "type": "string", "description": "ISO 4217 code, e.g. EUR" },
"line_items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"description": { "type": "string" },
"quantity": { "type": "number" },
"unit_price": { "type": "number" },
"total": { "type": "number" }
},
"required": ["description", "total"]
}
},
"subtotal_ht": { "type": "number" },
"vat_rate": { "type": "number", "description": "As decimal, e.g. 0.20 for 20%" },
"vat_amount": { "type": "number" },
"total_ttc": { "type": "number" },
"payment_terms": { "type": "string" },
"iban": { "type": "string" },
"payment_reference": { "type": "string" }
},
"required": ["vendor_name", "issue_date", "total_ttc", "line_items"]
}
}
},
"messages": [
{
"role": "user",
"content": "<OCR text>\n\nExtract all invoice fields from the document above. Use null for fields not present in the invoice. Convert dates to ISO 8601 format when possible (YYYY-MM-DD). Do not invent values that are not in the document."
}
]
}Check for mandatory fields. Flag any that are null or missing:
✅ EXTRACTED INVOICE
──────────────────────────────
Invoice #: [number] Date: [date]
Vendor: [name] Due: [date]
Currency: [EUR/USD/...] Total: [amount]
LINE ITEMS
──────────
[table: description | qty | unit price | total]
Subtotal (HT): [amount]
VAT [rate]%: [amount]
TOTAL (TTC): [amount]
⚠️ MISSING FIELDS: [list of null mandatory fields]Offer to export as CSV, JSON, or to pass to french_invoice_reminder if the invoice is overdue.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.