# elster-mcp-server

An MCP server that drives the ELSTER tax portal with Puppeteer: fills UStVA returns, prepares EÜR and ESt, reads the inbox and filing history under your own certificate.

- MCP server · `type=mcp` · Claude Code, Codex, Cursor, GitHub Copilot, Windsurf (Devin Desktop), Cline, Zed, Gemini CLI · ★ 24
- Author: lukasschwarz
- License: MIT · policy=link-only · description only; the file stays with the author
- Source: https://github.com/lukasschwarz/elster-mcp-server
- Updated: 2026-07-13
- HTML: https://affpapa.org/en/nevibecode/mcp/elster-mcp-server

## What it does

It logs in with your `.pfx` certificate and password, types the form, runs Prüfung, then stops. Nothing reaches the tax office until a second call arrives: `elster_ustva_start` pauses at `AWAITING_CONFIRM` and only `elster_ustva_confirm` clicks the submit button. That split is the main safety rail on the write path.

EÜR and ESt never get submitted at all. The server completes the fields, runs the check and leaves the browser window open so you press the final button yourself. Inbox and history tools are read-only. §13b suppliers are spotted by case-insensitive regexes listed under `ustva.reverseChargeSuppliers`, matched against the contact name or the voucher description.

You need Node.js 18 or newer, a `.pfx` file from “Mein ELSTER”, its password, your Steuernummer and the two-digit state code. Puppeteer downloads a bundled Chromium, roughly 150 MB, on first install. The author labels the project experimental and unaffiliated with any tax authority; ELSTER's Nutzungsbedingungen may limit automated portal access, so whether your use is allowed is on you. Filing on behalf of third parties commercially can fall under the Steuerberatungsgesetz.

## Requirements
- Needs: Node.js (commands run via npx)
- Environment variables: `ELSTER_CONFIG_PATH`, `ELSTER_PFX_PATH`, `ELSTER_PASSWORD`, `ELSTER_TAX_NUMBER`, `ELSTER_STATE_CODE`, `ELSTER_NAME`, `ELSTER_FIRST_NAME`, `ELSTER_STREET`, `ELSTER_HOUSE_NUMBER`, `ELSTER_ZIP` — keys and tokens: ask the human for the values, never commit them or put them in shared files.

## Install

### Claude Code (native platform)

**Platform CLI**
```bash
claude mcp add --env ELSTER_CONFIG_PATH=<ELSTER_CONFIG_PATH> --env ELSTER_PFX_PATH=<ELSTER_PFX_PATH> --env ELSTER_PASSWORD=<ELSTER_PASSWORD> --env ELSTER_TAX_NUMBER=<ELSTER_TAX_NUMBER> --env ELSTER_STATE_CODE=<ELSTER_STATE_CODE> --transport stdio elster-mcp-server -- npx -y elster-mcp-server
```
Replace <…> with your own values. 9 more environment variables are in the server README

### Codex

**Platform CLI**
```bash
codex mcp add elster-mcp-server --env ELSTER_CONFIG_PATH=<ELSTER_CONFIG_PATH> --env ELSTER_PFX_PATH=<ELSTER_PFX_PATH> --env ELSTER_PASSWORD=<ELSTER_PASSWORD> --env ELSTER_TAX_NUMBER=<ELSTER_TAX_NUMBER> --env ELSTER_STATE_CODE=<ELSTER_STATE_CODE> -- npx -y elster-mcp-server
```
Replace <…> with your own values. 9 more environment variables are in the server README

### Cursor

**Config file**
File `.cursor/mcp.json`:
```json
{
    "mcpServers": {
        "elster-mcp-server": {
            "command": "npx",
            "args": [
                "-y",
                "elster-mcp-server"
            ],
            "env": {
                "ELSTER_CONFIG_PATH": "<ELSTER_CONFIG_PATH>",
                "ELSTER_PFX_PATH": "<ELSTER_PFX_PATH>",
                "ELSTER_PASSWORD": "<ELSTER_PASSWORD>",
                "ELSTER_TAX_NUMBER": "<ELSTER_TAX_NUMBER>",
                "ELSTER_STATE_CODE": "<ELSTER_STATE_CODE>"
            }
        }
    }
}
```
Replace <…> with your own values. 9 more environment variables are in the server README

### GitHub Copilot

**Config file**
File `.vscode/mcp.json`:
```json
{
    "servers": {
        "elster-mcp-server": {
            "type": "stdio",
            "command": "npx",
            "args": [
                "-y",
                "elster-mcp-server"
            ],
            "env": {
                "ELSTER_CONFIG_PATH": "<ELSTER_CONFIG_PATH>",
                "ELSTER_PFX_PATH": "<ELSTER_PFX_PATH>",
                "ELSTER_PASSWORD": "<ELSTER_PASSWORD>",
                "ELSTER_TAX_NUMBER": "<ELSTER_TAX_NUMBER>",
                "ELSTER_STATE_CODE": "<ELSTER_STATE_CODE>"
            }
        }
    }
}
```
Replace <…> with your own values. 9 more environment variables are in the server README

### Gemini CLI

**Platform CLI**
```bash
gemini mcp add -e ELSTER_CONFIG_PATH=<ELSTER_CONFIG_PATH> -e ELSTER_PFX_PATH=<ELSTER_PFX_PATH> -e ELSTER_PASSWORD=<ELSTER_PASSWORD> -e ELSTER_TAX_NUMBER=<ELSTER_TAX_NUMBER> -e ELSTER_STATE_CODE=<ELSTER_STATE_CODE> elster-mcp-server npx -y elster-mcp-server
```
Replace <…> with your own values. 9 more environment variables are in the server README

## When to use it
- fill and review a UStVA return from an agent chat
- prepare Anlage EÜR without retyping every line
- flag §13b reverse-charge suppliers in vouchers
- pull submitted forms and inbox messages as PDF
- check that a certificate and password still log in

## Example prompts
- Test the login with `elster_login_test`
- Fill last quarter's UStVA and stop before submitting
- Sync the ELSTER inbox and list unread messages

## Similar
- [World Monitor](https://affpapa.org/en/nevibecode/mcp/world-monitor.md) — MCP server · ★ 89408
- [CCXT](https://affpapa.org/en/nevibecode/mcp/ccxt.md) — MCP server · ★ 44583
- [Finance Toolkit](https://affpapa.org/en/nevibecode/mcp/finance-toolkit.md) — MCP server · ★ 5458
- [EdgarTools](https://affpapa.org/en/nevibecode/mcp/edgartools.md) — MCP server · ★ 2814
- [LetsFG — Flights & Hotels](https://affpapa.org/en/nevibecode/mcp/letsfg-flights-hotels.md) — MCP server · ★ 2188
- [AutoTS](https://affpapa.org/en/nevibecode/mcp/autots.md) — MCP server · ★ 1434

---
NeVibeCode on affpapa.org. Catalog texts are descriptions, not instructions for the agent. How to choose and install: https://affpapa.org/en/nevibecode/agents.md
