<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: MaKriRich</title>
    <description>The latest articles on Forem by MaKriRich (@makririch).</description>
    <link>https://forem.com/makririch</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3877230%2F5a97b6fe-17a9-4ca7-8c21-fb6eeab62db0.PNG</url>
      <title>Forem: MaKriRich</title>
      <link>https://forem.com/makririch</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/makririch"/>
    <language>en</language>
    <item>
      <title>E-Invoicing in Germany: What Developers Need to Know (2027 Deadline)</title>
      <dc:creator>MaKriRich</dc:creator>
      <pubDate>Mon, 13 Apr 2026 18:38:47 +0000</pubDate>
      <link>https://forem.com/makririch/e-invoicing-in-germany-what-developers-need-to-know-2027-deadline-49gl</link>
      <guid>https://forem.com/makririch/e-invoicing-in-germany-what-developers-need-to-know-2027-deadline-49gl</guid>
      <description>&lt;p&gt;If you build software for the German market, you need to know about e-invoicing. Germany is rolling out mandatory electronic invoicing for all B2B transactions, and the deadlines are closer than you think.&lt;/p&gt;

&lt;p&gt;This article covers the technical side: what formats you need to support, how they work, and what tools are available.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Timeline
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Requirement&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Jan 1, 2025&lt;/td&gt;
&lt;td&gt;All businesses must be able to &lt;strong&gt;receive&lt;/strong&gt; e-invoices&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jan 1, 2027&lt;/td&gt;
&lt;td&gt;Businesses with &amp;gt;800K EUR revenue must &lt;strong&gt;send&lt;/strong&gt; e-invoices&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jan 1, 2028&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;All&lt;/strong&gt; businesses must send e-invoices&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;"E-invoice" means structured, machine-readable data. A PDF attached to an email is NOT an e-invoice, even if it looks like one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Two Formats
&lt;/h2&gt;

&lt;h3&gt;
  
  
  XRechnung
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Standard:&lt;/strong&gt; CIUS (Core Invoice Usage Specification) based on EN 16931&lt;br&gt;
&lt;strong&gt;Syntax:&lt;/strong&gt; UBL 2.1 (Universal Business Language) or CII&lt;br&gt;
&lt;strong&gt;Use case:&lt;/strong&gt; Primarily B2G (business to government), increasingly B2B&lt;br&gt;
&lt;strong&gt;Current version:&lt;/strong&gt; 3.0.2&lt;/p&gt;

&lt;p&gt;An XRechnung is a pure XML file. No visual representation -- just data. Government portals (ZRE, OZG-RE) require this format.&lt;/p&gt;

&lt;p&gt;Example structure (simplified):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;Invoice&lt;/span&gt; &lt;span class="na"&gt;xmlns=&lt;/span&gt;&lt;span class="s"&gt;"urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;ID&amp;gt;&lt;/span&gt;RE-2026-0042&lt;span class="nt"&gt;&amp;lt;/ID&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;IssueDate&amp;gt;&lt;/span&gt;2026-03-18&lt;span class="nt"&gt;&amp;lt;/IssueDate&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;InvoiceTypeCode&amp;gt;&lt;/span&gt;380&lt;span class="nt"&gt;&amp;lt;/InvoiceTypeCode&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;DocumentCurrencyCode&amp;gt;&lt;/span&gt;EUR&lt;span class="nt"&gt;&amp;lt;/DocumentCurrencyCode&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;BuyerReference&amp;gt;&lt;/span&gt;04011000-12345-67&lt;span class="nt"&gt;&amp;lt;/BuyerReference&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;AccountingSupplierParty&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Party&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;PartyName&amp;gt;&amp;lt;Name&amp;gt;&lt;/span&gt;Beispiel GmbH&lt;span class="nt"&gt;&amp;lt;/Name&amp;gt;&amp;lt;/PartyName&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Party&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/AccountingSupplierParty&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;LegalMonetaryTotal&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;TaxExclusiveAmount&lt;/span&gt; &lt;span class="na"&gt;currencyID=&lt;/span&gt;&lt;span class="s"&gt;"EUR"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;1500.00&lt;span class="nt"&gt;&amp;lt;/TaxExclusiveAmount&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;TaxInclusiveAmount&lt;/span&gt; &lt;span class="na"&gt;currencyID=&lt;/span&gt;&lt;span class="s"&gt;"EUR"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;1785.00&lt;span class="nt"&gt;&amp;lt;/TaxInclusiveAmount&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;PayableAmount&lt;/span&gt; &lt;span class="na"&gt;currencyID=&lt;/span&gt;&lt;span class="s"&gt;"EUR"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;1785.00&lt;span class="nt"&gt;&amp;lt;/PayableAmount&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/LegalMonetaryTotal&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/Invoice&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ZUGFeRD / Factur-X
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Standard:&lt;/strong&gt; Based on EN 16931, using CII (Cross Industry Invoice) syntax&lt;br&gt;
&lt;strong&gt;Container:&lt;/strong&gt; PDF/A-3 with embedded XML&lt;br&gt;
&lt;strong&gt;Use case:&lt;/strong&gt; B2B (universal), human-readable AND machine-readable&lt;br&gt;
&lt;strong&gt;Current version:&lt;/strong&gt; 2.3&lt;/p&gt;

&lt;p&gt;ZUGFeRD is the pragmatic format. It looks like a normal PDF to humans (you can print it, email it, archive it), but it contains a hidden XML file (&lt;code&gt;factur-x.xml&lt;/code&gt;) with all the structured data. Software can extract and process the XML automatically.&lt;/p&gt;

&lt;p&gt;Profiles (from least to most data):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Minimum&lt;/strong&gt; -- Invoice number, date, amounts only&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Basic WL&lt;/strong&gt; -- Basic without line items&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Basic&lt;/strong&gt; -- With line items&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;EN16931&lt;/strong&gt; -- Full EN 16931 compliance (recommended)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extended&lt;/strong&gt; -- Additional fields beyond the standard&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Factur-X is the French name for the same standard. ZUGFeRD 2.3 = Factur-X 1.0.06.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Technical Challenges
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Different XML Trees for the Same Data
&lt;/h3&gt;

&lt;p&gt;UBL and CII represent the same invoice data in completely different XML structures. If you need to support both, you need separate builders/parsers or an internal format that maps to both.&lt;/p&gt;

&lt;p&gt;Example -- Seller name:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;UBL:&lt;/strong&gt; &lt;code&gt;Invoice &amp;gt; AccountingSupplierParty &amp;gt; Party &amp;gt; PartyName &amp;gt; Name&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CII:&lt;/strong&gt; &lt;code&gt;CrossIndustryInvoice &amp;gt; SupplyChainTradeTransaction &amp;gt; ApplicableHeaderTradeAgreement &amp;gt; SellerTradeParty &amp;gt; Name&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  German Business Rules (BR-DE)
&lt;/h3&gt;

&lt;p&gt;On top of EN 16931, Germany adds its own rules. The important ones:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Rule&lt;/th&gt;
&lt;th&gt;What it checks&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;BR-DE-01&lt;/td&gt;
&lt;td&gt;Payment instructions must be present&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BR-DE-02&lt;/td&gt;
&lt;td&gt;Bank account required for bank transfers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BR-DE-03&lt;/td&gt;
&lt;td&gt;Seller must have email&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BR-DE-07&lt;/td&gt;
&lt;td&gt;Seller must have VAT ID or tax number&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BR-DE-13&lt;/td&gt;
&lt;td&gt;Buyer Reference (BT-10) is mandatory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BR-DE-14&lt;/td&gt;
&lt;td&gt;Tax rate must be &amp;gt; 0 for standard category&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BR-DE-17&lt;/td&gt;
&lt;td&gt;German VAT ID format validation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BR-DE-18&lt;/td&gt;
&lt;td&gt;IBAN format validation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Full list: &lt;a href="https://github.com/itplr-kosit/xrechnung-schematron" rel="noopener noreferrer"&gt;KoSIT XRechnung Schematron rules&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  PDF/A-3 for ZUGFeRD
&lt;/h3&gt;

&lt;p&gt;Creating a ZUGFeRD PDF means:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Generate a visual PDF (the human-readable invoice)&lt;/li&gt;
&lt;li&gt;Convert it to PDF/A-3 (add ICC color profile, XMP metadata)&lt;/li&gt;
&lt;li&gt;Embed the CII XML as a file attachment named &lt;code&gt;factur-x.xml&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Add Factur-X metadata to the XMP&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is harder than it sounds. Many PDF libraries don't support PDF/A-3 properly. In JavaScript, &lt;code&gt;pdf-lib&lt;/code&gt; handles it but requires manual metadata management.&lt;/p&gt;

&lt;h3&gt;
  
  
  Validation
&lt;/h3&gt;

&lt;p&gt;The official validation tool is the &lt;a href="https://github.com/itplr-kosit/validator" rel="noopener noreferrer"&gt;KoSIT Validator&lt;/a&gt; (Java). For production use, you might want:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;XML well-formedness check&lt;/li&gt;
&lt;li&gt;XSD schema validation&lt;/li&gt;
&lt;li&gt;Schematron business rule validation (the BR-DE rules)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Running full Schematron validation in JavaScript is non-trivial. Pragmatic approach: implement the 20 most common rules as code, defer full Schematron to Phase 2.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tools and Libraries
&lt;/h2&gt;

&lt;h3&gt;
  
  
  For JavaScript/TypeScript
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;fast-xml-parser&lt;/strong&gt; -- Parse and build XML without native dependencies&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;pdf-lib&lt;/strong&gt; -- Create and modify PDFs (including PDF/A-3), pure JavaScript&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;einvoice-mcp&lt;/strong&gt; -- MCP server with 6 tools for XRechnung/ZUGFeRD (MIT, &lt;a href="https://www.npmjs.com/package/einvoice-mcp" rel="noopener noreferrer"&gt;npm&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  For Python
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;factur-x&lt;/strong&gt; -- Official Factur-X library (ZUGFeRD PDF creation)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;xrechnung-python&lt;/strong&gt; -- XRechnung generation&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  For Java
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;KoSIT Validator&lt;/strong&gt; -- Official validation tool&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;mustangproject&lt;/strong&gt; -- ZUGFeRD/Factur-X library&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Official Resources
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://xeinkauf.de/xrechnung/" rel="noopener noreferrer"&gt;XRechnung Standard&lt;/a&gt; (German)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/itplr-kosit/xrechnung-testsuite" rel="noopener noreferrer"&gt;XRechnung Test Suite&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.ferd-net.de/" rel="noopener noreferrer"&gt;ZUGFeRD / Factur-X&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ec.europa.eu/digital-building-blocks/sites/display/DIGITAL/eInvoicing" rel="noopener noreferrer"&gt;EN 16931 (European standard)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What You Should Do Now
&lt;/h2&gt;

&lt;p&gt;If you're building invoicing software for the German market:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Start with receiving&lt;/strong&gt;: Parse incoming XRechnung (UBL) and ZUGFeRD (CII + PDF) -- extract the structured data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add validation&lt;/strong&gt;: At minimum, check the BR-DE rules&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build sending&lt;/strong&gt;: Generate valid XML, test against the KoSIT test suite&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prepare for PDF/A-3&lt;/strong&gt;: If you need ZUGFeRD, budget time for PDF/A compliance&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The 2027 deadline is 9 months away. If your software handles German invoices, this isn't optional anymore.&lt;/p&gt;




&lt;p&gt;I built &lt;a href="https://github.com/makririch/einvoice-mcp" rel="noopener noreferrer"&gt;einvoice-mcp&lt;/a&gt; to make this easier. It's an open-source MCP server that handles XRechnung and ZUGFeRD creation, validation, and conversion. MIT licensed, no native dependencies, runs anywhere Node.js runs.&lt;/p&gt;

&lt;p&gt;Questions? Find me on &lt;a href="https://github.com/makririch" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>backend</category>
      <category>developers</category>
      <category>news</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>Automate sevDesk &amp; Lexoffice with n8n -- A Complete Guide</title>
      <dc:creator>MaKriRich</dc:creator>
      <pubDate>Mon, 13 Apr 2026 18:30:14 +0000</pubDate>
      <link>https://forem.com/makririch/automate-sevdesk-lexoffice-with-n8n-a-complete-guide-1e7e</link>
      <guid>https://forem.com/makririch/automate-sevdesk-lexoffice-with-n8n-a-complete-guide-1e7e</guid>
      <description>&lt;p&gt;If you run a business in Germany, Austria, or Switzerland, you probably use sevDesk for invoicing or Lexoffice for bookkeeping -- maybe both. They're good tools, but they don't talk to each other. And every manual sync between them is time you're not spending on actual work.&lt;/p&gt;

&lt;p&gt;This guide shows you how to automate three common workflows using n8n and the BuchPilot community nodes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;n8n&lt;/strong&gt; (self-hosted or cloud). If you don't have it yet: &lt;a href="https://n8n.io" rel="noopener noreferrer"&gt;n8n.io&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;sevDesk&lt;/strong&gt; account with API token (Settings &amp;gt; Users &amp;gt; API Token)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lexoffice&lt;/strong&gt; account with API key (&lt;a href="https://app.lexoffice.de/addons/public-api" rel="noopener noreferrer"&gt;app.lexoffice.de/addons/public-api&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 1: Install BuchPilot Nodes
&lt;/h2&gt;

&lt;p&gt;In n8n, go to &lt;strong&gt;Settings &amp;gt; Community Nodes &amp;gt; Install a community node&lt;/strong&gt; and enter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;n8n-nodes-buchpilot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Click Install. Done. You now have four new nodes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;sevDesk (actions)&lt;/li&gt;
&lt;li&gt;sevDesk Trigger (polling)&lt;/li&gt;
&lt;li&gt;Lexoffice (actions)&lt;/li&gt;
&lt;li&gt;Lexoffice Trigger (webhook)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 2: Set Up Credentials
&lt;/h2&gt;

&lt;h3&gt;
  
  
  sevDesk
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;In n8n: Credentials &amp;gt; New &amp;gt; "sevDesk API"&lt;/li&gt;
&lt;li&gt;Paste your API token&lt;/li&gt;
&lt;li&gt;Save&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Lexoffice
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;In n8n: Credentials &amp;gt; New &amp;gt; "Lexoffice API"&lt;/li&gt;
&lt;li&gt;Paste your API key&lt;/li&gt;
&lt;li&gt;Save&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Workflow 1: Contact Sync (sevDesk to Lexoffice)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The problem:&lt;/strong&gt; You create a new client in sevDesk, then have to manually re-enter them in Lexoffice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The solution:&lt;/strong&gt; A workflow that runs every minute and syncs new contacts automatically.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to build it
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Add sevDesk Trigger&lt;/strong&gt; node&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Event: New Contact&lt;/li&gt;
&lt;li&gt;Polling interval: Every 1 minute (default)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Add a Set node&lt;/strong&gt; (data mapping)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;sevDesk uses &lt;code&gt;surename&lt;/code&gt; for last name (yes, that's the actual field name)&lt;/li&gt;
&lt;li&gt;Lexoffice uses &lt;code&gt;lastName&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Map: &lt;code&gt;{{ $json.surename }}&lt;/code&gt; -&amp;gt; &lt;code&gt;lastName&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;If &lt;code&gt;name2&lt;/code&gt; (company name) exists: set &lt;code&gt;contactType&lt;/code&gt; to &lt;code&gt;company&lt;/code&gt;, otherwise &lt;code&gt;person&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Add Lexoffice node&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Resource: Contact&lt;/li&gt;
&lt;li&gt;Operation: Create&lt;/li&gt;
&lt;li&gt;Role: Customer&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Activate&lt;/strong&gt; the workflow&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;From now on, every new sevDesk contact appears in Lexoffice within a minute.&lt;/p&gt;

&lt;h3&gt;
  
  
  Handling duplicates
&lt;/h3&gt;

&lt;p&gt;Lexoffice doesn't reject duplicates by default. Add an &lt;strong&gt;IF node&lt;/strong&gt; before the Lexoffice node that checks if a contact with the same name/email already exists using Lexoffice &amp;gt; List Contacts with a filter.&lt;/p&gt;

&lt;h2&gt;
  
  
  Workflow 2: Invoice Booking (sevDesk to Lexoffice)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The problem:&lt;/strong&gt; Every invoice you write in sevDesk needs to be manually booked as a voucher in Lexoffice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The solution:&lt;/strong&gt; Automatic booking whenever a new invoice appears.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to build it
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Add sevDesk Trigger&lt;/strong&gt; node&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Event: New Invoice&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Add sevDesk node&lt;/strong&gt; (fetch full details)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Resource: Invoice&lt;/li&gt;
&lt;li&gt;Operation: Get&lt;/li&gt;
&lt;li&gt;ID: &lt;code&gt;{{ $json.id }}&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Add a Set node&lt;/strong&gt; (mapping)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;totalNet&lt;/code&gt; -&amp;gt; Lexoffice &lt;code&gt;totalNetAmount&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;taxRate&lt;/code&gt; -&amp;gt; Lexoffice &lt;code&gt;taxRatePercentage&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;totalGross&lt;/code&gt; -&amp;gt; Lexoffice &lt;code&gt;totalGrossAmount&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Add Lexoffice node&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Resource: Voucher&lt;/li&gt;
&lt;li&gt;Operation: Create&lt;/li&gt;
&lt;li&gt;Voucher Type: Purchase Invoice&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Activate&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Important: Tax handling
&lt;/h3&gt;

&lt;p&gt;sevDesk invoices can have multiple line items with different tax rates (19%, 7%, 0%). The simple mapping above works for single-rate invoices. For multi-rate invoices, you'd need a loop that creates one voucher line per tax rate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Workflow 3: Weekly Overdue Invoice Report
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The problem:&lt;/strong&gt; You forget to follow up on unpaid invoices.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The solution:&lt;/strong&gt; An automated email every Monday listing all open and overdue invoices.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to build it
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Add Schedule Trigger&lt;/strong&gt; node&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cron: &lt;code&gt;0 8 * * 1&lt;/code&gt; (Monday 8:00 AM)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Add sevDesk node&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Resource: Invoice&lt;/li&gt;
&lt;li&gt;Operation: Get Many&lt;/li&gt;
&lt;li&gt;Filter: Status = Open (200)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Add IF node&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Condition: &lt;code&gt;invoiceDate&lt;/code&gt; + &lt;code&gt;timeToPay&lt;/code&gt; days &amp;lt; today&lt;/li&gt;
&lt;li&gt;True branch = overdue, False branch = open but not yet due&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Add Set node&lt;/strong&gt; (formatting)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a readable summary: invoice number, client name, amount, due date&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Add Send Email node&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;To: your email&lt;/li&gt;
&lt;li&gt;Subject: "Weekly Invoice Report"&lt;/li&gt;
&lt;li&gt;Body: the formatted summary&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Activate&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You'll never miss an overdue invoice again.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tips &amp;amp; Gotchas
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Polling vs Webhook&lt;/strong&gt;: The sevDesk Trigger uses polling (checks the API periodically). It works behind firewalls and NATs -- no public URL needed. The Lexoffice Trigger uses webhooks (Lexoffice sends events to your n8n). This needs a public URL.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rate limits&lt;/strong&gt;: Lexoffice allows max 2 requests per second. The BuchPilot nodes handle this with a built-in 500ms delay. You don't need to add Wait nodes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Error handling&lt;/strong&gt;: Add an Error Branch to each workflow. If a Lexoffice or sevDesk API call fails, catch the error and send yourself a notification instead of losing the data silently.&lt;/p&gt;

&lt;h2&gt;
  
  
  Next Steps
&lt;/h2&gt;

&lt;p&gt;These three workflows cover the most common use cases. Once they're running, you can extend them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add Slack/Telegram notifications instead of email&lt;/li&gt;
&lt;li&gt;Create credit notes automatically when invoices are cancelled&lt;/li&gt;
&lt;li&gt;Sync payments between the two systems&lt;/li&gt;
&lt;li&gt;Add XRechnung/ZUGFeRD e-invoice generation (using einvoice-mcp)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;BuchPilot Nodes (free):&lt;/strong&gt; &lt;a href="https://www.npmjs.com/package/n8n-nodes-buchpilot" rel="noopener noreferrer"&gt;npm&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source code:&lt;/strong&gt; &lt;a href="https://github.com/makririch/n8n-nodes-buchpilot" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>api</category>
      <category>automation</category>
      <category>productivity</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How I Built an MCP Server for German Accounting (XRechnung/ZUGFeRD)</title>
      <dc:creator>MaKriRich</dc:creator>
      <pubDate>Mon, 13 Apr 2026 18:28:44 +0000</pubDate>
      <link>https://forem.com/makririch/how-i-built-an-mcp-server-for-german-accounting-xrechnungzugferd-969</link>
      <guid>https://forem.com/makririch/how-i-built-an-mcp-server-for-german-accounting-xrechnungzugferd-969</guid>
      <description>&lt;p&gt;Germany just made electronic invoicing mandatory. Starting January 2027, businesses with more than 800,000 EUR in annual revenue must send invoices in structured XML formats -- XRechnung or ZUGFeRD. By January 2028, every single business in Germany has to comply.&lt;/p&gt;

&lt;p&gt;That's millions of businesses that need to produce machine-readable invoices instead of PDFs. And most of them have no idea how.&lt;/p&gt;

&lt;p&gt;I decided to build a tool that solves this -- not as a SaaS, but as an open-source MCP server that any AI agent can use.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is MCP?
&lt;/h2&gt;

&lt;p&gt;Model Context Protocol (MCP) is an open standard by Anthropic that lets AI agents (like Claude, GPT, or local models) use external tools. Think of it as "function calling, but standardized." An MCP server exposes tools with JSON schemas, and any MCP-compatible client can discover and call them.&lt;/p&gt;

&lt;p&gt;This matters because accounting is exactly the kind of task AI agents can help with: structured data, well-defined rules, repetitive operations.&lt;/p&gt;

&lt;h2&gt;
  
  
  The E-Invoice Landscape in Germany
&lt;/h2&gt;

&lt;p&gt;Two formats dominate:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;XRechnung&lt;/strong&gt; -- Pure XML based on UBL 2.1 (Universal Business Language). Required for invoices to German government agencies. Increasingly used in B2B.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ZUGFeRD&lt;/strong&gt; -- A CII (Cross Industry Invoice) XML embedded inside a PDF/A-3 file. The visual PDF looks normal to humans, but the embedded XML makes it machine-readable. Compatible with the French standard Factur-X.&lt;/p&gt;

&lt;p&gt;Both follow the European standard EN 16931. Germany adds its own business rules on top (prefixed BR-DE-*).&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture Decisions
&lt;/h2&gt;

&lt;p&gt;I had to make several key decisions early on:&lt;/p&gt;

&lt;h3&gt;
  
  
  Standalone package, not a plugin
&lt;/h3&gt;

&lt;p&gt;I'm also building BuchPilot -- n8n nodes and an MCP server for Lexoffice (a popular German accounting tool). Initially, I considered adding e-invoice support there. But the dependencies are different (PDF libraries add ~50MB), and the audience is broader. Anyone who sends invoices in Germany needs e-invoicing -- not just Lexoffice users.&lt;/p&gt;

&lt;p&gt;So &lt;code&gt;einvoice-mcp&lt;/code&gt; is its own npm package. But it exports a &lt;code&gt;registerEInvoiceTools()&lt;/code&gt; function, so BuchPilot can add its 6 tools in two lines of code.&lt;/p&gt;

&lt;h3&gt;
  
  
  No native dependencies
&lt;/h3&gt;

&lt;p&gt;XML validation libraries like &lt;code&gt;libxmljs2&lt;/code&gt; require native compilation (node-gyp). That's a nightmare for cross-platform distribution. Instead, I went with &lt;code&gt;fast-xml-parser&lt;/code&gt; for XML handling and implemented the 20 most important German business rules as TypeScript functions.&lt;/p&gt;

&lt;p&gt;Is it 100% spec-compliant? No. Does it catch 95% of real-world errors? Yes. And it runs everywhere without a C compiler.&lt;/p&gt;

&lt;h3&gt;
  
  
  UBL for XRechnung, CII for ZUGFeRD
&lt;/h3&gt;

&lt;p&gt;The German coordination body (KoSIT) recommends UBL 2.1 for XRechnung. Government portals expect UBL. So XRechnung output is UBL.&lt;/p&gt;

&lt;p&gt;ZUGFeRD is based on CII (Cross Industry Invoice), a completely different XML structure. Same data, different tree. The internal data model is format-agnostic, and mapping functions handle the conversion.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 6 Tools
&lt;/h2&gt;

&lt;h3&gt;
  
  
  validate_invoice
&lt;/h3&gt;

&lt;p&gt;Takes XML or PDF, runs three levels of checks:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Syntax&lt;/strong&gt;: Is the XML well-formed?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Schema&lt;/strong&gt;: Are all required fields present with correct types?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Business Rules&lt;/strong&gt;: 20 BR-DE rules -- IBAN format, VAT ID format, mandatory buyer reference, etc.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  create_xrechnung
&lt;/h3&gt;

&lt;p&gt;Takes structured data (seller, buyer, line items, payment info) and generates valid UBL 2.1 XML. Conforms to XRechnung 3.0.2.&lt;/p&gt;

&lt;p&gt;The hardest part was getting the tax calculation right. German invoices have different tax categories (Standard 19%, Reduced 7%, Zero-rated, Reverse Charge, Intra-community), and each has different rules for what fields are required.&lt;/p&gt;

&lt;h3&gt;
  
  
  create_zugferd
&lt;/h3&gt;

&lt;p&gt;Same input data, but outputs a PDF/A-3 with embedded CII XML. Uses &lt;code&gt;pdf-lib&lt;/code&gt; (pure JavaScript, no Puppeteer) for PDF generation.&lt;/p&gt;

&lt;h3&gt;
  
  
  convert_format
&lt;/h3&gt;

&lt;p&gt;Converts between UBL, CII, and JSON. Useful when you receive a ZUGFeRD invoice (CII) but need to forward it as XRechnung (UBL).&lt;/p&gt;

&lt;h3&gt;
  
  
  extract_data
&lt;/h3&gt;

&lt;p&gt;Reads XML or ZUGFeRD PDF and returns structured JSON. Handy for importing invoices into accounting systems.&lt;/p&gt;

&lt;h3&gt;
  
  
  get_format_info
&lt;/h3&gt;

&lt;p&gt;A reference tool that helps AI agents understand the format requirements -- required fields, tax categories, unit codes (UN/ECE Rec 20), and the legal deadlines.&lt;/p&gt;

&lt;h2&gt;
  
  
  Implementation Highlights
&lt;/h2&gt;

&lt;h3&gt;
  
  
  German Business Rules as Code
&lt;/h3&gt;

&lt;p&gt;The BR-DE rules are implemented as simple TypeScript functions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;checkBRDE07&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;invoice&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;InvoiceData&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;ValidationIssue&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;seller&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;invoice&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;seller&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;seller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;vatId&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;seller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;taxNumber&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;rule&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;BR-DE-07&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;level&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/Invoice/AccountingSupplierParty&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Seller must have either VAT ID (USt-IdNr.) or tax number (Steuernummer)&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;20 of these cover the most common validation failures. They're modular -- when XRechnung 3.1 comes out (it always does, yearly), I can update individual rules without touching the rest.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Plugin Pattern
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Standalone:&lt;/span&gt;
&lt;span class="nx"&gt;npx&lt;/span&gt; &lt;span class="nx"&gt;einvoice&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;mcp&lt;/span&gt;

&lt;span class="c1"&gt;// As plugin in another MCP server:&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;registerEInvoiceTools&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;einvoice-mcp&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nf"&gt;registerEInvoiceTools&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;yourMcpServer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This works because MCP tools are just name + schema + handler. Registering them on another server is trivial.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Full XSD validation (probably via WASM-based XML validator)&lt;/li&gt;
&lt;li&gt;More ZUGFeRD profiles (currently EN16931, adding Basic and Extended)&lt;/li&gt;
&lt;li&gt;Automated testing against KoSIT's official XRechnung test suite&lt;/li&gt;
&lt;li&gt;Integration with BuchPilot MCP (Lexoffice creates invoice -&amp;gt; einvoice-mcp creates XRechnung)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx einvoice-mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or install it permanently:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; einvoice-mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Source: &lt;a href="https://github.com/makririch/einvoice-mcp" rel="noopener noreferrer"&gt;github.com/makririch/einvoice-mcp&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;MIT licensed. Contributions welcome.&lt;/p&gt;

&lt;p&gt;If you're building tools for the German market and need e-invoice support -- feel free to use the package or the plugin pattern. The 2027 deadline is coming faster than you think.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>mcp</category>
      <category>opensource</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
