Endpoints: 28,729MCP servers: 18,413Payout addresses: 2,071Paid calls: 1,548Letters: 14Defects: 1,324counted 1 min ago
teppi

Server definition

Hash
sha256:70c2bbfb9591d6e59bd1e06d79917b8aa445c087c2d93f3a28c8a583a52fa5b8
What it is
What a remote MCP server returned when asked what it offers: 31 tools

The blob, as servednamed by its sha256

{ "instructions": "Meistron ist die Auftrags- und Rechnungssoftware dieses Handwerksbetriebs. Dieser Zugang liefert per Werkzeug die Live-Daten des Betriebs — Aufträge, Termine, Rechnungen, Angebote, Material und Bestand, Zeiten — und daneben die gepflegte Hilfe als Resources. Fragen zu diesen Daten immer über ein Werkzeug beantworten, nie aus der Hilfe und nie aus allgemeinem Wissen. Welche Werkzeuge bereitstehen, sagt tools/list; es hängt davon ab, was dieser Betrieb freigegeben hat. Was dort nicht steht, kann dieser Zugang nicht — dann das sagen, statt einen Werkzeugnamen zu raten. Wenn `beleg_pdf`, `auftragsnachweis_pdf` oder `bestandsliste_pdf` angeboten wird, kann der Assistent die jeweilige PDF lesen. Der Dokumentbereich ist ab Werk aus; bei einer Absage nie um einen Token-Link bitten und nie eine Ersatzfassung erfinden. Kunden lassen sich mit `kunden_suchen` finden. Das gibt Kennung, Kundennummer, Name und Ort heraus, bewusst aber KEINE Kontaktdaten. Vor `kunde_anlegen` immer erst suchen — sonst entstehen zwei Karteien zum selben Kunden, mit getrennter Rechnungshistorie. Den Empfänger einer Sendung löst der Server selbst aus dem Kundenstamm auf; eine Adresse muss nie erfragt werden. Manche Werkzeuge schreiben; was an Endkunden hinausgeht, verlangt im Standardmodus eine ausdrückliche Bestätigung. Nur wenn der Inhaber für genau diesen Zugang in Meistron Vollautonomie aktiviert hat, entfällt diese einzelne Rückfrage serverseitig. Nur für Fragen zur Bedienung gilt: aus den Hilfe-Quellen antworten, nicht aus allgemeinem Wissen über Handwerkersoftware, und sagen, wenn es dort nicht steht.", "tools": [ { "description": "Legt einen ANGEBOTS-Entwurf an. Ein Angebot ist noch keine Rechnung: Es fordert kein Geld und wird nicht gebucht. Verschickt NICHTS an den Kunden.\n\nWird ein Auftrag angegeben, übernimmt das Angebot dessen noch nicht abgerechnetes Material und erfasste Arbeitszeit als Positionen — sofern der Betrieb die Bereiche „Material\" und „Zeiterfassung\" für den KI-Zugang nicht abgeschaltet hat; die Antwort sagt, was übernommen wurde. Zusätzlich oder stattdessen können eigene Positionen angegeben werden.\n\nBetreff und Belegkopf kommen ebenfalls aus dem Auftrag: Ohne Angabe wird der Auftragstitel zum Betreff, und Auftragsnummer, Objekt und Leistungstag/-zeitraum werden übernommen wie mit dem Knopf „Aus Auftrag & Projekt übernehmen\" — gedruckt werden nur die Kopffelder, die der Betrieb unter Rechnungen → Einstellungen gewählt hat; die Kundennummer kommt aus dem Kundenstamm. Ist am Auftrag ein Nettopreis hinterlegt, nennt die Antwort die Abweichung der Positionen dazu.\n\nDie Umwandlung eines Angebots in eine Rechnung geschieht in Meistron und ist über diesen Zugang NICHT möglich.", "inputSchema": { "additionalProperties": false, "properties": { "auftrag_id": { "description": "Auftrag, dessen Material und Arbeitszeit übernommen werden sollen — und aus dem Betreff und Belegkopf gefüllt werden.", "type": "string" }, "belegkopf": { "additionalProperties": false, "description": "Angaben rechts oben im Belegkopf. Ohne Angabe werden Auftragsnummer, Objekt und Leistungszeitraum aus dem Auftrag übernommen (siehe `belegkopf_aus_auftrag`); jede Angabe hier gewinnt je Feld. Gedruckt wird NUR, was der Betrieb unter Rechnungen → Einstellungen „Angaben im Belegkopf\" gewählt hat — die Antwort sagt, welche Angaben deshalb nicht auf dem Beleg stehen. Die Kundennummer lässt sich hier nicht setzen; sie kommt aus dem Kundenstamm.", "properties": { "auftragsnummer": { "description": "Auftragsnummer(n) auf dem Beleg, mehrere durch Komma. Vorgabe: die des Auftrags.", "maxLength": 60, "type": "string" }, "kundenreferenz": { "description": "Bestell- oder Vorgangsnummer des Kunden („Ihre Nr.\"), z. B. PO-4711.", "maxLength": 60, "type": "string" }, "leistung_bis": { "description": "Ende des Leistungszeitraums, JJJJ-MM-TT.", "type": "string" }, "leistung_modus": { "description": "`tag` druckt einen Leistungstag (`leistung_von`), `zeitraum` eine Spanne (`leistung_von` bis `leistung_bis`), `keine` druckt nichts. Ohne Angabe ergibt sich der Modus aus den Daten bzw. aus dem Termin des Auftrags.", "enum": [ "keine", "tag", "zeitraum" ], "type": "string" }, "leistung_von": { "description": "Leistungstag oder Beginn, JJJJ-MM-TT.", "type": "string" }, "leistungsempfaenger": { "description": "Wer die Leistung erhalten hat, wenn nicht der Rechnungsempfänger — etwa der Mieter.", "maxLength": 200, "type": "string" }, "objektadresse": { "description": "Bezeichnung des Objekts, z. B. „Wohnanlage Süd, Haus 3\". Vorgabe: Projektname, sonst Ort des Auftrags.", "maxLength": 200, "type": "string" }, "objektnummer": { "description": "Objekt- oder Projektnummer. Vorgabe: die Nummer des Projekts am Auftrag.", "maxLength": 60, "type": "string" } }, "type": "object" }, "belegkopf_aus_auftrag": { "description": "Vorgabe true: übernimmt Auftragsnummer, Objektnummer, Objektadresse und Leistungstag/-zeitraum aus dem Auftrag — wie der Knopf „Aus Auftrag & Projekt übernehmen\" in Meistron. Auf false setzen, wenn der Belegkopf ausschließlich aus `belegkopf` kommen soll.", "type": "boolean" }, "betreff": { "description": "Betreff des Angebots, eine Zeile unter der Belegnummer (z. B. „Heizungswartung Reihenhaus\"). Ohne Angabe wird der Titel des Auftrags übernommen.", "maxLength": 120, "type": "string" }, "hinweis": { "description": "Text für den Kunden auf dem Angebot.", "type": "string" }, "idempotency_key": { "description": "Im vollautonomen Betrieb erforderlich. Beim ersten Aufruf weglassen: Der Server liefert dann einen UUID-Key, ohne die Aktion auszuführen. Den Aufruf mit diesem Key wiederholen und bei Retry/Reconnect denselben Key verwenden. Eine neue beabsichtigte Aktion braucht einen neuen Key.", "format": "uuid", "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89aAbB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$", "type": "string" }, "kunde_id": { "description": "Die Kennung des Kunden. Ohne Angabe wird der Kunde des Auftrags übernommen.", "type": "string" }, "ohne_material": { "description": "Nur Stunden übernehmen, kein Material.", "type": "boolean" }, "ohne_zeiten": { "description": "Nur Material übernehmen, keine Stunden.", "type": "boolean" }, "positionen": { "description": "Eigene Positionen. Höchstens 50.", "items": { "additionalProperties": false, "properties": { "beschreibung": { "type": "string" }, "einheit": { "type": "string" }, "einzelpreis": { "description": "Netto, ohne Steuer.", "type": "number" }, "menge": { "type": "number" } }, "required": [ "beschreibung", "menge", "einzelpreis" ], "type": "object" }, "type": "array" }, "steuersatz": { "description": "Steuersatz für den GESAMTEN Beleg in Prozent — 19, 7 oder 0. Ohne Angabe der im Betrieb hinterlegte Satz. Ein Beleg trägt genau EINEN Satz, im Kopf wie in jeder Position; gemischte Sätze lehnt Meistron beim Finalisieren ab. Wer beides braucht, legt zwei Belege an.", "type": "number" } }, "type": "object" }, "name": "angebot_anlegen", "outputSchema": null }, { "description": "Listet Angebote mit Nummer, Kunde, Betrag und Status. Zeigt auch, welche bereits in eine Rechnung umgewandelt wurden — und welche offen liegen.", "inputSchema": { "additionalProperties": false, "properties": { "anzahl": { "description": "Höchstens so viele (Vorgabe 25, Grenze 100).", "type": "number" }, "bis": { "description": "Spätestes Datum, JJJJ-MM-TT.", "type": "string" }, "nur_offen": { "description": "Nur noch nicht umgewandelte Angebote.", "type": "boolean" }, "von": { "description": "Frühestes Datum, JJJJ-MM-TT.", "type": "string" } }, "type": "object" }, "name": "angebote_suchen", "outputSchema": null }, { "description": "Listet Aufträge eines Zeitraums — etwa einer Woche — mit Titel, Termin, Status, Ort und Kunde. Ohne Zeitraum werden die nächsten anstehenden Termine gezeigt. Mit `suche` findet es einen Auftrag über Teil der Auftragsnummer oder des Titels — dann auch vergangene —, mit `kunde_id` die Aufträge eines Kunden. Die Kennung eines Treffers ist die Eingabe für `auftrag_ansehen` und `rechnung_anlegen`.", "inputSchema": { "additionalProperties": false, "properties": { "anzahl": { "description": "Höchstens so viele (Vorgabe 25, Grenze 100).", "type": "number" }, "bis": { "description": "Spätester Termin, JJJJ-MM-TT.", "type": "string" }, "kunde_id": { "description": "Nur Aufträge dieses Kunden — die Kennung aus `kunden_suchen`.", "type": "string" }, "nur_unterminiert": { "description": "Nur Aufträge ohne Termin — die, die noch eingeplant werden müssen.", "type": "boolean" }, "status": { "description": "Nur Aufträge in diesem Status.", "enum": [ "scheduled", "in_progress", "documented", "completed", "canceled" ], "type": "string" }, "suche": { "description": "Teil der Auftragsnummer oder des Titels, z. B. „0118\" oder „Heizung\". Ohne Zeitraum werden dann auch vergangene Aufträge gefunden, nicht nur anstehende.", "maxLength": 60, "type": "string" }, "von": { "description": "Frühester Termin, JJJJ-MM-TT.", "type": "string" } }, "type": "object" }, "name": "auftraege_suchen", "outputSchema": null }, { "description": "Ändert Titel, Beschreibung, Ort oder Termin eines bestehenden Auftrags. Nur die angegebenen Felder werden angefasst. Den Status setzt das Werkzeug nicht selbst — wie in der App stellt aber eine geänderte Beschreibung einen geplanten Auftrag auf „In Bearbeitung“, und zurück auf „geplant“ geht es danach nicht. Bei einer echten Terminverschiebung können die zugewiesenen Mitarbeiter eine Push-Meldung erhalten, wenn der Betrieb die Aussenwirkung erlaubt hat; dem Kunden wird nichts geschickt.", "inputSchema": { "additionalProperties": false, "properties": { "auftrag_id": { "description": "Die Kennung des Auftrags.", "type": "string" }, "beginnt": { "description": "Neuer Termin-Beginn, JJJJ-MM-TTTHH:MM.", "type": "string" }, "beschreibung": { "type": "string" }, "endet": { "description": "Neues Termin-Ende, JJJJ-MM-TTTHH:MM.", "type": "string" }, "idempotency_key": { "description": "Im vollautonomen Betrieb erforderlich. Beim ersten Aufruf weglassen: Der Server liefert dann einen UUID-Key, ohne die Aktion auszuführen. Den Aufruf mit diesem Key wiederholen und bei Retry/Reconnect denselben Key verwenden. Eine neue beabsichtigte Aktion braucht einen neuen Key.", "format": "uuid", "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89aAbB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$", "type": "string" }, "ort": { "type": "string" }, "titel": { "type": "string" } }, "required": [ "auftrag_id" ], "type": "object" }, "name": "auftrag_aendern", "outputSchema": null }, { "description": "Legt einen neuen Auftrag an — mit Titel, optional Beschreibung, Termin, Ort und Kunde. JEDER Auftrag braucht mindestens eine zuständige Person: ohne Angabe wird der Inhaber selbst zugewiesen. Ob die Zugewiesenen eine Benachrichtigung auf ihr Gerät bekommen, hängt davon ab, ob der Betrieb die Aussenwirkung freigegeben hat — in der Vorgabe ist sie AUS. Die Antwort sagt jedes Mal, was tatsächlich hinausging. Legt KEINE Rechnung an und schreibt dem Kunden nichts.", "inputSchema": { "additionalProperties": false, "properties": { "beginnt": { "description": "Termin-Beginn, JJJJ-MM-TTTHH:MM (Ortszeit).", "type": "string" }, "beschreibung": { "description": "Was zu tun ist.", "type": "string" }, "endet": { "description": "Termin-Ende, JJJJ-MM-TTTHH:MM. Nur zusammen mit `beginnt`.", "type": "string" }, "idempotency_key": { "description": "Im vollautonomen Betrieb erforderlich. Beim ersten Aufruf weglassen: Der Server liefert dann einen UUID-Key, ohne die Aktion auszuführen. Den Aufruf mit diesem Key wiederholen und bei Retry/Reconnect denselben Key verwenden. Eine neue beabsichtigte Aktion braucht einen neuen Key.", "format": "uuid", "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89aAbB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$", "type": "string" }, "kunde_id": { "description": "Kennung eines bestehenden Kunden.", "type": "string" }, "mitarbeiter": { "description": "Kennungen der zuständigen Personen (siehe mitarbeiter_auflisten). Ohne Angabe wird der Inhaber selbst zugewiesen.", "items": { "type": "string" }, "type": "array" }, "ort": { "description": "Einsatzort als Text.", "type": "string" }, "titel": { "description": "Kurzer Titel, worum es geht.", "type": "string" } }, "required": [ "titel" ], "type": "object" }, "name": "auftrag_anlegen", "outputSchema": null }, { "description": "Zeigt einen einzelnen Auftrag ausführlich: Beschreibung, Termin, Ort, Kunde, Projekt, Vor-Ort-Kontakt (nur der Name), zugewiesene Mitarbeiter, zugewiesenes Material mit Abrechnungsstand und noch nicht abgerechnete Stunden (sofern die Bereiche „Material\" bzw. „Zeiterfassung\" freigegeben sind), Zahl der Fotos, bei Storno den Grund — und die zugehörigen Rechnungen sowie den am Auftrag hinterlegten Nettopreis, sofern der Bereich „Rechnungen\" für den KI-Zugang freigegeben ist. Der übliche Blick, BEVOR aus dem Auftrag eine Rechnung entsteht: Material und Stunden zeigen, was `rechnung_anlegen` übernehmen würde.", "inputSchema": { "additionalProperties": false, "properties": { "auftrag_id": { "description": "Die Kennung des Auftrags.", "type": "string" } }, "required": [ "auftrag_id" ], "type": "object" }, "name": "auftrag_ansehen", "outputSchema": null }, { "description": "Liest den Auftragsnachweis eines dokumentierten oder abgeschlossenen Auftrags. Eine gespeicherte Fassung wird byte-genau geliefert; fehlt sie, entsteht die PDF live und ohne Ablage. Für geplante, laufende oder stornierte Aufträge gibt es keinen Nachweis. Die Datei kann Fotos und eine Unterschrift enthalten und ist deshalb zusätzlich am ausgeschalteten Bereich „Dokumente“ gebunden.", "inputSchema": { "additionalProperties": false, "properties": { "auftrag_id": { "description": "Die interne Kennung des Auftrags.", "type": "string" } }, "required": [ "auftrag_id" ], "type": "object" }, "name": "auftragsnachweis_pdf", "outputSchema": null }, { "description": "Liest die PDF einer Rechnung, Quittung oder eines Angebots. Ausgestellte Belege kommen ausschließlich als byte-genaues gespeichertes Original; der aktuelle Status wird nie in die Datei gestempelt. Entwürfe werden sichtbar als ENTWURF ohne Nummer live erzeugt und nie gespeichert. Ein ausgestellter Beleg ohne Original wird abgewiesen statt neu gerendert. Das PDF kann Anschrift, Bank- und Steuerangaben enthalten und ist deshalb zusätzlich am ausgeschalteten Bereich „Dokumente“ gebunden.", "inputSchema": { "additionalProperties": false, "properties": { "rechnung_id": { "description": "Interne Kennung aus `rechnungen_suchen` oder `angebote_suchen`.", "type": "string" } }, "required": [ "rechnung_id" ], "type": "object" }, "name": "beleg_pdf", "outputSchema": null }, { "description": "Erzeugt eine aktuelle Bestandsliste aller aktiven Katalogartikel mit Bestand, Mindestbestand, Lagerort und Verkaufspreis. Die PDF wird nur für diesen Aufruf live erstellt und nie gespeichert; sie ist zusätzlich am ausgeschalteten Bereich „Dokumente“ gebunden.", "inputSchema": { "additionalProperties": false, "properties": {}, "type": "object" }, "name": "bestandsliste_pdf", "outputSchema": null }, { "description": "Nennt die aktuellen Eckdaten: wie viele Aufträge offen und wie viele terminiert sind, wie viele Rechnungen unbezahlt und davon überfällig, und die Summe der offenen Posten — als RESTBETRAG, Teilzahlungen sind also bereits abgezogen. Guter erster Aufruf, um zu verstehen, worum es gerade geht.", "inputSchema": { "additionalProperties": false, "properties": {}, "type": "object" }, "name": "betrieb_ueberblick", "outputSchema": null }, { "description": "Fordert eine Datei vom Menschen an und gibt einen Link zurück, über den er sie in Meistron hochlädt. Für Preisdateien von Lieferanten (DATANORM), PDFs, Belege und Fotos.\n\nDie Anforderung selbst verarbeitet noch nichts. Nach dem späteren Upload wird eine DATANORM-Datei automatisch geprüft und als Importvorschau vorbereitet; Einkaufspreise oder Artikel werden dabei NICHT angewendet. Das Anwenden startet ein Mensch danach in Meistron. Belege werden nur abgelegt, Bilder können dem genannten Auftrag als Foto zugeordnet werden.\n\nEine Datei lässt sich NICHT durch den Chat schicken — auch nicht als Text oder Base64. Das ist keine Einschränkung, sondern Absicht: Bei einer Preisdatei mit zehntausenden Artikeln zählt jedes Zeichen, und ein durchgereichter Text verliert oder erfindet welche.\n\nDen Link dem Menschen zeigen. Er muss in Meistron angemeldet sein — ohne Anmeldung führt der Link nirgendwohin. Danach mit „datei_stand\" nachsehen, ob sie da ist.", "inputSchema": { "additionalProperties": false, "properties": { "gehoert_zu_auftrag": { "description": "Kennung des Auftrags, zu dem die Datei gehört. Der Vermerk am Auftrag wird gesetzt; eine Ansicht, die dort abgelegte Dateien anzeigt, gibt es zurzeit noch nicht — nur ein Bild (zweck=bild) erscheint sichtbar in den Fotos des Auftrags. Sag dem Nutzer nichts anderes zu.", "type": "string" }, "hinweis": { "description": "Was genau gebraucht wird — steht dem Menschen auf der Upload-Seite.", "type": "string" }, "idempotency_key": { "description": "Im vollautonomen Betrieb erforderlich. Beim ersten Aufruf weglassen: Der Server liefert dann einen UUID-Key, ohne die Aktion auszuführen. Den Aufruf mit diesem Key wiederholen und bei Retry/Reconnect denselben Key verwenden. Eine neue beabsichtigte Aktion braucht einen neuen Key.", "format": "uuid", "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89aAbB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$", "type": "string" }, "lieferant_id": { "description": "PFLICHT bei zweck=datanorm: von welchem Lieferanten die Preisdatei kommt. Ohne gültige Kennung wird keine Anforderung angelegt. „lieferanten_auflisten\" nennt die Kennungen.", "type": "string" }, "zweck": { "description": "datanorm = Preisdatei eines Lieferanten · dokument = PDF (Ausschreibung, Plan) · beleg = Eingangsrechnung oder Quittung · bild = Foto.", "enum": [ "datanorm", "dokument", "beleg", "bild" ], "type": "string" } }, "required": [ "zweck" ], "type": "object" }, "name": "datei_anfordern", "outputSchema": null }, { "description": "Zeigt, welche Dateien angefordert wurden und welche davon angekommen sind. Nach „datei_anfordern\" hiermit nachsehen, statt zu raten — und NICHT in kurzen Abständen wiederholt aufrufen: Der Mensch braucht einen Moment.", "inputSchema": { "additionalProperties": false, "properties": {}, "type": "object" }, "name": "datei_stand", "outputSchema": null }, { "description": "Ändert eine Firmen- oder Rechnungsvorgabe. Wirkt auf ALLE künftigen Rechnungen und Angebote, nicht auf bestehende.\n\nNICHT änderbar, auch nicht mit Freigabe: Bankverbindung, Steuernummer, USt-IdNr., Rechnungs- und Angebotsnummern samt Präfixen, Steuerberater-Anbindung. Ebenso wenig die Schalter, die die Arbeitsweise umstellen (Bestandsführung, E-Rechnung, öffentliche Buchung). Wer danach gefragt wird, verweist auf Meistron.\n\nVorher „einstellungen_ansehen\" aufrufen, um den heutigen Wert zu kennen.", "inputSchema": { "additionalProperties": false, "properties": { "feld": { "description": "Was geändert werden soll, z. B. default_payment_terms, default_hourly_rate, phone, closing_name. „einstellungen_ansehen\" nennt die möglichen Namen.", "type": "string" }, "idempotency_key": { "description": "Im vollautonomen Betrieb erforderlich. Beim ersten Aufruf weglassen: Der Server liefert dann einen UUID-Key, ohne die Aktion auszuführen. Den Aufruf mit diesem Key wiederholen und bei Retry/Reconnect denselben Key verwenden. Eine neue beabsichtigte Aktion braucht einen neuen Key.", "format": "uuid", "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89aAbB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$", "type": "string" }, "wert": { "description": "Der neue Wert. Bei Ja/Nein-Feldern true oder false.", "type": [ "string", "number", "boolean" ] } }, "required": [ "feld", "wert" ], "type": "object" }, "name": "einstellungen_aendern", "outputSchema": null }, { "description": "Zeigt die Firmendaten und die Vorgaben für Rechnungen und Angebote — Zahlungsziel, Steuersatz, Stundensatz, Textbausteine. Nützlich, um zu erklären, warum eine Rechnung aussieht, wie sie aussieht.\n\nBankverbindung, Steuernummern und Nummernkreise werden NICHT gezeigt.", "inputSchema": { "additionalProperties": false, "properties": {}, "type": "object" }, "name": "einstellungen_ansehen", "outputSchema": null }, { "description": "Legt einen neuen Kunden an. Name genügt; Firma und Anschrift sind optional. Die Kundennummer vergibt Meistron selbst; die Antwort nennt sie. Gibt es genau einen gleichnamigen Kunden, werden nur die zusätzlich angegebenen Firma-, Anschrift- oder Kontaktdaten an diesem Kunden ergänzt bzw. aktualisiert; es wird KEIN zweiter angelegt. Bei mehreren gleichnamigen Kunden erfolgt KEINE Änderung.\n\nE-Mail, Festnetz und Mobilnummer werden NUR gespeichert, wenn der Inhaber für genau diesen KI-Zugang „Vollzugriff und Vollautonomie\" bestätigt hat. Im normalen Modus bleiben diese Kontaktdaten gesperrt. Bei zusätzlich aktivem autonomen E-Mail-Kanal darf die so gespeicherte Adresse für den strikt gebundenen Rechnungsversand verwendet werden.", "inputSchema": { "additionalProperties": false, "properties": { "email": { "description": "E-Mail-Adresse des Kunden. Nur mit serverseitig aktiver Vollautonomie für diesen Zugang.", "maxLength": 254, "pattern": "^[^\\s@]+@[^\\s@]+\\.[^\\s@]{2,}$", "type": "string" }, "firma": { "description": "Firmenname, falls abweichend.", "type": "string" }, "idempotency_key": { "description": "Im vollautonomen Betrieb erforderlich. Beim ersten Aufruf weglassen: Der Server liefert dann einen UUID-Key, ohne die Aktion auszuführen. Den Aufruf mit diesem Key wiederholen und bei Retry/Reconnect denselben Key verwenden. Eine neue beabsichtigte Aktion braucht einen neuen Key.", "format": "uuid", "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89aAbB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$", "type": "string" }, "mobil": { "description": "Mobilnummer. Nur mit serverseitig aktiver Vollautonomie für diesen Zugang.", "maxLength": 30, "pattern": "^\\+?[0-9 ()/.-]{3,30}$", "type": "string" }, "name": { "description": "Name der Person oder des Betriebs.", "type": "string" }, "ort": { "type": "string" }, "plz": { "type": "string" }, "strasse": { "type": "string" }, "telefon": { "description": "Festnetznummer. Nur mit serverseitig aktiver Vollautonomie für diesen Zugang.", "maxLength": 30, "pattern": "^\\+?[0-9 ()/.-]{3,30}$", "type": "string" } }, "required": [ "name" ], "type": "object" }, "name": "kunde_anlegen", "outputSchema": null }, { "description": "Findet Kunden des Betriebs nach Name, Firma oder Ort und nennt ihre Kennung. Diese Kennung verlangen `rechnung_anlegen`, `angebot_anlegen` und `auftrag_anlegen`.\n\nZUERST SUCHEN, DANN ANLEGEN. Wer stattdessen `kunde_anlegen` benutzt, weil er den vorhandenen Eintrag nicht findet, erzeugt eine Dublette — zwei Karteien zum selben Kunden, mit getrennter Rechnungshistorie.\n\nGibt bewusst KEINE Kontaktdaten heraus: Kennung, Kundennummer, Name, Ort und ob eine E-Mail-Adresse hinterlegt ist. Zum Versenden braucht es die Adresse nicht — den Empfänger löst der Server selbst aus dem Kundenstamm auf.", "inputSchema": { "additionalProperties": false, "properties": { "anzahl": { "description": "Höchstens so viele (Vorgabe 25, Grenze 100).", "type": "number" }, "suche": { "description": "Teil des Namens, der Firma oder des Ortes. Ohne Angabe die zuletzt angelegten.", "type": "string" } }, "type": "object" }, "name": "kunden_suchen", "outputSchema": null }, { "description": "Nennt die hinterlegten Lieferanten und wann zuletzt Preise von ihnen eingelesen wurden (DATANORM). Beantwortet die Frage, ob die Einkaufspreise im Katalog noch aktuell sind.\n\nEin Preis-Import selbst geht NICHT über diesen Zugang — dafür braucht es eine Datei, die in Meistron hochgeladen wird.", "inputSchema": { "additionalProperties": false, "properties": {}, "type": "object" }, "name": "lieferanten_auflisten", "outputSchema": null }, { "description": "Zeigt einen Katalogartikel mit Preis, Bestand, Lagerort und den letzten Bestandsbewegungen — also woher der aktuelle Bestand kommt.", "inputSchema": { "additionalProperties": false, "properties": { "material_id": { "description": "Die Kennung des Artikels.", "type": "string" } }, "required": [ "material_id" ], "type": "object" }, "name": "material_ansehen", "outputSchema": null }, { "description": "Bucht eine Bestandsbewegung auf einem Katalogartikel: Zugang (Einkauf), Abgang (Entnahme ohne Auftrag) oder Inventur (Korrektur auf einen gezählten Ist-Bestand). Jede Buchung wird dauerhaft protokolliert und lässt sich NICHT löschen — ein Fehler wird durch eine Gegenbuchung berichtigt, nicht durch Rückgängigmachen. Für Material, das auf einen Auftrag geht, ist „material_zuweisen\" richtig: Das verbindet den Verbrauch mit dem Auftrag und macht ihn abrechenbar.", "inputSchema": { "additionalProperties": false, "properties": { "art": { "description": "zugang = Ware kommt herein · abgang = Ware geht ohne Auftrag heraus · inventur = der gezählte Ist-Bestand, NICHT die Differenz.", "enum": [ "zugang", "abgang", "inventur" ], "type": "string" }, "idempotency_key": { "description": "Im vollautonomen Betrieb erforderlich. Beim ersten Aufruf weglassen: Der Server liefert dann einen UUID-Key, ohne die Aktion auszuführen. Den Aufruf mit diesem Key wiederholen und bei Retry/Reconnect denselben Key verwenden. Eine neue beabsichtigte Aktion braucht einen neuen Key.", "format": "uuid", "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89aAbB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$", "type": "string" }, "material_id": { "description": "Die Kennung des Artikels.", "type": "string" }, "menge": { "description": "Bei Zugang und Abgang die bewegte Menge (immer positiv). Bei Inventur der gezählte Bestand — die Differenz errechnet das System selbst.", "type": "number" }, "notiz": { "description": "Grund der Buchung, z. B. Lieferschein-Nummer.", "type": "string" } }, "required": [ "material_id", "art", "menge" ], "type": "object" }, "name": "material_buchen", "outputSchema": null }, { "description": "Durchsucht den Materialkatalog nach Bezeichnung oder Artikelnummer und nennt Preis, Einheit und Lagerbestand. Mit `nur_knapp` die Artikel, die unter ihrem Mindestbestand liegen — der übliche Einstieg vor einer Bestellung.", "inputSchema": { "additionalProperties": false, "properties": { "anzahl": { "description": "Höchstens so viele (Vorgabe 25, Grenze 100).", "type": "number" }, "nur_knapp": { "description": "Nur Artikel unter dem hinterlegten Mindestbestand.", "type": "boolean" }, "nur_werkzeug": { "description": "Nur Werkzeuge statt Verbrauchsmaterial.", "type": "boolean" }, "suche": { "description": "Teil der Bezeichnung oder Artikelnummer.", "type": "string" } }, "type": "object" }, "name": "material_suchen", "outputSchema": null }, { "description": "Bucht Material oder Werkzeug auf einen Auftrag. Der Bestand wird sofort abgezogen und der Verbrauch dem Auftrag zugeordnet — dadurch kann er später in eine Rechnung übernommen werden. Reicht der Bestand nicht, wird abgelehnt statt ins Minus gebucht. Legt KEINE Rechnung an.", "inputSchema": { "additionalProperties": false, "properties": { "auftrag_id": { "description": "Die Kennung des Auftrags.", "type": "string" }, "idempotency_key": { "description": "Im vollautonomen Betrieb erforderlich. Beim ersten Aufruf weglassen: Der Server liefert dann einen UUID-Key, ohne die Aktion auszuführen. Den Aufruf mit diesem Key wiederholen und bei Retry/Reconnect denselben Key verwenden. Eine neue beabsichtigte Aktion braucht einen neuen Key.", "format": "uuid", "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89aAbB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$", "type": "string" }, "material_id": { "description": "Die Kennung des Artikels aus dem Katalog.", "type": "string" }, "menge": { "description": "Wie viel auf den Auftrag geht (positiv).", "type": "number" }, "notiz": { "description": "Optionaler Vermerk zur Zuweisung.", "type": "string" } }, "required": [ "auftrag_id", "material_id", "menge" ], "type": "object" }, "name": "material_zuweisen", "outputSchema": null }, { "description": "Nennt die Personen, denen ein Auftrag zugewiesen werden kann, mit Namen und Kennung. Vor dem Anlegen eines Auftrags aufrufen, wenn nicht klar ist, wer zuständig sein soll.", "inputSchema": { "additionalProperties": false, "properties": {}, "type": "object" }, "name": "mitarbeiter_auflisten", "outputSchema": null }, { "description": "Legt einen Rechnungs-ENTWURF an. Ein Entwurf hat noch KEINE Rechnungsnummer und ist in Meistron änderbar — die Nummer wird erst beim Versenden vergeben, damit der Nummernkreis lückenlos bleibt. Verschickt NICHTS an den Kunden.\n\nWird ein Auftrag angegeben, übernimmt der Entwurf dessen noch nicht abgerechnetes Material und erfasste Arbeitszeit als Positionen — das ist der übliche Weg, sofern der Betrieb die Bereiche „Material\" und „Zeiterfassung\" für den KI-Zugang nicht abgeschaltet hat; die Antwort sagt, was übernommen wurde. Zusätzlich oder stattdessen können eigene Positionen angegeben werden.\n\nBetreff und Belegkopf kommen ebenfalls aus dem Auftrag: Ohne Angabe wird der Auftragstitel zum Betreff, und Auftragsnummer, Objekt und Leistungstag/-zeitraum werden übernommen wie mit dem Knopf „Aus Auftrag & Projekt übernehmen\" — gedruckt werden nur die Kopffelder, die der Betrieb unter Rechnungen → Einstellungen gewählt hat; die Kundennummer kommt aus dem Kundenstamm. Ist am Auftrag ein Nettopreis hinterlegt, nennt die Antwort, um wie viel die Positionen darunter oder darüber liegen.", "inputSchema": { "additionalProperties": false, "properties": { "auftrag_id": { "description": "Auftrag, dessen Material und Arbeitszeit übernommen werden sollen — und aus dem Betreff und Belegkopf gefüllt werden.", "type": "string" }, "belegkopf": { "additionalProperties": false, "description": "Angaben rechts oben im Belegkopf. Ohne Angabe werden Auftragsnummer, Objekt und Leistungszeitraum aus dem Auftrag übernommen (siehe `belegkopf_aus_auftrag`); jede Angabe hier gewinnt je Feld. Gedruckt wird NUR, was der Betrieb unter Rechnungen → Einstellungen „Angaben im Belegkopf\" gewählt hat — die Antwort sagt, welche Angaben deshalb nicht auf dem Beleg stehen. Die Kundennummer lässt sich hier nicht setzen; sie kommt aus dem Kundenstamm.", "properties": { "auftragsnummer": { "description": "Auftragsnummer(n) auf dem Beleg, mehrere durch Komma. Vorgabe: die des Auftrags.", "maxLength": 60, "type": "string" }, "kundenreferenz": { "description": "Bestell- oder Vorgangsnummer des Kunden („Ihre Nr.\"), z. B. PO-4711.", "maxLength": 60, "type": "string" }, "leistung_bis": { "description": "Ende des Leistungszeitraums, JJJJ-MM-TT.", "type": "string" }, "leistung_modus": { "description": "`tag` druckt einen Leistungstag (`leistung_von`), `zeitraum` eine Spanne (`leistung_von` bis `leistung_bis`), `keine` druckt nichts. Ohne Angabe ergibt sich der Modus aus den Daten bzw. aus dem Termin des Auftrags.", "enum": [ "keine", "tag", "zeitraum" ], "type": "string" }, "leistung_von": { "description": "Leistungstag oder Beginn, JJJJ-MM-TT.", "type": "string" }, "leistungsempfaenger": { "description": "Wer die Leistung erhalten hat, wenn nicht der Rechnungsempfänger — etwa der Mieter.", "maxLength": 200, "type": "string" }, "objektadresse": { "description": "Bezeichnung des Objekts, z. B. „Wohnanlage Süd, Haus 3\". Vorgabe: Projektname, sonst Ort des Auftrags.", "maxLength": 200, "type": "string" }, "objektnummer": { "description": "Objekt- oder Projektnummer. Vorgabe: die Nummer des Projekts am Auftrag.", "maxLength": 60, "type": "string" } }, "type": "object" }, "belegkopf_aus_auftrag": { "description": "Vorgabe true: übernimmt Auftragsnummer, Objektnummer, Objektadresse und Leistungstag/-zeitraum aus dem Auftrag — wie der Knopf „Aus Auftrag & Projekt übernehmen\" in Meistron. Auf false setzen, wenn der Belegkopf ausschließlich aus `belegkopf` kommen soll.", "type": "boolean" }, "betreff": { "description": "Betreff der Rechnung, eine Zeile unter der Belegnummer (z. B. „Heizungswartung Reihenhaus\"). Ohne Angabe wird der Titel des Auftrags übernommen.", "maxLength": 120, "type": "string" }, "hinweis": { "description": "Text für den Kunden auf der Rechnung.", "type": "string" }, "idempotency_key": { "description": "Im vollautonomen Betrieb erforderlich. Beim ersten Aufruf weglassen: Der Server liefert dann einen UUID-Key, ohne die Aktion auszuführen. Den Aufruf mit diesem Key wiederholen und bei Retry/Reconnect denselben Key verwenden. Eine neue beabsichtigte Aktion braucht einen neuen Key.", "format": "uuid", "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89aAbB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$", "type": "string" }, "kunde_id": { "description": "Die Kennung des Kunden. Ohne Angabe wird der Kunde des Auftrags übernommen.", "type": "string" }, "ohne_material": { "description": "Auf true setzen, wenn NUR die Stunden übernommen werden sollen.", "type": "boolean" }, "ohne_zeiten": { "description": "Auf true setzen, wenn NUR das Material übernommen werden soll, keine Stunden.", "type": "boolean" }, "positionen": { "description": "Eigene Positionen. Höchstens 50.", "items": { "additionalProperties": false, "properties": { "beschreibung": { "type": "string" }, "einheit": { "type": "string" }, "einzelpreis": { "description": "Netto, ohne Steuer.", "type": "number" }, "menge": { "type": "number" } }, "required": [ "beschreibung", "menge", "einzelpreis" ], "type": "object" }, "type": "array" }, "steuersatz": { "description": "Steuersatz für den GESAMTEN Beleg in Prozent — 19, 7 oder 0. Ohne Angabe der im Betrieb hinterlegte Satz. Ein Beleg trägt genau EINEN Satz, im Kopf wie in jeder Position; gemischte Sätze lehnt Meistron beim Finalisieren ab. Wer beides braucht, legt zwei Belege an.", "type": "number" } }, "type": "object" }, "name": "rechnung_anlegen", "outputSchema": null }, { "description": "Zeigt eine einzelne Rechnung vollständig: Betreff, Belegkopf (Auftrags-, Kunden-, Objektnummer, Leistungstag oder -zeitraum), alle Positionen mit Menge, Einheit und Preis, Beträge, Steuer, Rabatt, Zahlungsstand mit Restbetrag bei Teilzahlungen, Mahnstufe und eine etwaige Mahnpause, ob ein festgeschriebenes Original-PDF vorliegt, bei Storno den Grund, Projekt und den zugehörigen Auftrag. Damit lässt sich prüfen, WAS auf der Rechnung steht — nicht nur, wie viel.", "inputSchema": { "additionalProperties": false, "properties": { "rechnung_id": { "description": "Die Kennung der Rechnung.", "type": "string" } }, "required": [ "rechnung_id" ], "type": "object" }, "name": "rechnung_ansehen", "outputSchema": null }, { "description": "Prüft garantiert nur lesend den vollständigen Rechnungsentwurf vor dem E-Mail-Versand: alle Positionen und Summen, Kunde, Empfänger, Mail-Betreff und -Text, der in Meistron gewählte aktive Standard-Absender, Provider, Antwortadresse, die vollständige Anhangsliste sowie ein kurzlebig geschütztes Entwurfs-PDF. Dieses Werkzeug versendet NIEMALS etwas, vergibt KEINE Rechnungsnummer, friert KEIN PDF ein, legt KEINE Freigabe an und verändert KEINE Daten — auch dann nicht, wenn Vollautonomie aktiv ist. Für Fragen wie „zeig mir die Versandvorschau\", „welcher Absender wird benutzt?\" oder „prüfe vor dem Versand\" immer dieses Werkzeug verwenden. Die interne Rechnungskennung vorher selbst mit `rechnungen_suchen` ermitteln; den Menschen niemals bitten, eine UUID einzugeben oder sie ihm als notwendige Eingabe anzeigen.", "inputSchema": { "additionalProperties": false, "properties": { "rechnung_id": { "description": "Interne Kennung aus `rechnungen_suchen`. Selbst zwischen Werkzeugen weiterreichen und niemals vom Menschen eintippen lassen.", "type": "string" } }, "required": [ "rechnung_id" ], "type": "object" }, "name": "rechnung_versand_vorschau", "outputSchema": null }, { "description": "Nur für den tatsächlichen Versand verwenden. Für eine bloße Prüfung ohne Datenänderung immer `rechnung_versand_vorschau` aufrufen. Versendet einen Rechnungs-Entwurf per E-Mail an den Kunden. Dabei wird die Rechnungsnummer vergeben, das PDF eingefroren und der Versand protokolliert; ab dann ist die Rechnung nach GoBD unveränderlich. Die interne Rechnungskennung vorher selbst mit `rechnungen_suchen` ermitteln; den Menschen niemals bitten, eine UUID einzugeben oder zu wiederholen.\n\nBRIEFE GEHEN ÜBER DIESEN ZUGANG NICHT. Das ist Absicht, kein Fehler: Die Anschrift eines Kunden kann über denselben Zugang angelegt worden sein — ein Brief ginge dann an eine Adresse, die nie ein Mensch geprüft hat, auf Kosten des Post-Guthabens des Betriebs. Wer einen Brief verschicken will, tut das in Meistron. Das dem Handwerker so sagen, statt es anders zu versuchen.\n\nNORMALER MODUS — ZWEI SCHRITTE:\n1. Ohne „freigabe\" aufrufen → es geht NICHTS hinaus. Zurück kommt eine Vorschau: alle Positionen und Summen, Empfänger, Mailtext, der in Meistron gewählte Standard-Absender, Antwortadresse, die vollständige Anhangsliste und ein geschütztes Entwurfs-PDF — dazu ein Freigabewort.\n2. Die Vorschau dem Menschen zeigen und ihn ausdrücklich fragen. Erst mit seinem Ja erneut aufrufen, diesmal mit „freigabe\".\n\nDas Freigabewort NIEMALS selbst erfinden und den zweiten Schritt NIEMALS ohne ausdrückliche Zustimmung tun. Ausnahme: Hat der Inhaber für genau diesen Zugang in Meistron „Vollzugriff und Vollautonomie\" aktiviert, führt der Server den Versand direkt ohne Vorschau-Runde aus. Diesen Modus kann das Modell weder wählen noch einschalten. Eine E-Mail ist nicht zurückholbar und trifft einen echten Kunden.\n\nEmpfänger, Betreff und Text lassen sich hier NICHT angeben: Die Rechnung geht an die Adresse, die beim Kunden hinterlegt ist, mit den Vorlagen des Betriebs. Im normalen Modus muss diese Adresse menschlich bestätigt sein. Eine vom KI-Zugang angelegte Kundenadresse ist ausschließlich unter der für denselben Zugang aktivierten Vollautonomie samt E-Mail-Kanal sendefähig und wird in der Antwort so ausgewiesen. Der Absender ist ebenfalls kein Argument: Der Server nutzt exakt den aktiven Standard unter E-Mail-Absender. Nur wenn kein aktiver betrieblicher Absender existiert, wird der Meistron-Systemabsender klar ausgewiesen. Ein fehlender oder ungültiger Default neben aktiven Konten bricht ohne Fallback ab. Wer an eine andere Adresse senden will, ändert sie beim Kunden in Meistron.", "inputSchema": { "additionalProperties": false, "properties": { "freigabe": { "description": "Das Freigabewort aus der Vorschau (Form „SENDEN-1234\"). Nur setzen, wenn der Mensch die Vorschau gesehen und ausdrücklich zugestimmt hat.", "type": "string" }, "idempotency_key": { "description": "Im vollautonomen Betrieb erforderlich. Beim ersten Aufruf weglassen: Der Server liefert dann einen UUID-Key, ohne die Aktion auszuführen. Den Aufruf mit diesem Key wiederholen und bei Retry/Reconnect denselben Key verwenden. Eine neue beabsichtigte Aktion braucht einen neuen Key.", "format": "uuid", "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89aAbB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$", "type": "string" }, "rechnung_id": { "description": "Interne Kennung des Entwurfs aus `rechnungen_suchen`. Selbst zwischen Werkzeugen weiterreichen und niemals vom Menschen eintippen oder wiederholen lassen. Die Rechnung muss im Status „Entwurf\" sein.", "type": "string" }, "weg": { "description": "Nur E-Mail. Briefe lassen sich über diesen Zugang NICHT versenden — sie werden in Meistron ausgelöst.", "enum": [ "email" ], "type": "string" } }, "required": [ "rechnung_id" ], "type": "object" }, "name": "rechnung_versenden", "outputSchema": null }, { "description": "Listet Rechnungen mit Nummer, Kunde, Betrag, Status, Fälligkeit und dem noch offenen Restbetrag — bei Teilzahlungen steht der Rest neben dem Rechnungsbetrag und die Zeile ist als teilbezahlt gekennzeichnet. Mit `nur_offen` die unbezahlten (Restbetrag über null), sortiert nach Alter der Überfälligkeit — das ist der übliche Einstieg für offene Posten. Mit `suche` findet es eine Rechnung über Teil der Rechnungsnummer oder des Betreffs — auch bezahlte, stornierte und Entwürfe; die Kennung eines Treffers ist die Eingabe für `rechnung_ansehen`. Interne Kennungen ausschließlich selbst für Folgewerkzeuge verwenden; einen Menschen niemals bitten, eine UUID einzugeben oder zu wiederholen.", "inputSchema": { "additionalProperties": false, "properties": { "anzahl": { "description": "Höchstens so viele (Vorgabe 25, Grenze 100).", "type": "number" }, "bis": { "description": "Spätestes Rechnungsdatum, JJJJ-MM-TT.", "type": "string" }, "nur_offen": { "description": "Nur Rechnungen mit offenem Restbetrag, älteste Fälligkeit zuerst.", "type": "boolean" }, "nur_ueberfaellig": { "description": "Nur solche, deren Fälligkeit verstrichen ist.", "type": "boolean" }, "suche": { "description": "Teil der Rechnungsnummer (z. B. „0027\" oder „RE-2026-0027\") oder des Betreffs. Findet auch bezahlte, stornierte und Entwürfe.", "maxLength": 60, "type": "string" }, "von": { "description": "Frühestes Rechnungsdatum, JJJJ-MM-TT.", "type": "string" } }, "type": "object" }, "name": "rechnungen_suchen", "outputSchema": null }, { "description": "Die Antwort auf „was steht an?\" in EINEM Aufruf: Termine heute, Aufträge, die anstehen, offene Rechnungen mit Restbetrag (Teilzahlungen abgezogen) und Überfälligkeit, Angebote ohne Entscheidung, nicht abgerechnete Zeiten und Material unter dem Mindestbestand. Je Rubrik höchstens fünf Zeilen, dazu immer die Gesamtzahl und das Werkzeug, mit dem es tiefer geht. Was der Betrieb für den KI-Zugang nicht freigegeben hat, fehlt — die Antwort nennt aber ausdrücklich, welche Rubrik oder welche Angabe darin ausgelassen wurde, und schweigt darüber nie. Der richtige erste Aufruf am Morgen; für Einzelheiten danach die Fachwerkzeuge.", "inputSchema": { "additionalProperties": false, "properties": {}, "type": "object" }, "name": "tagesuebersicht", "outputSchema": null }, { "description": "Listet die Wartungsverträge des Betriebs mit Kunde, Anlage, Rhythmus und nächster Fälligkeit. Ohne Angaben kommen die zuerst fälligen. Gut für „welche Wartungen stehen im nächsten Monat an?\".", "inputSchema": { "additionalProperties": false, "properties": { "anzahl": { "description": "Höchstens so viele (Vorgabe 25, Grenze 100).", "type": "number" }, "faellig_bis": { "description": "Nur Verträge, die bis zu diesem Tag fällig werden, JJJJ-MM-TT.", "type": "string" }, "kunde_id": { "description": "Nur Verträge dieses Kunden.", "type": "string" }, "nur_ueberfaellig": { "description": "Nur Verträge, deren Fälligkeit schon vorbei ist.", "type": "boolean" }, "status": { "description": "Nur Verträge in diesem Zustand. Ohne Angabe nur aktive.", "enum": [ "active", "paused", "ended" ], "type": "string" } }, "type": "object" }, "name": "wartungsvertraege_suchen", "outputSchema": null }, { "description": "Zeigt einen Wartungsvertrag ausführlich: Rhythmus, nächste Fälligkeit, Objektanschrift, Anlage, Zuständige, Erinnerungsstufen — und die bereits daraus entstandenen Aufträge.", "inputSchema": { "additionalProperties": false, "properties": { "vertrag_id": { "description": "Die Kennung des Wartungsvertrags.", "type": "string" } }, "required": [ "vertrag_id" ], "type": "object" }, "name": "wartungsvertrag_ansehen", "outputSchema": null }, { "description": "Fasst die erfassten Arbeitszeiten eines Zeitraums zusammen — je Mitarbeiter die Summe der Stunden und die Zahl der erfassten Tage. Nennt auch Tage, an denen das Ausstempeln fehlt, denn die zählen nirgends mit.", "inputSchema": { "additionalProperties": false, "properties": { "bis": { "description": "Letzter Tag, JJJJ-MM-TT.", "type": "string" }, "von": { "description": "Erster Tag, JJJJ-MM-TT.", "type": "string" } }, "required": [ "von", "bis" ], "type": "object" }, "name": "zeiten_auswerten", "outputSchema": null } ] }
Verify it yourselfcurl -s https://api.teppi.xyz/v1/evidence/sha256:70c2bbfb9591d6e59bd1e06d79917b8aa445c087c2d93f3a28c8a583a52fa5b8 | sha256sum