Skip to main content
Glama

nkfix-mcp

Ein MCP-Server für NebenkostenFix. Mit ihm kann ein KI-Assistent wie Claude Code, Claude Desktop oder ein lokales Modell mit dem Datenbestand deiner NebenkostenFix-Instanz arbeiten:

  • Fragen beantworten: „Welche Rechnungen fehlen 2025 noch?“, „Welche Fristen laufen bald ab?“, „Wer ist mit den Vorauszahlungen im Rückstand?“

  • Abrechnungen vorprüfen, bevor du sie in NebenkostenFix erstellst

  • Rechnungen samt Beleg, Zählerstände und Zahlungen erfassen. Den Beleg liest der Assistent selbst, du bestätigst, der Server legt an.

Der Server ist ein eigener Prozess. Er spricht die JSON-API von NebenkostenFix über HTTP an und läuft auf deinem Rechner, neben Claude.

nkfix-mcp ist ein eigenständiges Projekt, nicht Teil von NebenkostenFix und nicht vom Maintainer von NebenkostenFix. Fehler und Wünsche zu diesem Server gehören in die Issues dieses Repos.

WARNING

Datenschutz: Alles, was der Assistent liest, geht an dessen Anbieter. NebenkostenFix hält deine Daten bei dir. Sobald ein Cloud-Assistent wie Claude über diesen Server Mieter, Zahlungen oder Abrechnungen liest, landen diese Daten beim Anbieter des Assistenten. Das betrifft personenbezogene Daten deiner Mieter. Prüfe, ob das für dich in Ordnung ist (DSGVO, Auftragsverarbeitung). Mit einem lokalen Modell bleiben die Daten auf deinem Rechner, siehe Mit einem lokalen Modell.

Was der Server kann und was nicht

Bereich

Werkzeuge

Verbindung

check_connection

Lesen

list_properties, list_apartments, list_heating_systems, list_tenants, get_advance_payment_status, list_cost_categories, list_providers, list_invoices, list_invoice_documents, list_meters, list_payments, list_deadlines, get_data_quality, get_billing_year_status, list_billing_suggestions, list_statements, get_statement

Prüfen (ohne Speichern)

precheck_statement, check_meter_reading, check_hausgeld

Erfassen (nur anlegen)

record_payment, record_meter_reading, record_invoice (optional mit Beleg), upload_invoice_document

Nie: ändern, löschen, Abrechnungen erstellen oder festsetzen, Zähler anlegen, Export, Sicherung, Konten. Korrekturen machst du in NebenkostenFix. Mit einem Zugriffsschlüssel verweigert NebenkostenFix das ohnehin.

Rückfragen beim Erfassen: Gibt es Bedenken, etwa dieselbe Zahlung schon, einen Zählerstand unter dem vorigen oder eine Rechnung mit derselben Nummer, legt der Server nichts an, sondern fragt nach.

  • Claude Code zeigt dir die Frage direkt.

  • Andere Clients geben sie an den Assistenten weiter, und der muss dich fragen. Sagst du Ja, speichert er mit einem Freigabecode aus der Rückfrage. Der gilt nur für genau diese Werte und Bedenken; ändert sich etwas, fragt der Server erneut.

  • Claude Code fragt außerdem bei jedem Erfassen nach einer Freigabe, auch wenn du die Werkzeuge allgemein erlaubt hast. Im Auto-Modus entfällt diese Freigabe; die Rückfrage bei Bedenken kommt dort trotzdem. Abschalten lässt sich die Freigabe mit NKF_NO_RECORD_PROMPT=1.

Related MCP server: manager-mcp

Voraussetzungen

  • Eine NebenkostenFix-Instanz mit Anmeldung, empfohlen ab 0.19.0. Docker, NAS oder python app.py. Die Windows-App mit eigenem Fenster geht nicht, sie lässt keine fremden Programme an ihre API.

  • Zugang auf einem von zwei Wegen:

    • Zugriffsschlüssel (empfohlen). Den gibt es in NebenkostenFix seit Version 0.19.0.

    • Benutzername und Passwort. Geht auch mit älteren Versionen, das Passwort steht dann aber in der Konfiguration. Geprüft ist der Server gegen 0.19.0; bei einer älteren Instanz warnt check_connection.

  • uv zum Installieren. Python 3.11 holt uv bei Bedarf selbst.

