nkfix-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@nkfix-mcp Welche Rechnungen fehlen 2025 noch und welche Fristen laufen bald ab?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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.
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 |
|
Lesen |
|
Prüfen (ohne Speichern) |
|
Erfassen (nur anlegen) |
|
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.0Danach liegt der Befehl nkfix-mcp in ~/.local/bin. Den vollen Pfad zeigt:
which nkfix-mcpZugriffsschlü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 |
| Adresse der Instanz, z. B. |
| Zugriffsschlüssel |
| Anmeldung per Sitzung, für Versionen vor 0.19.0 oder ohne Schlüssel |
| Wenn gesetzt, lädt der Server nur Belege aus diesem Ordner hoch (empfohlen) |
|
|
Hinweise:
Ohne
NKF_RECEIPT_DIRkann 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_connectionwarnt 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-mcpOhne
--scopegilt 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.jsonim 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 |
| 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. |
| Prüft eine angehängte Hausgeld-Einzelabrechnung der WEG und fragt danach, was erfasst werden soll. |
| 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 ollmcpollmcp mcp add --env NKF_URL=http://127.0.0.1:6060 --env NKF_API_KEY=nkf_DEIN_SCHLUESSEL nkfix -- nkfix-mcpollmcpNimm 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.gitcd nkfix-mcpuv venv --python 3.11uv pip install -e . -r requirements-dev.txt.venv/bin/python -m pytest.venv/bin/ruff check ..venv/bin/ruff format --check ..venv/bin/mypyEinmal 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 installNach 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_SOURCEwerden sie übersprungen.
NKF_SOURCE=/pfad/zu/NebenkostenFix NKF_PYTHON=/pfad/zu/NebenkostenFix/.venv/bin/python .venv/bin/python -m pytestrequirements.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 toolscheck_connectionVerbindung prüfenARead-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üfenARead-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üfenARead-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)BRead-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)ARead-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ätARead-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 DetailCRead-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_apartmentsWohnungenCRead-only
Die Wohnungen bzw. Einheiten einer Immobilie mit Fläche und Nutzungsart.
Inputs: property_id (required). Returns: note, count, items, omitted
list_billing_suggestionsAbrechnungsvorschlägeCRead-only
Mieter, für die eine Nebenkostenabrechnung fällig ist, mit vorgeschlagenem Zeitraum.
Inputs: no named parameters. Returns: note, count, items, omitted
list_cost_categoriesKostenartenARead-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_deadlinesFristenARead-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_systemsHeizungsanlagenBRead-only
Die Heizungsanlagen einer Immobilie (für Heizkostenrechnungen nach HeizkostenV).
Inputs: property_id (required). Returns: note, count, items, omitted
list_invoice_documentsSammelbelegeBRead-only
Hochgeladene Belege, die mehrere Rechnungen enthalten können (Sammelbelege).
Inputs: property_id. Returns: note, count, items, omitted
list_invoicesRechnungenARead-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ändeARead-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_paymentsZahlungenBRead-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_propertiesImmobilienARead-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_providersDienstleisterCRead-only
Dienstleister bzw. Versorger (Rechnungssteller), die in NebenkostenFix angelegt sind.
Inputs: no named parameters. Returns: note, count, items, omitted
list_statementsAbrechnungenBRead-only
Erstellte Nebenkostenabrechnungen mit Zeitraum, Zustellung und offenem Betrag.
Inputs: tenant_id, property_id. Returns: note, count, items, omitted
list_tenantsMieterCRead-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üfenARead-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
Scored across 25 tools
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.
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.
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.
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
Related MCP Connectors
Ask your AI about your Airbnb and VRBO listings, bookings, guest messages and reviews. Read-only.
DATEV financial data for AI assistants: P&L, KPIs, bookings, budgets and monthly reporting.
Accounts receivable automation for Xero and QuickBooks Online, inside your AI assistant. Ask Claude, ChatGPT or any MCP client for a receivables summary, find customers and invoices, read the email and SMS replies your customers sent, and see what Paidnice sent or skipped. Ask why a reminder, late fee or statement did or did not go out, and update a customer's contact people straight into your ledger. Secure OAuth sign-in. One connection covers every organisation you tick, with Read or Read and Write access.
Read-only AI access to HAVN properties, leads, tasks, files, media, and analytics.
Related MCP Servers
- FlicenseAqualityDmaintenanceConnects AI assistants to the Lanten property management API, allowing them to manage tenants, units, and work orders using natural language.1511 npm-
- AlicenseBqualityBmaintenanceEnables 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.3024 PyPI1AGPL 3.0
- AlicenseNot gradedqualityBmaintenanceEnables 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
- AlicenseAqualityBmaintenanceEnables 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.1335 npmMIT