elster-mcp-server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| ELSTER_ZIP | No | ZIP code. | |
| ELSTER_CITY | No | City. | |
| ELSTER_NAME | No | Last name. | |
| ELSTER_STREET | No | Street. | |
| ELSTER_COUNTRY | No | Country. | |
| ELSTER_HEADLESS | No | Set to 'false' to run the browser in headed mode for debugging. Default is 'true'. | true |
| ELSTER_PASSWORD | No | Password for the ELSTER certificate. | |
| ELSTER_PFX_PATH | No | Path to the ELSTER certificate file (.pfx). | |
| ELSTER_FIRST_NAME | No | First name. | |
| ELSTER_STATE_CODE | No | Two-digit Bundesland-Code for your Finanzamt. | |
| ELSTER_TAX_NUMBER | No | Your Steuernummer (tax number). | |
| ELSTER_CONFIG_PATH | No | Path to the config.json file. If not provided, the server looks for config.json in its working directory. | |
| ELSTER_DOWNLOAD_DIR | No | Directory for downloads. | |
| ELSTER_EST_SKIP_EUR | No | Set to 'true' to skip the EÜR step in ESt. Default is 'false'. | false |
| ELSTER_HOUSE_NUMBER | No | House number. | |
| ELSTER_SCREENSHOT_DIR | No | Directory for screenshots. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| elster_login_testA | Verifies that the configured certificate + password can log into the ELSTER portal. Returns success and final URL or an error. Use this once before submitting anything. |
| elster_config_showA | Shows the currently loaded ELSTER configuration (with secrets redacted) so you can verify env vars / config.json were picked up. |
| elster_kennziffern_listA | Returns the list of supported UStVA Kennziffern (codes 81, 86, 66 etc.) with descriptions and whether they are NET (base amount) or TAX (tax amount). |
| elster_ustva_generate_xmlA | Generates an ELSTER UStVA XML snapshot for archiving. Does NOT submit (submission goes via elster_ustva_start). Useful for audit trails. |
| elster_ustva_detect_reverse_chargeC | Tests whether a voucher would be detected as Reverse-Charge (§13b UStG) based on the configured supplier patterns. Returns matched supplier and region (EU / NON_EU), or null. |
| elster_ustva_startA | Starts a UStVA submission session. Opens a browser, logs in, fills the form, runs Prüfung, then PAUSES at AWAITING_CONFIRM. You must explicitly call elster_ustva_confirm to send. Returns a sessionId — poll status via elster_session_status. |
| elster_ustva_confirmA | Confirms submission of a UStVA session that is in AWAITING_CONFIRM state. Triggers the final "Absenden" click. Returns the transmission ticket on success. |
| elster_eur_startA | Starts an EÜR (Anlage Einnahmen-Überschuss-Rechnung) form-prep session. Fills the form up to Prüfung, then tries to "Speichern und Verlassen" so the draft survives in ELSTER. NEVER submits. |
| elster_est_startA | Starts an ESt 1 A (Einkommensteuererklärung) form-prep session. Opens the form, fills taxpayer basics from config + any extra fields you provide (by ELSTER input id/name hint), runs Prüfung, then waits 30 min for you to review in the portal. NEVER submits. |
| elster_datenuebernahme_listA | Lists the earlier submissions ELSTER offers to carry over ("Datenübernahme") for a given form and tax year, without starting a filling session. Read-only. Feed an aufgabeId or year from the result into the "takeover" argument of elster_ustva_start / elster_eur_start / elster_est_start. |
| elster_session_statusB | Returns the current status, progress log, and any screenshot path for a session started via elster_ustva_start / elster_eur_start / elster_est_start. |
| elster_session_listA | Lists all currently tracked sessions (USTVA / EUR / EST / SYNC) with their status. |
| elster_session_cancelC | Cancels a running session (closes the browser, marks status as CANCELLED). |
| elster_edaten_fetchA | Retrieves the pre-filled tax data ("vorausgefüllte Steuererklärung" / eDaten) the tax authority already holds for a year: Lohnsteuerbescheinigung, Vorsorgeaufwendungen, Lohnersatzleistungen, Riester/Rürup. ELSTER only exposes these from inside the ESt form, so this walks the form up to the import step and reads the values back. The form is left without saving, so no draft is kept (ELSTER may offer it for recovery at the next login). Nothing is ever transmitted. |
| elster_submissions_listA | Lists everything under "Meine Formulare" → "Übermittelte Formulare": what was filed, when, its Ordnungskriterium, plus the aufgabeId to reuse it as a Datenübernahme source and the nachrichtId needed by elster_submission_protocol. Read-only. |
| elster_submission_protocolA | Reads the "Übertragungsprotokoll" of already-submitted returns — every field that was actually filed, with its Zeile number, label, value and ELSTER field id — so earlier years can be used as context. Select either by nachrichtId (from elster_submissions_list) or by formFilter/years. Read-only; returns real personal tax data. |
| elster_sync_historyC | Reads "Übermittelte Formulare" (transmission history) from ELSTER. Optionally downloads PDFs. |
| elster_sync_inboxC | Reads ELSTER inbox messages ("Posteingang"). Optionally downloads each message as PDF. |
| elster_drafts_listA | Lists saved drafts ("Meine Formulare → Entwürfe") with their aufgabeId, newest first. Uses the persistent engine session (logs in on first use, then stays logged in). |
| elster_form_openA | Opens a saved draft in the engine session and returns its Startseite (fields, repeat groups, navigation RIDs). Without aufgabeId the newest draft is opened. If ELSTER still holds the form open from an earlier call, it is re-entered instead of failing. Only one form can be open at a time. |
| elster_form_newA | Starts a NEW form: picks the year, handles Datenübernahme (none by default), Anlagenauswahl and the eDaten import, and stops on the form's Startseite. Returns the page like elster_form_page. Follow with elster_form_save to persist it as a draft. |
| elster_form_pageA | Reads a page of the open form. With rid, jumps there first (RIDs look like "FormData://est-2025-v1/Startseite[0]/MAVSAnlageN[0]/VAnlageN[0]/HomeofficePauschale[0]" and come from the nav list of any page). Returns plain fields (name, kennzahl, label, value, options), repeat groups (committed rows, the template fields for a new row, sub-page RIDs), non-navigation commands, validation errors and the nav RIDs visible from this page. Read-only. |
| elster_form_setA | Sets plain fields on a page and saves them to the server-side form. Keys are a Kennzahl ("E0204507") or the field name ("eruNWkHomeofficeE0204507"); a key must match exactly one field on the page. Checkboxes take true/false, radios and selects take the option value. Money: fields labelled "(Euro)" accept whole euros only (no decimal separator — round expenses up, income down); "(Euro, Cent)" fields take "3,36". Validation errors come back in |
| elster_form_add_rowA | Adds one row to an inline repeat group ("Mzb", e.g. Arbeitsmittel "AufwendungenArbeitsmittel") by filling its new-row template and committing it ("Eintrag übernehmen"). Group names and template keys come from elster_form_page → groups. Same key and money rules as elster_form_set. |
| elster_form_delete_rowC | Deletes row |
| elster_form_pressB | Escape hatch: presses a button by id or posts a raw reqCmd JSON from elster_form_page → commands (e.g. EditDetachedMzbSemIndex to add an Anlage for a person, FillInProfile, AddMzbItem). Sending, deleting drafts and logging out are refused. |
| elster_form_crawlA | Walks every page below a RID (breadth-first, read-only) and returns each page's fields and repeat groups. Use it once per form/Anlage to learn which Kennzahl lives on which page. |
| elster_form_checkA | Runs ELSTER's "Prüfen" on the open form. Returns ok, the headline (for ESt it includes the provisional "Erstattung/Nachzahlung"), and the error panel with the causing pages. Never sends. |
| elster_form_reviewA | Final check before the user submits: runs "Prüfen" and, only if it is clean, reads ELSTER's "Formular absenden" overview — exactly the data that would be transmitted, including eDaten fields — as sections of rows (Zeile, label, value, Kennzahl, source). Returns to edit mode in the same call. Never transmits: "Absenden" stays refused, and no command but EINGABE/PRUEFEN is accepted while on the overview. |
| elster_belege_listA | Lists receipts in "Meine Belege" (id, label, year, Belegart, recognised values, status). Read-only. |
| elster_beleg_uploadA | Uploads one receipt file (PDF, PNG or JPG, max 10 MB) to "Meine Belege" and tags it with a Belegart and its values, so it is linked to the matching form line. Belegart is a path like "N/Arbeitsmittel" (fields Art_der_Arbeitsmittel, Betrag), "N/Weitere_Wk/Sonst" (Bezeichnung, Betrag), "N/Fortb" (Bezeichnung, Betrag), "N/Dienstreise". Betrag as number or "12,99". Stores a document in the account; submits nothing. Receipts are optional for the ESt (Belegvorhaltepflicht) but can avoid queries. |
| elster_form_saveA | Saves the open form as a draft ("Speichern und Formular verlassen") and closes it. Reopen with elster_form_open. The server session times out after ~30 min idle and unsaved work is then only in ELSTER's auto-recovery — save before long pauses. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 32 tools
Most tools target clearly distinct actions (form_set vs form_add_row vs form_delete_row, ustva_start vs est_start vs eur_start), but several have overlapping read purposes: elster_sync_history and elster_submissions_list both read the same 'Übermittelte Formulare' area, elster_form_check is a subset of elster_form_review, and elster_form_crawl overlaps elster_form_page. Descriptions are detailed enough to mitigate most misselection, but the duplication is real.
Names consistently use snake_case with an elster_ prefix and a domain segment (form_, ustva_, session_, sync_), making the pattern predictable. Minor deviations: singular vs plural of the same noun (beleg_upload / belege_list, submission_protocol / submissions_list).
32 tools is on the heavy side even for a genuinely complex domain spanning ESt/EÜR/UStVA forms, browser sessions, receipts, drafts, and sync. Several tools look consolidatable (session_list vs session_status, submissions_list vs sync_history, check vs review), pushing it past a comfortably scoped surface.
Coverage is broad: login/config checks, form lifecycle (open/new/page/set/add/delete/save/check/review), UStVA-specific helpers, receipts list/upload, eDaten fetch, drafts, and submission history/protocol. Gaps are minor and partly by design (submission deliberately limited to UStVA; no receipt deletion/update, no explicit logout).