Installation

uv tool install git+https://github.com/ChriRas/nkfix-mcp@v0.1.0

Danach liegt der Befehl nkfix-mcp in ~/.local/bin. Den vollen Pfad zeigt:

which nkfix-mcp

Zugriffsschlüssel anlegen

In NebenkostenFix unter Einstellungen → Konto → „Zugriffsschlüssel (API-Key)“:

  • Lesen: Der Assistent kann lesen und prüfen. Die Erfassen-Werkzeuge bekommt er gar nicht erst zu sehen.

  • Lesen und erfassen: Zusätzlich kann er Rechnungen, Belege, Zählerstände und Zahlungen anlegen.

Der Schlüssel wird genau einmal angezeigt. Kopier ihn direkt in die Konfiguration. Ein gelöschter Schlüssel gilt sofort nicht mehr.

Konfiguration

Variable

Bedeutung

NKF_URL

Adresse der Instanz, z. B. http://127.0.0.1:6060 oder https://nkf.example.org (Pflicht)

NKF_API_KEY

Zugriffsschlüssel nkf_… (empfohlen)

NKF_USERNAME, NKF_PASSWORD

Anmeldung per Sitzung, für Versionen vor 0.19.0 oder ohne Schlüssel

NKF_RECEIPT_DIR

Wenn gesetzt, lädt der Server nur Belege aus diesem Ordner hoch (empfohlen)

NKF_NO_RECORD_PROMPT

1 schaltet die Nachfrage von Claude Code bei jedem Erfassen ab

