Standard VAT rate in any EU member state on any date since 2016. Offline, no API key.
The standard VAT rate in every EU member state on any date since 1 January 2016, as small libraries with no dependencies that work offline.
| Language | Package | Install | Status |
|---|---|---|---|
| Node and the browser (TypeScript) | @duty27/eu-vat | npm install @duty27/eu-vat | on npm |
| Python 3.9+ | duty27-eu-vat | pip install duty27-eu-vat | on PyPI |
| Java 11+ | com.duty27:eu-vat | Maven or Gradle, see java/ | on Maven Central |
| AI assistants (MCP server) | @duty27/eu-vat-mcp | claude mcp add eu-vat -- npx -y @duty27/eu-vat-mcp | on npm |
import { getStandardRate } from '@duty27/eu-vat';
getStandardRate('DE', '2020-07-01'); // 16 (Germany's temporary cut)
from duty27_eu_vat import get_standard_rate
get_standard_rate("DE", "2020-07-01") # Decimal('16')
EuVat.getStandardRate("DE", "2020-07-01"); // 16
All three give identical answers (so does the MCP server) and are built from the same dataset, which Duty27 publishes at https://duty27.com/vat-rates/history, as CSV and JSON at https://duty27.com/data/eu-standard-vat-rates.json. Every rate change there cites the law or tax-authority notice that made it, and the 2016 starting rates cite the European Commission's rate table; the citations are on that page and in the CSV and JSON, not in the packages. It covers standard rates only; reduced rates are not included. It looks rates up; it does not calculate tax. This is information, not tax advice.
For deciding what to charge (B2B reverse charge, the EU €10,000 threshold, VIES checks) and keeping the proof (archive and OSS reports), see the Duty27 API, which is free to try.
Most people never need this repository: install the package from its registry. To read or work on one library, each folder is self-contained: it has its own README, licences, build file and tests, and needs nothing from the rest of the repo. To fetch only one folder instead of the whole repository:
git clone --filter=blob:none --no-checkout https://github.com/duty27/eu-vat.git
cd eu-vat
git sparse-checkout set python # or node, or java
git checkout main
One file, data/eu-standard-vat-rates.json, is the source. ./build.sh turns it into each
language's data module and a shared set of expected answers (test-vectors.csv, worked out by a plain scan of the
data, not by any library), then builds and tests all three libraries and the MCP server (which bundles the Node library's data), and finishes by
checking that every one of them carries the same source hash.
./build.sh # regenerate the data, then build and test node, python, java and the MCP server
./build.sh java # one language (or node, python, mcp)
./build.sh refresh # fetch the published rates and update the snapshot
./build.sh check # fail if the published rates changed, or a generated file was edited by hand
Code: MIT (LICENSE). Data: CC BY 4.0 (DATA-LICENSE.md), credit
Rate data: Duty27 (https://duty27.com/vat-rates/history), CC BY 4.0.
Source-derived launch command. Check the maintainer’s required arguments and credentials before running:
npx -y @duty27/eu-vat-mcpMerge this template into ~/Library/Application Support/Claude/claude_desktop_config.json. Keep existing servers. Add any arguments, credentials, and permissions required by the maintainer; this template has not been install-tested.
{
"mcpServers": {
"io-github-duty27-eu-vat": {
"command": "npx",
"args": [
"-y",
"@duty27/eu-vat-mcp"
]
}
}
}Restart Claude Desktop completely for changes to take effect. Confirm the server appears connected in the client’s tool list, then try a read-only example from its documentation.
Claude Desktop setup reference@duty27/eu-vat-mcpnpmEU VAT rates works with any MCP-compatible client. Copy the config snippet from the Configuration section above and add it to the file shown for your client, then restart the application.
~/Library/Application Support/Claude/claude_desktop_config.jsonRestart Claude Desktop completely for changes to take effect.~/.cursor/mcp.jsonRestart Cursor for changes to take effect..vscode/mcp.jsonReload VS Code window for changes to take effect.~/.codeium/windsurf/mcp_config.jsonRestart Windsurf for changes to take effect..mcp.jsonSave at the project root, then start Claude Code in that project and review the MCP server approval prompt. Keep real credentials out of shared files.