{
  "servers": [
    {
      "id": "hero",
      "name": "HERO",
      "description": "Projekte, Kunden, Angebote, Rechnungen, Termine, Zeiten und Field-Service aus HERO direkt im Chat. Lesen und Anlegen — kein Bearbeiten, kein Löschen.",
      "mcpUrl": "https://hero-mcp.ksqsebastian.workers.dev/mcp",
      "auth": "oauth",
      "status": "aktiv",
      "reachable": true,
      "toolCount": 34,
      "tools": [
        {
          "name": "dashboard",
          "description": "Geschäftsüberblick in EINEM Aufruf: offene Posten (Summe + Liste), Termine der nächsten 7 Tage, offene und zugewiesene Aufträge. Ideal als Einstieg ('was ist heute los?'). stichtag optional 'YYYY-MM-DD' (Default: heute).",
          "readOnly": true
        },
        {
          "name": "search",
          "description": "Universalsuche über Kontakte, Projekte, Dokumente und Aufträge in EINEM Request. Erster Griff, wenn nur ein Name, eine Nummer oder ein Stichwort bekannt ist.",
          "readOnly": true
        },
        {
          "name": "get_project",
          "description": "Projektakte: Stufe, Kunde, Adresse, Dokumente und Dateien. Akzeptiert Projektnummer ('PRJ-153') oder project_match_id.",
          "readOnly": true
        },
        {
          "name": "list_customers",
          "description": "Kontakte suchen oder auflisten (Name, Firma, E-Mail, Telefon, Adresse).",
          "readOnly": true
        },
        {
          "name": "get_customer",
          "description": "Ein Kontakt mit allen Adressen und seinen Projekten.",
          "readOnly": true
        },
        {
          "name": "list_documents",
          "description": "Dokumente eines Projekts (Angebote, Rechnungen, …) mit Status und Wert. only_active=true blendet gelöschte aus.",
          "readOnly": true
        },
        {
          "name": "list_articles",
          "description": "Artikelstamm mit Preisen. Liefert product_id (String!), Nummer, Name, EK (base_price), VK (list_price) und den Lagerbestand, falls der Artikel Lagermaterial ist.",
          "readOnly": true
        },
        {
          "name": "get_stock",
          "description": "Lagerbestand eines Artikels, gelesen über den Artikel. product_id ist ein String (HERO nutzt hier keine Zahl) — aus list_articles übernehmen.",
          "readOnly": true
        },
        {
          "name": "list_jobs",
          "description": "Field-Service-Aufträge (Wartung, Reparatur, Notdienst). status akzeptiert offen/zugewiesen/erledigt (verifiziert) oder einen status_code als Zahl; andere Namen werden gegen die tatsächlichen Statuswerte des Mandanten aufgelöst.",
          "readOnly": true
        },
        {
          "name": "get_checklists",
          "description": "Checklisten eines Auftrags inklusive der vor Ort in der Mobile-App ausgefüllten Antworten (Feld 'data').",
          "readOnly": true
        },
        {
          "name": "list_calendar",
          "description": "Termine im Zeitraum. start/end als ISO MIT Offset ('2026-07-20T00:00:00+02:00'); ohne Offset antwortet HERO mit einem Serverfehler.",
          "readOnly": true
        },
        {
          "name": "list_time",
          "description": "Erfasste Arbeitszeiten eines Projekts (Datum, Dauer, Kommentar, Mitarbeiter). start/end als 'YYYY-MM-DD'. Dauer steht in duration_in_seconds.",
          "readOnly": true
        },
        {
          "name": "list_open_invoices",
          "description": "Debitoren-Offene-Posten: wer schuldet was und hängt wie weit hinterher. Restbetrag wird aus Rechnungswert minus erfassten Zahlungen gerechnet.",
          "readOnly": true
        },
        {
          "name": "get_payment_status",
          "description": "Zahlungsstatus einer Rechnung: offen oder bezahlt, Restbetrag, Fälligkeit und die erfassten Zahlungen. Das ist der Rücklesepfad für record_payment.",
          "readOnly": true
        },
        {
          "name": "list_receipts",
          "description": "Eingangsbelege inklusive Zahlungsstand. offen = Wert minus paid_sum. Hinweis: Belege lassen sich über die HERO-API nur lesen, nicht anlegen.",
          "readOnly": true
        },
        {
          "name": "download_document",
          "description": "Vorsignierter, zeitbegrenzter PDF-Link eines Dokuments — der Empfänger braucht keinen Token. Existiert kein PDF, ist das Dokument noch Entwurf oder im Publishing (~5–8 s).",
          "readOnly": true
        },
        {
          "name": "download_file",
          "description": "Vorsignierter, zeitbegrenzter Link für eine beliebige Datei per uuid.",
          "readOnly": true
        },
        {
          "name": "create_customer",
          "description": "Kontakt mit Adresse anlegen. Wird über die Stammdaten dedupliziert — ein bereits vorhandener Kontakt wird zurückgegeben statt doppelt angelegt. Liefert id UND address_id; die address_id braucht create_project zwingend.",
          "readOnly": false
        },
        {
          "name": "create_project",
          "description": "Projekt auf einen Kunden anlegen. Startet immer auf der ersten Stufe — eine beim Anlegen mitgegebene Stufe ignoriert HERO. Projekte sind bei HERO NICHT löschbar.",
          "readOnly": false
        },
        {
          "name": "create_offer",
          "description": "Angebot über den Document-Builder anlegen. Der Empfänger wird frisch aus HERO gelesen. ⚠ Ein veröffentlichtes Angebot verschiebt das Projekt automatisch auf die Stufe 'Angebot verschickt'. Höchstens EIN Titel: ab zwei Titeln zeigt HEROs PDF je Titel 0,00 €.",
          "readOnly": false
        },
        {
          "name": "create_invoice_from_offer",
          "description": "Rechnung mit exakt den Positionen des Angebots — centgenau, inklusive Referenz auf das Angebot. Positionen werden aus dem veröffentlichten Angebotsentwurf übernommen, nicht neu getippt.",
          "readOnly": false
        },
        {
          "name": "create_document",
          "description": "Beliebiges Dokument anlegen: rechnung, angebot, gutschrift, auftragsbestaetigung, lieferschein, allgemein, rechnung_13b — oder jeder Dokumenttyp-Name dieses Mandanten. Abschlags- und Schlussrechnungen sind 'rechnung' mit passenden (auch negativen) Positionen.",
          "readOnly": false
        },
        {
          "name": "create_timesheet",
          "description": "Stundenzettel als PDF aus den bereits erfassten Zeiten eines Projekts. Baut ein Dokument vom Typ 'allgemein' mit je einer Position pro Zeiteintrag (Menge = Stunden). date_from/date_to als 'YYYY-MM-DD'.",
          "readOnly": false
        },
        {
          "name": "create_job",
          "description": "Field-Service-Auftrag (Wartung, Reparatur, Notdienst) anlegen. job_type ist eine geschlossene Liste — HERO speichert jeden anderen Wert still als 'unknown', deshalb wird hier vorher geprüft. start/end als ISO MIT Offset. Aufträge sind nicht löschbar.",
          "readOnly": false
        },
        {
          "name": "create_checklist",
          "description": "Checkliste an einen Auftrag ODER ein Projekt hängen (genau eins von beiden). Die Punkte sind die Struktur — abgehakt wird in der Mobile-App, nicht über die API. Eine falsche Form leert HERO beim Anlegen still, deshalb wird das Ergebnis zurückgelesen und geprüft.",
          "readOnly": false
        },
        {
          "name": "create_article",
          "description": "Artikel in den Stamm aufnehmen. Setzt sales_prices UND default_sales_price — ohne die kalkuliert HERO jedes Angebot mit dem EINKAUFSpreis, und Angebote gehen zum Selbstkostenpreis raus. Das ist die teuerste Falle der HERO-API und hier eingebaut.",
          "readOnly": false
        },
        {
          "name": "schedule_appointment",
          "description": "Termin am Projekt anlegen. start/end als ISO MIT Offset — ohne Offset antwortet HERO mit einem Serverfehler. category ist der Name einer Terminkategorie dieses Mandanten.",
          "readOnly": false
        },
        {
          "name": "add_task",
          "description": "Aufgabe an ein Projekt hängen. HERO hat kein create_task — update_task ohne id legt an (Upsert). due als ISO mit Offset.",
          "readOnly": false
        },
        {
          "name": "log_time",
          "description": "Arbeitszeit auf ein Projekt buchen. Wie bei Aufgaben legt update_ ohne id an. start/end als ISO MIT Offset. Die Dauer rechnet HERO selbst (duration_in_seconds).",
          "readOnly": false
        },
        {
          "name": "add_logbook_note",
          "description": "Logbucheintrag / Kommentar am Projekt. Erscheint als 'Kommentar von <Nutzer>'.",
          "readOnly": false
        },
        {
          "name": "record_payment",
          "description": "Zahlung auf eine Rechnung erfassen und anschließend zurücklesen, damit klar ist, ob sie wirklich verbucht wurde. date als 'YYYY-MM-DD'.",
          "readOnly": false
        },
        {
          "name": "create_lead",
          "description": "Externen Lead über die Lead API einliefern. Erzeugt Kunde UND Projekt. ⚠ Nicht idempotent: der Kunde wird dedupliziert, das Projekt NICHT — zweimal aufrufen heißt zwei Projekte, und Projekte sind bei HERO nicht löschbar.",
          "readOnly": false
        },
        {
          "name": "upload_file",
          "description": "Datei nach HERO hochladen und optional an ein Projekt hängen. Inhalt entweder als url (wird geladen) oder als content_base64. Liefert die file_upload_uuid, die alle Datei-Konsumenten von HERO brauchen. ⚠ HERO kennt nur einen Upload-Weg (die Lead API), der dabei zwangsläufig ein Eingangs-Projekt anlegt; dieses Projekt ist nicht löschbar.",
          "readOnly": false
        },
        {
          "name": "attach_pdf",
          "description": "Ein fremdes PDF als eigenständiges Dokument an ein Projekt hängen (nicht über den Document-Builder erzeugt, sondern hochgeladen). Inhalt als url oder content_base64.",
          "readOnly": false
        }
      ]
    },
    {
      "id": "lexware",
      "name": "Lexware Office",
      "description": "Kontakte, Rechnungen, Angebote, Mahnungen, Buchungsbelege und Auswertungen aus Lexware Office. Lesen und Anlegen — kein Ändern, kein Löschen.",
      "mcpUrl": "https://lexware-mcp.ksqsebastian.workers.dev/mcp",
      "auth": "oauth",
      "status": "aktiv",
      "reachable": true,
      "toolCount": 17,
      "tools": [
        {
          "name": "profile",
          "description": "Firmenprofil des verbundenen Lexware-Office-Accounts: Firmenname, Steuernummern, Kleinunternehmer-Status, angemeldeter Nutzer. Guter erster Aufruf, um zu sehen, mit welchem Mandanten man spricht.",
          "readOnly": true
        },
        {
          "name": "search_contacts",
          "description": "Kontakte suchen oder auflisten. Filter lassen sich kombinieren; ohne Filter kommen die ersten Kontakte. customer/vendor grenzen auf Kunden bzw. Lieferanten ein.",
          "readOnly": true
        },
        {
          "name": "get_contact",
          "description": "Ein Kontakt mit allen Adressen, Rollen und Bankdaten. Das Feld version braucht man, falls der Kontakt später geändert werden soll (Lexware sperrt optimistisch).",
          "readOnly": true
        },
        {
          "name": "list_vouchers",
          "description": "Der Arbeitspferd-Aufruf für alles Kaufmännische: listet Rechnungen, Angebote, Auftragsbestätigungen, Gutschriften, Lieferscheine und Mahnungen als Übersichtszeilen. Rechnungen haben KEINE eigene Listen-Route — sie laufen über diesen Aufruf. Ohne voucher_status wird ein sinnvoller Default gewählt (bei Rechnungen open,paid — Entwürfe und Stornos zählen nicht als Umsatz).",
          "readOnly": true
        },
        {
          "name": "get_document",
          "description": "Ein Beleg mit allen Positionen, Steuerangaben und Beträgen. Nur hier stehen Netto-Beträge — die Übersichtszeilen aus list_vouchers haben nur Bruttowerte.",
          "readOnly": true
        },
        {
          "name": "download_document",
          "description": "Erzeugt einen zeitlich begrenzten Download-Link auf das PDF eines Belegs. Lexware selbst kennt keine öffentlichen Links, deshalb liefert dieser Server die Datei über einen eigenen, nicht erratbaren Link aus. Funktioniert nur bei finalisierten Belegen — Entwürfe haben kein PDF.",
          "readOnly": true
        },
        {
          "name": "list_articles",
          "description": "Artikel- und Leistungsstamm mit Preisen und Einheiten.",
          "readOnly": true
        },
        {
          "name": "get_payments",
          "description": "Zahlungsinformationen zu einer Rechnung oder einem Beleg: offener Betrag, Zahlungsstatus und erfasste Zahlungen.",
          "readOnly": true
        },
        {
          "name": "open_items",
          "description": "Debitoren-Offene-Posten: welche Rechnungen sind noch nicht bezahlt, wer hängt wie weit hinterher. Rechnet aus der Belegliste und sortiert nach Überfälligkeit. Hinweis: Rechnungen mit überschrittener Fälligkeit meldet Lexware als 'overdue' — sie zählen hier als offen.",
          "readOnly": true
        },
        {
          "name": "revenue",
          "description": "Umsatz über einen Zeitraum, aus der Belegliste gerechnet. basis='gestellt' zählt alle gestellten Rechnungen (open,paid — periodengerecht), basis='bezahlt' nur die bezahlten (Zufluss). Entwürfe und Stornos zählen nie mit. Die Beträge sind BRUTTO — die Belegliste führt keine Nettowerte; für Netto die Belege einzeln über get_document holen.",
          "readOnly": true
        },
        {
          "name": "reference_data",
          "description": "Nachschlagelisten von Lexware: Buchungskategorien (für create_voucher nötig), Zahlungsbedingungen, Länder, Drucklayouts und wiederkehrende Rechnungen.",
          "readOnly": true
        },
        {
          "name": "create_contact",
          "description": "Kontakt anlegen — entweder als Firma (company_name) oder als Person (last_name). Mindestens eine Rolle ist Pflicht: Kunde und/oder Lieferant. Lexware dedupliziert NICHT: derselbe Aufruf zweimal erzeugt zwei Kontakte.",
          "readOnly": false
        },
        {
          "name": "create_article",
          "description": "Artikel oder Leistung in den Stamm aufnehmen. leading_price bestimmt, ob der Netto- oder der Bruttopreis führend ist; den jeweils anderen rechnet Lexware aus.",
          "readOnly": false
        },
        {
          "name": "create_document",
          "description": "Rechnung, Angebot, Auftragsbestätigung, Gutschrift oder Lieferschein anlegen. ⚠ finalize=true macht den Beleg verbindlich, vergibt die Belegnummer und erzeugt das PDF — das lässt sich nicht zurücknehmen. Ohne finalize entsteht ein Entwurf, den man in Lexware Office noch bearbeiten kann; ein Entwurf hat aber kein PDF.",
          "readOnly": false
        },
        {
          "name": "create_dunning",
          "description": "Mahnung zu einer bestehenden Rechnung anlegen. Die Rechnung ist Pflicht — eine Mahnung ohne Bezugsrechnung lehnt Lexware ab. Hinweis: Lexware meldet für Mahnungen auch bei finalize=true den Status 'draft' zurück, erzeugt das PDF aber trotzdem sofort.",
          "readOnly": false
        },
        {
          "name": "create_voucher",
          "description": "Buchungsbeleg (z. B. Eingangsrechnung) für die Buchhaltung anlegen. Jede Position braucht eine categoryId aus reference_data(kind='posting-categories') — ohne die lehnt Lexware ab.",
          "readOnly": false
        },
        {
          "name": "upload_file",
          "description": "Datei nach Lexware hochladen (z. B. einen Beleg als PDF oder Foto) und optional direkt an einen Buchungsbeleg hängen. Inhalt entweder als url (wird geladen) oder als content_base64.",
          "readOnly": false
        }
      ]
    },
    {
      "id": "tarifcheck",
      "name": "Tarifcheck",
      "description": "Die Tarifverträge der Gruppenwerk-Gewerke — Bau, Gerüstbau, Maler, Tischler. Täglich automatisch abgeglichen, jede Fassung archiviert. Nur lesend.",
      "mcpUrl": "https://tarifcheck.ksqsebastian.workers.dev/mcp",
      "auth": "oauth",
      "status": "aktiv",
      "reachable": true,
      "toolCount": 6,
      "tools": [
        {
          "name": "gewerke_auflisten",
          "description": "Listet alle Gewerke mit Anzahl der Dokumente und dem Datum der letzten Prüfung. Guter erster Aufruf, um zu sehen, was überhaupt da ist.",
          "readOnly": true
        },
        {
          "name": "dokumente_auflisten",
          "description": "Listet die Tarifverträge, wahlweise für ein Gewerk. Liefert Titel, Stand, Gültigkeitsdatum und die Vorbehalte, die zu jedem Dokument gehören.",
          "readOnly": true
        },
        {
          "name": "dokument_lesen",
          "description": "Liefert den Volltext eines Tarifvertrags als Markdown. Die id kommt aus dokumente_auflisten oder tarife_durchsuchen.",
          "readOnly": true
        },
        {
          "name": "was_ist_neu",
          "description": "Änderungen an den Tarifverträgen seit einem Zeitpunkt — neue Fassungen, geänderte Downloadseiten, Uploads. Das ist das Werkzeug für Fragen wie 'was ist neu bei den Tischlern'.",
          "readOnly": true
        },
        {
          "name": "tarife_durchsuchen",
          "description": "Volltextsuche über alle Tarifverträge. Gibt Fundstellen mit Kontext zurück. Für gezielte Fragen ('Urlaubsgeld', 'Wegezeit') besser als dokument_lesen.",
          "readOnly": true
        },
        {
          "name": "versionen_auflisten",
          "description": "Alle je erfassten Fassungen eines Dokuments. Mit der version_id lässt sich über dokument_lesen eine ältere Fassung öffnen.",
          "readOnly": true
        }
      ]
    }
  ]
}