Hinweise:

  • Ohne NKF_RECEIPT_DIR kann der Assistent jede Datei als Beleg hochladen, deren Pfad er kennt. Hochgeladen wird nur, was am Inhalt als PDF, JPEG, PNG, WebP oder HEIC erkannt wird.

  • Liegt die Instanz nicht auf deinem Rechner, nutze https. Sonst gehen Schlüssel und Daten im Klartext durchs Netz. check_connection warnt dann.

  • Zugangsdaten in der URL (https://user:pass@…) lehnt der Server ab.

Einrichten in Claude Code

claude mcp add nkfix -e NKF_URL=http://127.0.0.1:6060 -e NKF_API_KEY=nkf_DEIN_SCHLUESSEL -e NKF_RECEIPT_DIR=$HOME/Belege -- nkfix-mcp
  • Ohne --scope gilt der Eintrag nur für das aktuelle Projekt und landet in ~/.claude.json, also nicht im Repo. Der Schlüssel steht dort im Klartext.

  • Für alle Projekte: --scope user.

  • Für eine .mcp.json im Projekt (Vorlage: .mcp.json.example) trägst du den Schlüssel nicht ein, sondern verweist mit ${NKF_API_KEY} auf eine Umgebungsvariable. Ist sie beim Start von Claude nicht gesetzt, meldet der Server das, statt den Platzhalter als Schlüssel zu schicken.

Danach in Claude Code /mcp aufrufen. Der Server sollte als verbunden erscheinen. Ein erster Test: „Prüf die Verbindung zu NebenkostenFix.“

Claude Code zeigt die Werkzeuge mit deutschem Titel an, z. B. „Rechnung erfassen“ statt record_invoice.

Werkzeuge ohne Nachfrage erlaubst du über /permissions mit der Regel mcp__nkfix__*. Die Erfassen-Werkzeuge fragen trotzdem jedes Mal nach. Im Auto-Modus entfällt diese Freigabe (getestet mit Claude Code 2.1.312); die Rückfrage bei Bedenken kommt auch dort.

Prompts und Resources in Claude Code

Drei fertige Abläufe startest du als Befehl. Argumente stehen durch Leerzeichen getrennt dahinter, jedes ist ein einzelnes Wort. Fehlt eins, fragt der Assistent nach.

Befehl

Was er tut

/mcp__nkfix__prepare_year_end 1 2025

Jahresabschluss vorbereiten: geht Rechnungen, Zählerstände, Abrechnung oder Vorprüfung je Mieter und Fristen durch und sagt, was fehlt und was auffällt. Ändert nichts.

/mcp__nkfix__check_hausgeld_statement

Prüft eine angehängte Hausgeld-Einzelabrechnung der WEG und fragt danach, was erfasst werden soll.

/mcp__nkfix__record_receipt ~/Belege/wasser-2025.pdf

Liest einen Beleg, prüft auf Dubletten und erfasst die Rechnung nach deiner Zustimmung. Nur mit einem Schlüssel, der erfassen darf.

Daten hängst du mit @ an deine Nachricht:

  • @nkfix:nkfix://overview: Immobilien mit ihren Mietern (samt IDs), Abrechnungen, die noch offen oder nicht zugestellt sind, und die Fristen der nächsten 90 Tage

  • @nkfix:nkfix://deadlines: alle anstehenden Fristen

  • @nkfix:nkfix://statements/1: eine Abrechnung mit Positionen, Ergebnis, Zahlungsstand, Zustellung und Fristen

  • @nkfix:nkfix://properties/1/years/2025: der Stand eines Abrechnungsjahres einer Immobilie, mit Kostenarten, Ablesungen zum Stichtag, Mietern und offenen Punkten

Die 1 ist die Nummer der Abrechnung bzw. der Immobilie. Alles wird bei jedem Anhängen frisch aus NebenkostenFix gelesen. Schreib die volle Form: Auf @nkfix allein passen auch Claude-Sitzungen mit ähnlichem Namen. Wählst du „Abrechnung“ oder „Jahresstand“ in der @-Auswahl aus, schlägt Claude Code die Nummern der Abrechnungen bzw. Immobilien vor, dazu das laufende Jahr und die zwei davor. Beim freien Tippen gibt es keine Vorschläge. Offene Abrechnungen und alle Immobilien zeigt dann @nkfix:nkfix://overview, alle Abrechnungen das Werkzeug list_statements.

Einrichten in Claude Desktop

Die Konfigurationsdatei liegt

  • unter macOS in ~/Library/Application Support/Claude/claude_desktop_config.json,

  • unter Windows in %APPDATA%\Claude\claude_desktop_config.json.

{
  "mcpServers": {
    "nkfix": {
      "command": "/Users/DEINNAME/.local/bin/nkfix-mcp",
      "env": {
        "NKF_URL": "http://127.0.0.1:6060",
        "NKF_API_KEY": "nkf_DEIN_SCHLUESSEL",
        "NKF_RECEIPT_DIR": "/Users/DEINNAME/Belege"
      }
    }
  }
}

Trag bei command den vollen Pfad aus which nkfix-mcp ein. Claude Desktop kennt den PATH deiner Shell nicht. Danach Claude Desktop neu starten.

Claude Desktop zeigt Rückfragen des Servers derzeit vermutlich nicht direkt an. Dann kommt die Rückfrage als Antwort zurück, und der Assistent muss dich fragen.

Mit einem lokalen Modell

So bleiben die Daten auf deinem Rechner. Ein erprobter Weg ist Ollama mit dem Client ollmcp. Er fragt vor jedem Werkzeugaufruf nach deiner Freigabe.

uv tool install ollmcp
ollmcp mcp add --env NKF_URL=http://127.0.0.1:6060 --env NKF_API_KEY=nkf_DEIN_SCHLUESSEL nkfix -- nkfix-mcp
ollmcp

Nimm ein Modell, das Werkzeuge aufrufen kann. Kleine Modelle verwechseln gern IDs. Für den Anfang reicht ein Lese-Schlüssel. LM Studio kann ab Version 0.3.17 ebenfalls MCP-Server einbinden (mcp.json mit mcpServers, gleiches Format wie oben).

Stand der Angaben: Oktober 2026. Die Clients ändern sich schnell, prüf im Zweifel deren Doku.

Grenzen

  • Die API von NebenkostenFix ist für die eigene Oberfläche gebaut und hat keine Stabilitätszusage. Dieser Server übersetzt sie in eigene Werkzeuge, und Vertragstests fangen Änderungen ab. Nach einem Update von NebenkostenFix kann trotzdem ein Update dieses Servers nötig sein.

  • NebenkostenFix hat keine Texterkennung. Den Inhalt eines Belegs liest der Assistent selbst, Fehler sind möglich. Prüf die Werte, bevor du zustimmst.

  • Arbeiten Mensch und Assistent gleichzeitig am selben Eintrag, gewinnt der letzte. Der Server legt nur an und ändert nichts, das hält das Risiko klein.

Entwicklung

git clone https://github.com/ChriRas/nkfix-mcp.git
cd nkfix-mcp
uv venv --python 3.11
uv pip install -e . -r requirements-dev.txt
.venv/bin/python -m pytest
.venv/bin/ruff check .
.venv/bin/ruff format --check .
.venv/bin/mypy

Einmal pre-commit install, dann laufen ruff und mypy vor jedem Commit. Ein Hook lehnt Commit-Messages mit Co-Authored-By: oder „Generated with Claude Code“ ab. Die CI (.github/workflows/ci.yml) prüft dasselbe, lässt die Einheitstests laufen und die Vertragstests gegen ein festes Release von NebenkostenFix.

.venv/bin/pre-commit install

Nach einem Pull, der das Paket verschiebt oder umbenennt, einmal neu installieren (uv pip install -e .). Aus einem lokalen Checkout installierst du den Befehl mit uv tool install ..

Vertragstests gegen eine echte Instanz:

  • Sie starten NebenkostenFix aus einem Checkout ab 0.19.0 mit frischem Datenordner auf einem freien Port.

  • Sie legen die Beispielimmobilie und zwei Zugriffsschlüssel an. Es sind nur Fantasiedaten im Spiel.

  • Ohne NKF_SOURCE werden sie übersprungen.

NKF_SOURCE=/pfad/zu/NebenkostenFix NKF_PYTHON=/pfad/zu/NebenkostenFix/.venv/bin/python .venv/bin/python -m pytest

requirements.txt hält alle Versionen fest (erzeugt mit uv pip compile --universal pyproject.toml -o requirements.txt --python-version 3.11).

Lizenz

GPL-3.0-or-later, wie NebenkostenFix. Siehe LICENSE.

Available Tools

25 tools
check_connectionVerbindung prüfenA
Read-only

Prüft die Verbindung zu NebenkostenFix: angemeldetes Konto, Zugriffsschlüssel und dessen Umfang (lesen oder erfassen), Version der Instanz und Warnungen. Liest nur.

Inputs: no named parameters. Returns: url, account, api_key, version, +3 more

check_hausgeldHausgeld prüfenA
Read-only

Prüft eine Hausgeld-Einzelabrechnung einer Eigentumswohnung: welche Positionen auf den Mieter umlagefähig sind (BetrKV), ob der eigene Anteil richtig berechnet ist und ob die Summe stimmt. Speichert nichts.

Inputs: line_items (required), own_shares (required), total_shares (required), statement_total. Returns: notes, sum_check, line_items, owner_count, +5 more

check_meter_readingZählerstand prüfenA
Read-only

Prüft, ob ein Zählerstand zu den bisherigen Ablesungen passt. NebenkostenFix vergleicht nur mit einer Ablesung, die höchstens 30 Tage entfernt ist (beim Hauptzähler mit der Summe der Unterzähler); ohne sie ist checked=false. Speichert nichts.

Inputs: value (required), meter_id (required), reading_date (required). Returns: status, checked, message, reference_date, +2 more

get_advance_payment_statusVorauszahlungen (Soll/Ist)B
Read-only

Soll und Ist der Nebenkostenvorauszahlungen eines Mieters je Monat, mit offenem Betrag und Saldo.

Inputs: tenant_id (required), year. Returns: months, balance, overpaid, outstanding

get_billing_year_statusJahresabrechnung (Stand)A
Read-only

Stand des Jahresabschlusses einer Immobilie: Kosten je Kostenart im Abrechnungsjahr (zeitanteilig) mit Vorjahr, fehlende Ablesungen, Mieter mit ihren Abrechnungen, offene Punkte (open_issues) und die Abrechnungsfrist.

Inputs: year (required), property_id (required). Returns: object

get_data_qualityDatenqualitätA
Read-only

Prüft den Datenbestand einer Immobilie: veraltete Zählerstände und fehlende Zähler.

Inputs: property_id (required). Returns: meters, warnings

get_statementAbrechnung im DetailC
Read-only

Ergebnis einer Abrechnung: Kosten je Position mit Anteil des Mieters, Vorauszahlungen, Saldo, Anpassung der Vorauszahlung und Fristen.

Inputs: statement_id (required). Returns: id, tenant, balance, version, +16 more

list_apartmentsWohnungenC
Read-only

Die Wohnungen bzw. Einheiten einer Immobilie mit Fläche und Nutzungsart.

Inputs: property_id (required). Returns: note, count, items, omitted

list_billing_suggestionsAbrechnungsvorschlägeC
Read-only

Mieter, für die eine Nebenkostenabrechnung fällig ist, mit vorgeschlagenem Zeitraum.

Inputs: no named parameters. Returns: note, count, items, omitted

list_cost_categoriesKostenartenA
Read-only

Kostenarten (Betriebskostenarten nach BetrKV) mit Umlageschlüssel. Die ID braucht man zum Erfassen von Rechnungen.

Inputs: no named parameters. Returns: note, count, items, omitted

list_deadlinesFristenA
Read-only

Anstehende Termine und Fristen: Abrechnungs-, Einwendungs- und Eichfristen, Ablesungen, neue Vorauszahlungen und die früheste Mieterhöhung. Abrechnungs- und Einwendungsfristen nennen die Abrechnung (statement_id) und ihren Abrechnungszeitraum.

Inputs: until. Returns: note, count, items, omitted

list_heating_systemsHeizungsanlagenB
Read-only

Die Heizungsanlagen einer Immobilie (für Heizkostenrechnungen nach HeizkostenV).

Inputs: property_id (required). Returns: note, count, items, omitted

list_invoice_documentsSammelbelegeB
Read-only

Hochgeladene Belege, die mehrere Rechnungen enthalten können (Sammelbelege).

Inputs: property_id. Returns: note, count, items, omitted

list_invoicesRechnungenA
Read-only

Rechnungen (Kosten) mit Betrag, Zeitraum, Kostenart und ob ein Beleg hinterlegt ist. Eine Rechnung zählt zu einem Jahr, wenn sich ihr Zeitraum mit dem Jahr überschneidet.

Inputs: year, property_id, cost_category_id. Returns: note, count, items, total, +1 more

list_metersZähler und StändeA
Read-only

Die Zähler einer Immobilie mit ihrem neuesten Stand; mit meter_id die letzten Stände dieses Zählers.

Inputs: property_id (required), meter_id. Returns: note, count, items, omitted

list_paymentsZahlungenB
Read-only

Eingegangene Zahlungen von Mietern (Miete, Vorauszahlungen, Kaution, Nachzahlungen), neueste zuerst.

Inputs: year, tenant_id, payment_type. Returns: note, count, items, total, +1 more

list_propertiesImmobilienA
Read-only

Alle Immobilien (Häuser bzw. Objekte) mit ID und Name. Ausgangspunkt für fast alle anderen Werkzeuge.

Inputs: no named parameters. Returns: note, count, items, omitted

list_providersDienstleisterC
Read-only

Dienstleister bzw. Versorger (Rechnungssteller), die in NebenkostenFix angelegt sind.

Inputs: no named parameters. Returns: note, count, items, omitted

list_statementsAbrechnungenB
Read-only

Erstellte Nebenkostenabrechnungen mit Zeitraum, Zustellung und offenem Betrag.

Inputs: tenant_id, property_id. Returns: note, count, items, omitted

list_tenantsMieterC
Read-only

Mieter mit Wohnung, Ein- und Auszug und dem Datum, bis zu dem zuletzt abgerechnet wurde.

Inputs: property_id, current_only. Returns: note, count, items, omitted

precheck_statementAbrechnung vorprüfenA
Read-only

Prüft, ob sich eine Nebenkostenabrechnung für den Mieter und Zeitraum erstellen lässt: fehlende Rechnungen und Zählerstände, Überschneidung mit bestehenden Abrechnungen, Abrechnungsfrist. Ein Ende in der Zukunft kürzt NebenkostenFix auf heute. Erstellt keine Abrechnung und ändert nichts.

Inputs: end_date (required), tenant_id (required), start_date (required), cost_category_ids. Returns: checks, blocked, overall, checked_until

record_invoiceRechnung erfassenA

Legt in NebenkostenFix eine Rechnung (Kosten einer Immobilie) an, auf Wunsch mit dem Beleg als Datei (schreibt, ändert nichts Bestehendes). Gibt es schon eine Rechnung mit derselben Nummer oder mit gleicher Kostenart, gleichem Betrag, Zeitraum und Wohnung, wird vorher nachgefragt. Den Inhalt eines Belegs liest du selbst; NebenkostenFix hat keine Texterkennung.

Inputs: amount (required), end_date (required), start_date (required), property_id (required), +16 more. Returns: id, note, saved, concerns, +1 more

record_meter_readingZählerstand erfassenA

Legt in NebenkostenFix einen abgelesenen Zählerstand an (schreibt, ändert nichts Bestehendes). Vorher wird geprüft, ob er zu den bisherigen Ständen passt; bei Bedenken wird nachgefragt. Zähler selbst legt nur der Mensch an: gibt es keinen passenden Zähler, sag das, statt etwas anderes zu erfassen.

Inputs: value (required), meter_id (required), reading_date (required), approval_code, +2 more. Returns: id, note, saved, concerns, +1 more

record_paymentZahlung erfassenA

Legt in NebenkostenFix eine eingegangene Zahlung eines Mieters an (schreibt, ändert nichts Bestehendes). Gibt es dieselbe Zahlung schon, wird vorher nachgefragt. Eine Nachzahlung gehört an ihre Abrechnung (statement_id); fehlt sie oder weicht der Betrag vom offenen Betrag ab, wird nachgefragt.

Inputs: amount (required), tenant_id (required), payment_date (required), payment_type (required), +2 more. Returns: id, note, saved, concerns, +1 more

upload_invoice_documentSammelbeleg hochladenA

Lädt einen Beleg mit mehreren Rechnungen (z. B. Jahresabrechnung der Stadtwerke) zu einer Immobilie hoch (schreibt, ändert nichts Bestehendes). Danach legst du jede Rechnung darauf mit record_invoice und invoice_document_id an.

Inputs: property_id (required), receipt_path (required), description, approval_code. Returns: id, note, saved, concerns, +1 more

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3.3/5.0

    Scored across 25 tools

    Disambiguation4/5

    Most tools target a distinct resource (properties, apartments, tenants, invoices, meters, statements) or a clearly differentiated action (check vs record vs upload). The diagnostic tools overlap somewhat: get_data_quality, get_billing_year_status and precheck_statement all report missing readings/invoices and deadlines for a property, so an agent may hesitate between them. Descriptions provide enough cues (precheck is tenant+period bound, year status is per property-year) to keep them separable.

    Naming Consistency5/5

    Every tool is snake_case with a clear verb_noun pattern: list_*, get_*, check_*, record_*, upload_*, precheck_statement. The verbs are used consistently by intent (read vs validate vs write), and there are no mixed camelCase or vague standalone names.

    Tool Count3/5

    25 tools is at the heavy end for a single billing domain, and the read surface is dense: 14 list_* plus three overlapping diagnostic endpoints. The domain is genuinely broad (properties, tenants, costs, meters, statements, deadlines), but a few tools could be merged without losing capability.

    Completeness3/5

    The write surface is deliberately append-only (record_payment, record_meter_reading, record_invoice, upload_invoice_document) and read coverage is strong, but there is a notable dead end: statements can be listed, inspected and prechecked but never created, and no tool exists to add tenants, properties, cost categories or to correct/update existing records. Many workflows therefore require manual human action mid-stream.

    Maintenance

    ActivityMaintained
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      B
      quality
      B
      maintenance
      Enables AI assistants to query and manage self-hosted accounting data—invoices, balances, and books—through natural language, with read-only tools by default and optional scoped write operations.
      30
      24 PyPI
      1
      AGPL 3.0
    • A
      license
      Not graded
      quality
      B
      maintenance
      Enables AI agents to read and draft accounting documents such as invoices, vouchers, contacts, and articles via the Lexware Office API, including PDF rendering and receipt uploads. Supports OAuth and static token authentication for secure access.
      MIT
    • A
      license
      A
      quality
      B
      maintenance
      Enables AI assistants to interact with the nula.bg accounting platform — invoices, purchases with OCR, customers, inventory, and bank feeds — through an API key, with read-only mode by default.
      13
      35 npm
      MIT