create_invoice
Generate ZUGFeRD-compliant invoice PDFs with embedded e-invoicing data, supporting flexible item entry, VAT, and payment details for automated billing.
Instructions
Create a ZUGFeRD-compliant invoice PDF with structured e-invoicing data.
Each item in the items list should have: description, unitPrice, and optionally quantity, unit (C62=piece, HUR=hour, DAY=day, KGM=kg), vatRate.
Args: invoice_number: Unique invoice number (e.g. "RE-2026-001"). invoice_date: Invoice date in ISO format (e.g. "2026-04-12"). seller_name: Seller company name. seller_street: Seller street address. seller_zip: Seller postal code. seller_city: Seller city. buyer_name: Buyer company name. buyer_street: Buyer street address. buyer_zip: Buyer postal code. buyer_city: Buyer city. items: Line items – each with description, unitPrice, and optionally quantity, unit, vatRate. iban: Payment IBAN. bic: Payment BIC/SWIFT code. payment_terms: Payment terms text. due_date: Payment due date (ISO format). seller_vat_id: Seller VAT ID. seller_country: Seller country code (default: DE). buyer_country: Buyer country code (default: DE). buyer_vat_id: Buyer VAT ID. currency: Currency code (default: EUR). template_name: Template name for the invoice layout. html_content: HTML content for the invoice body.
Returns: Base64-encoded PDF with embedded ZUGFeRD XML.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| invoice_number | Yes | ||
| invoice_date | Yes | ||
| seller_name | Yes | ||
| seller_street | Yes | ||
| seller_zip | Yes | ||
| seller_city | Yes | ||
| buyer_name | Yes | ||
| buyer_street | Yes | ||
| buyer_zip | Yes | ||
| buyer_city | Yes | ||
| items | Yes | ||
| iban | No | ||
| bic | No | ||
| payment_terms | No | ||
| due_date | No | ||
| seller_vat_id | No | ||
| seller_country | No | DE | |
| buyer_country | No | DE | |
| buyer_vat_id | No | ||
| currency | No | EUR | |
| template_name | No | ||
| html_content | No |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| result | Yes |
Implementation Reference
- mcp/src/docgen_mcp/server.py:165-267 (handler)The create_invoice tool handler: builds a ZUGFeRD-compliant invoice PDF using the DocGen client, accepting invoice metadata, seller/buyer info, line items, payment details, and optional template/html, returning a base64-encoded PDF.
@mcp.tool() def create_invoice( invoice_number: str, invoice_date: str, seller_name: str, seller_street: str, seller_zip: str, seller_city: str, buyer_name: str, buyer_street: str, buyer_zip: str, buyer_city: str, items: list[dict[str, Any]], iban: str | None = None, bic: str | None = None, payment_terms: str | None = None, due_date: str | None = None, seller_vat_id: str | None = None, seller_country: str = "DE", buyer_country: str = "DE", buyer_vat_id: str | None = None, currency: str = "EUR", template_name: str | None = None, html_content: str | None = None, ) -> str: """Create a ZUGFeRD-compliant invoice PDF with structured e-invoicing data. Each item in the items list should have: description, unitPrice, and optionally quantity, unit (C62=piece, HUR=hour, DAY=day, KGM=kg), vatRate. Args: invoice_number: Unique invoice number (e.g. "RE-2026-001"). invoice_date: Invoice date in ISO format (e.g. "2026-04-12"). seller_name: Seller company name. seller_street: Seller street address. seller_zip: Seller postal code. seller_city: Seller city. buyer_name: Buyer company name. buyer_street: Buyer street address. buyer_zip: Buyer postal code. buyer_city: Buyer city. items: Line items – each with description, unitPrice, and optionally quantity, unit, vatRate. iban: Payment IBAN. bic: Payment BIC/SWIFT code. payment_terms: Payment terms text. due_date: Payment due date (ISO format). seller_vat_id: Seller VAT ID. seller_country: Seller country code (default: DE). buyer_country: Buyer country code (default: DE). buyer_vat_id: Buyer VAT ID. currency: Currency code (default: EUR). template_name: Template name for the invoice layout. html_content: HTML content for the invoice body. Returns: Base64-encoded PDF with embedded ZUGFeRD XML. """ dg = _get_client() from docgen.models import InvoiceUnit inv = dg.invoice() inv.number(invoice_number).date(invoice_date) inv.seller( name=seller_name, street=seller_street, zip=seller_zip, city=seller_city, country=seller_country, vat_id=seller_vat_id, ) inv.buyer( name=buyer_name, street=buyer_street, zip=buyer_zip, city=buyer_city, country=buyer_country, vat_id=buyer_vat_id, ) for item in items: unit = item.get("unit", "C62") inv.item( description=item["description"], quantity=float(item.get("quantity", 1)), unit=InvoiceUnit(unit), unit_price=float(item["unitPrice"]), vat_rate=float(item.get("vatRate", 19.0)), ) if iban: inv.bank(iban=iban, bic=bic) if payment_terms: inv.payment_terms(payment_terms) if due_date: inv.due_date(due_date) inv.currency(currency) invoice_data = inv.build() doc = dg.document() if html_content: doc.html(html_content) else: doc.html(f"<h1>Rechnung {invoice_number}</h1>") if template_name: doc.template(template_name) doc.invoice(invoice_data) doc.as_pdf() result = doc.generate() return base64.b64encode(result).decode() - mcp/src/docgen_mcp/server.py:165-165 (registration)Registration of create_invoice as an MCP tool via the @mcp.tool() decorator on FastMCP instance.
@mcp.tool() - mcp/src/docgen_mcp/server.py:166-189 (schema)Input schema (type annotations) for create_invoice, defining all parameters, types, and defaults.
def create_invoice( invoice_number: str, invoice_date: str, seller_name: str, seller_street: str, seller_zip: str, seller_city: str, buyer_name: str, buyer_street: str, buyer_zip: str, buyer_city: str, items: list[dict[str, Any]], iban: str | None = None, bic: str | None = None, payment_terms: str | None = None, due_date: str | None = None, seller_vat_id: str | None = None, seller_country: str = "DE", buyer_country: str = "DE", buyer_vat_id: str | None = None, currency: str = "EUR", template_name: str | None = None, html_content: str | None = None, ) -> str: