datev-extf-mcp
This MCP server validates, explains, and writes DATEV EXTF files (Buchungsstapel and Debitoren/Kreditoren) locally.
Validate DATEV EXTF files – Check CSV files or pasted text for format errors, with line/field-level explanations in German or English (e.g., decimal comma, leading zeros, BU-Schlüssel, encoding issues).
Explain finding codes – Get plain-language descriptions and fixes for validation codes like
amount-dotordate-leading-zero.Write Buchungsstapel – Generate a DATEV-format booking batch (Formatversion 13) from booking rows (amounts in cents), validate it automatically, and either write it as Windows-1252 to a file or return the CSV text.
List columns – Show the 125 Buchungsstapel or 254 Debitoren/Kreditoren columns by position to map export fields or understand findings.
Access resources – Built-in resources for column lists and finding explanations.
Prompt support – Includes a
fix_datev_importprompt that validates a file and proposes fixes.
Validates and writes DATEV-Format (EXTF) files, including Buchungsstapel and Debitoren/Kreditoren master data, with detailed error explanations and the ability to generate import-ready booking batches.
datev-extf-mcp
MCP server that validates and writes DATEV-Format (EXTF) files: Buchungsstapel (booking batches) and Debitoren/Kreditoren (customer and supplier master data). Ask your AI assistant why DATEV rejected an import, or have it turn a list of bookings into a file DATEV accepts.
Deutsch: MCP-Server, der Dateien im DATEV-Format (EXTF) prüft und schreibt. Fragen Sie Ihren KI-Assistenten, warum DATEV einen Import ablehnt: Er bekommt jeden Fehler mit Zeile, Feld und einer verständlichen Erklärung, etwa Punkt statt Komma im Umsatz, fehlende führende Null im Belegdatum oder BU-Schlüssel auf Automatikkonten.
Local only. The server runs on your machine and reads files from disk. Nothing is uploaded, and there's no account or API key.
Built on
@seamless-engineering/datev-extf. Its rules come from DATEV's own material: the Formatbeschreibung on developer.datev.de, the DATEV-Format Prüfprogramm and the#REWimport messages.Every file the writer produces passes the validator.
Prefer a browser? The same checks run in the DATEV EXTF validator (English), also without upload.
Install
Needs Node.js 20 or later.
Claude Code
claude mcp add datev-extf -- npx -y @seamless-engineering/datev-extf-mcpClaude Desktop (claude_desktop_config.json), Cursor (.cursor/mcp.json) and most other clients:
{
"mcpServers": {
"datev-extf": {
"command": "npx",
"args": ["-y", "@seamless-engineering/datev-extf-mcp"]
}
}
}Claude Desktop, one click: download datev-extf-mcp.mcpb from the latest release and open it. Build it yourself with ./scripts/bundle.sh.
Relative file paths resolve against the server's working directory, so absolute paths are the safer choice.
Related MCP server: einvoice-mcp
Tools
Tool | What it does |
| Checks a file ( |
| Explains a finding code such as |
| Builds a Buchungsstapel (Formatversion 13) from a header and booking rows (amounts in cents), validates it, and writes it as Windows-1252 to |
| Lists the 125 Buchungsstapel or 254 Debitoren/Kreditoren columns by position. |
Resources: datev-extf://columns/buchungsstapel, datev-extf://columns/debkred, datev-extf://findings/de and datev-extf://findings/en.
Prompt: fix_datev_import validates a file and proposes fixes for the export that produced it.
Example
Why does DATEV reject
~/Downloads/EXTF_Buchungsstapel.csv?
2 errors, 1 warning in 214 data rows (category buchungsstapel, encoding utf-8).
- warning [utf8-without-bom]: The file is UTF-8 without a byte order mark. DATEV then reads it as Windows-1252 and umlauts turn into garbage …
- error line 4 [amount-dot]: Amount “49.90” uses a dot as the decimal separator. DATEV expects a comma: 12.50 becomes 12,50.
- error line 9 [date-leading-zero]: Document date “506” has only three digits: the leading zero is gone. …Not tax advice
The server checks format, not bookkeeping. It can't tell whether an account or tax key is right for a transaction, and it doesn't pick them when writing. Agree that with your tax advisor.
DATEV and DATEV-Format are trademarks of DATEV eG. This project is not affiliated with or endorsed by DATEV.
Maintenance
Maintained by seamless.engineering for our own production use: we run managed DATEV integrations for shops, payment providers and ERPs, fully EU-hosted. Issues and PRs welcome, no SLA.
Releasing
Bump version in package.json, both versions in server.json and the one in manifest.json, commit, then tag and push: git tag v0.1.1 && git push origin v0.1.1. The release workflow publishes to npm with provenance via trusted publishing, then to the MCP Registry as engineering.seamless/datev-extf.
MIT licence.
Available Tools
4 toolsexplain_datev_findingExplain a DATEV EXTF finding codeARead-only
Explain what a validate_datev_extf finding code (e.g. amount-dot, bu-automatic, date-leading-zero) means and how to fix it. Placeholders like {value} or {max} stand for values from the specific finding.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | The finding code. | |
| lang | No | Language of the messages: de (default) or en. | de |
Output Schema
| Name | Required | Description |
|---|---|---|
| code | Yes | |
| disclaimer | Yes | |
| explanation | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only and closed-world aspects. The description adds useful behavioral context: it returns an explanation plus fix instructions and clarifies how placeholders in messages map to values from the specific finding.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two focused sentences with no filler. The core behavior is front-loaded, and the placeholder clarification earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a complete schema, an output schema, and annotations, the description provides everything needed: what the tool does, how the code values appear in output, and language support via the lang parameter. Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both parameters already described and full enums provided. The description adds only illustrative examples and placeholder semantics, which is helpful but does not substantially extend the schema's parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Explain'), names the exact resource ('a validate_datev_extf finding code'), and clarifies the action with examples and fix guidance. It clearly distinguishes this tool from validation and writing operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes it clear this tool is for interpreting findings produced by validate_datev_extf, which implies post-validation usage. It does not explicitly list alternatives or state when not to use the tool, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_datev_columnsList DATEV EXTF columnsARead-only
List the columns (line 2) of a DATEV Buchungsstapel (Formatversion 13, 125 columns) or Debitoren/Kreditoren file (254 columns), numbered by position. Use it to map export fields to DATEV columns or to find a column named in a finding.
| Name | Required | Description | Default |
|---|---|---|---|
| format | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | Yes | |
| format | Yes | |
| columns | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description's 'List' verb aligns with this. The description adds useful context about the file formats, column counts, and the fact that columns come from line 2, which goes beyond the structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero redundancy. The first sentence front-loads the action and resource; the second provides concrete use cases. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter tool with an output schema, the description covers what the tool does, what parameter values mean, and when to use it. Minor gap: it does not specify indexing (0- or 1-based) for 'numbered by position,' but the output schema likely covers the return structure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description fully compensates by explaining both enum values: Buchungsstapel (Formatversion 13, 125 columns) and Debitoren/Kreditoren file (254 columns). This gives the agent semantic understanding of what each 'format' value means beyond the bare enum labels.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb 'List' and specifies the resource: columns (line 2) of DATEV Buchungsstapel or Debitoren/Kreditoren files. It distinguishes itself from siblings by the action (list vs validate/explain/write) and includes concrete details like column counts and format version.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use the tool: 'to map export fields to DATEV columns or to find a column named in a finding.' It does not mention alternatives or when not to use it, but the sibling tools are action-distinct, so the implied usage is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_datev_extfValidate a DATEV EXTF fileARead-only
Check a DATEV-Format (EXTF) CSV file, e.g. EXTF_Buchungsstapel.csv or a Debitoren/Kreditoren export, before importing it into DATEV or after DATEV rejected it. Returns every problem with line, field and a plain-language explanation in German or English: dot instead of comma in amounts, missing leading zeros in Belegdatum, BU-Schlüssel on automatic accounts, account length, encoding, header errors and more. Pass a file path (preferred, the encoding is checked too) or the file content.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Language of the messages: de (default) or en. | de |
| path | No | Path to the CSV file on this machine. Relative paths resolve against the server's working directory. | |
| content | No | The file content as text, if there's no file. The encoding can't be checked this way. |
Output Schema
| Name | Required | Description |
|---|---|---|
| rows | Yes | |
| errors | Yes | |
| header | No | |
| category | No | buchungsstapel, debkred or other |
| encoding | Yes | |
| findings | Yes | |
| warnings | Yes | |
| truncated | Yes | |
| disclaimer | Yes | |
| countsByCode | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, setting the safety profile. The description adds useful behavior beyond that: it discloses that passing a file path enables encoding checks, while passing content does not, and it describes the output format (line, field, plain-language explanation). This adds context without contradicting annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is informative but not bloated. It front-loads the purpose, lists concrete example problems, and explains the two input modes in a single paragraph. Every sentence earns its place, though the list of error types could be trimmed without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a validation tool with an output schema, the description covers the essential usage details: what it validates, when to use it, input modes, language selection, and the general shape of results. It doesn't mention all edge cases or limitations, but the output schema provides the return structure, and the annotation readOnlyHint covers side effects. Missing any explicit handling of missing required fields (none are required) is minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and each parameter has a basic description. The tool description adds value by clarifying that 'path' is preferred because it enables encoding checks, and that 'content' cannot have encoding checked. This is extra semantic meaning not present in the schema properties themselves.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Check a DATEV-Format (EXTF) CSV file') and the resource (DATEV EXTF files like EXTF_Buchungsstapel.csv). It clearly distinguishes from siblings by specifying it returns problems with line, field, and plain-language explanations, which is distinct from listing columns, explaining a finding, or writing a file.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use scenarios: 'before importing it into DATEV or after DATEV rejected it.' It also advises passing a file path as preferred over content. It doesn't name alternatives or state when not to use it, but the sibling tools are dissimilar enough that the usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
write_buchungsstapelWrite a DATEV BuchungsstapelADestructiveIdempotent
Create a DATEV-Format Buchungsstapel (EXTF, Formatversion 13) from booking rows, ready for import into DATEV Rechnungswesen or DATEV Unternehmen online. The result is checked with the validator before it's returned. With outputPath the file is written as Windows-1252, the encoding DATEV expects; without it the CSV text is returned. The tool formats bookings, it doesn't choose accounts or tax keys: take those from the user or their tax advisor.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Language of the messages: de (default) or en. | de |
| rows | Yes | ||
| header | Yes | ||
| outputPath | No | Where to write the file, e.g. EXTF_Buchungsstapel.csv. Existing files are overwritten. |
Output Schema
| Name | Required | Description |
|---|---|---|
| csv | No | |
| path | No | |
| rows | Yes | |
| report | Yes | |
| changed | Yes | Belegfeld 1 values the writer had to clean, and texts with characters Windows-1252 can't hold |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful behavior beyond the annotations: it notes the result is validated before return, describes the output encoding (Windows-1252) and the conditional file writing vs returning CSV text. It also clarifies the scope (formats, doesn't choose accounts). Annotations already declare readOnlyHint=false, destructiveHint=true, and idempotentHint=true, and the description does not contradict them, but it adds operational detail that helps an agent anticipate side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, each earning its place: the purpose, the validation step, the output behavior, and the limitation. It front-loads the core function and then provides necessary operational details. No redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (nested objects, multiple required fields) and the presence of an output schema (so return values are covered), the description provides sufficient context: purpose, validation, output modes, and a caveat about data sourcing. It could mention that the header must be properly filled (but schema covers required fields). Overall, it's complete enough for an agent to know when and how to call it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 50%, so the description must compensate for undocumented parameters. It does add context specifically for outputPath (file writing vs text return) and overall input expectations (rows should contain accounts/tax keys from user/advisor). However, it does not elaborate on header fields or rows structure beyond what's already in the schema, which already describes many inner properties. The description adds some value but doesn't fully bridge the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool creates a DATEV-Format Buchungsstapel (EXTF, Formatversion 13) from booking rows, specifying the exact resource and format. It also distinguishes itself from sibling tools (list, validate, explain) by focusing on creation, and includes the target import systems. This is a specific verb+resource that leaves no ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context on when to use the tool: to generate a Buchungsstapel ready for import. It explicitly states what the tool does not do ('doesn't choose accounts or tax keys: take those from the user or their tax advisor'), guiding the agent on prerequisites. However, it doesn't explicitly compare to sibling tools like validate_datev_extf, though the context makes the distinction obvious. Slight gap but acceptable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
4 tool updates
v0.1.0- First observed
explain_datev_finding - First observed
list_datev_columns - First observed
validate_datev_extf - First observed
write_buchungsstapel
TDQS
Scored across 4 tools
Each tool has a single, distinct responsibility: listing columns, validating files, explaining validation findings, and writing a Buchungsstapel. The only close pair is validate/explain, but one performs checks while the other only resolves finding codes, so there is no real ambiguity.
All tools follow a consistent snake_case verb_noun pattern: list_datev_columns, validate_datev_extf, explain_datev_finding, write_buchungsstapel. The verbs are clear, consistently placed first, and there is no mixing of naming conventions.
Four tools is well-scoped for this focused DATEV EXTF helper server. Each tool covers a distinct part of the workflow and none feels redundant or unnecessary.
The Buchungsstapel lifecycle is well covered: list columns, validate, explain errors, and write a pre-validated file. However, list_datev_columns and validate_datev_extf also cover Debitoren/Kreditoren files, but there is no corresponding writer for that format, leaving a noticeable gap.
Maintenance
Related MCP Connectors
Twinfield AI Connect: hosted MCP server for Twinfield.
Hosted MCP server for AI-driven data ops. Create apps, manage schemas, and CRUD structured data.
Exact AI Connect: hosted MCP server for Exact Online.
MCP server for Codat — companies, connections, invoices, bills and financial statements.
Related MCP Servers
- FlicenseBqualityDmaintenanceMCP server for DACH accounting automation. Connect AI assistants to sevDesk and Lexoffice — create invoices, manage contacts, handle bookings and vouchers for German-speaking businesses.1528 npm-
- AlicenseAqualityDmaintenanceMCP server for DACH e-invoicing. Create XRechnung (UBL) and ZUGFeRD 2.3 (Factur-X CII) invoices, validate against EN 16931 rules, extract data from XML, and convert between UBL, CII and JSON formats.630 npm2MIT
- AlicenseNot gradedqualityDmaintenanceA local MCP server for analyzing DATEV bookkeeping data in natural language. It reads EXTF export files locally and provides tools for balances, open items, and booking search.4MIT
- AlicenseAqualityDmaintenanceMCP server for German e-invoice compliance (XRechnung 3.0 & ZUGFeRD 2.x) enabling AI agents to validate, generate, parse, and check compliance of electronic invoices per EN 16931.61MIT