messpunkt.io Partner API · MCP reference
Preview V1 release candidate 1.0.0-rc.3 — production live since 30 September 2026; access per customer organisation on request: kontakt@messpunkt.io
Reference

MCP server reference

The messpunkt.io MCP server lets landlords ask their own AI assistant about their properties, consumption and devices. It is read-only, uses the same authorization server and consent screen as the REST API, and applies the same data rules. Landlords who just want to connect should read Mit Claude, ChatGPT oder Codex verbinden (German).

Live since 30 September 2026 at https://mcp.messpunkt.io/v1 (see the changelog). Access is enabled per customer organisation on request (kontakt@messpunkt.io); without it the consent screen explains that the organisation has no API access yet. Verified end to end with Claude Code; for other clients see the landlord guide. There is no sandbox MCP server.

Endpoints

URL
MCP endpoint (resource)https://mcp.messpunkt.io/v1
Protected resource metadata (RFC 9728)https://mcp.messpunkt.io/.well-known/oauth-protected-resource/v1
Authorization serverhttps://auth.messpunkt.io (metadata at https://auth.messpunkt.io/.well-known/oauth-authorization-server)

Transport

  • Streamable HTTP, stateless. Every JSON-RPC request is a POST to /v1 and is answered on its own. The server keeps no session between requests, so a client does not need sticky routing.
  • No server-initiated requests in V1: the read-only tools never ask the client for input (no elicitation, no sampling).
  • Requests with an Origin header must come from an allowed origin, otherwise 403. Clients that send no Origin (desktop and server clients) are not affected.
  • Request bodies are limited to 1 MiB (413 above).

Authorization

OAuth 2.1 Authorization Code with PKCE (S256), exactly as for the REST API, with resource=https://mcp.messpunkt.io/v1 (RFC 8707). The access token's aud is that resource. A REST token is rejected here and vice versa.

  • Client registration: Client ID Metadata Documents. An MCP client identifies itself with an https URL as client_id pointing to its metadata document (token_endpoint_auth_method: none). The authorization server advertises client_id_metadata_document_supported: true and none in token_endpoint_auth_methods_supported. Dynamic client registration is not offered. Claude, Claude Code, Codex and ChatGPT document CIMD support; Claude uses CIMD exactly when both values are advertised (Anthropic: authentication for connectors). None of these clients has been tested live against this server yet.
  • Redirect URIs are matched exactly for https. Loopback redirects (http://localhost, http://127.0.0.1, http://[::1]) match with any port and exact path. The consent screen warns the landlord that such a client runs on their own computer.
  • Consent: the landlord picks the customer organisation and all Properties, including future ones or a selection. The token carries that selection; tools outside it behave as if the Property did not exist.
  • Connection check on every request: after the landlord disconnects in the portal, requests fail within 60 seconds.
  • DPoP-bound tokens (RFC 9449) are accepted with Authorization: DPoP and a proof, as on the REST API.

Auth challenge

Without a token the server answers 401 and points to its metadata:

HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer scope="read:units read:devices read:readings", resource_metadata="https://mcp.messpunkt.io/.well-known/oauth-protected-resource/v1"
Content-Type: application/problem+json

A rejected token adds error="invalid_token" and error_description. For a DPoP-bound token the scheme is DPoP with algs.

A tools/call for a tool whose scope the token lacks is refused before the tool runs, with a real HTTP 403 so the client can step up:

HTTP/1.1 403 Forbidden
WWW-Authenticate: Bearer error="insufficient_scope", error_description="…", scope="read:devices", resource_metadata="https://mcp.messpunkt.io/.well-known/oauth-protected-resource/v1"
Content-Type: application/problem+json

The problem detail is German, for clients that show it to the landlord; it tells them to reconnect with that permission. Clients that support step-up authorization reopen the consent screen with the scope from WWW-Authenticate instead (Claude Code does). tools/list is not scope-filtered: every tool is listed, and its required scope is below.

Rate limits

Counted per connection (grant) over every authenticated request to /v1, not only tools/call; 429 with Retry-After above the limit. Production: 60 calls per minute per connection, counted in memory per server instance (the effective limit can be higher, never lower).

Tool behaviour

  • All tools are read-only (readOnlyHint: true, idempotentHint: true, openWorldHint: false). Each returns structured content matching its outputSchema plus a short text summary for clients that ignore structured content.
  • Tool and field names are English. Descriptions, summaries and error texts are German, because landlords read them. The reference below quotes them as delivered.
  • Properties can be named by ID or by a part of their name or address. If several match, the result lists the candidates instead of failing. “Not found” and “not shared with you” produce the same answer.
  • list_properties pages with a cursor, with or without a search: query (part of the name or address, case-insensitive, % and _ taken literally) narrows the list, and the next page is fetched with the cursor of the previous answer and the same query. The cursor is not bound to the query, so a different query gives a shifted page, never other data.
  • get_property_overview returns difference_meter_count: difference meters have no value of their own and are missing from get_consumption and get_device_status; 0 means the difference-meter note in the tool descriptions does not apply to this Property.
  • Validation problems (for example a range longer than 36 months) come back as a tool result with isError: true and a German explanation, not as a protocol error.
  • Data rules as in the REST API: monthly values at the finest; one unit per metric (kWh, m3, unit = heat-cost-allocator units), never summed across metrics; water_outdoor separate; difference meters without a value; calibration status unknown never means “fine”.
  • Nothing is left out silently. get_consumption names the months of the range without values (months_without_values) and, when some are missing, the first month the Property has values at all (first_month_with_values). Measuring points of a requested metric that are not evaluated are listed in not_evaluated_measuring_points with a reason (today only no_system: assigned to no heating or water system); get_property_overview and get_device_status always list them. Clients must tolerate new reason values.
  • For one apartment, call get_consumption with usage_unit (name or ID); the result is broken down by usage unit and shows shared areas with their percentage in shared_sectors.

Versioning

The path carries the major version (/v1). Within v1 changes are additive only: new tools, new optional input fields, new output fields. A tool is never renamed or removed, and its meaning never changes. The server's test suite compares tools/list with a saved snapshot, so any change to a tool needs a deliberate snapshot update. The tool reference below is generated from that snapshot.

Tool reference

5 tools. Generated from tools-list.json (sha256 1359687bd075…, azure-functions PartnerMcp.Tests/Snapshots/tools-list.json (main) at fb5c773). Descriptions are quoted exactly as the server delivers them (German).

ToolTitleRequired scope
get_connection_infoMeine Verbindungread:units
get_consumptionVerbrauch je Monatread:readings
get_device_statusGerätestatusread:devices
get_property_overviewLiegenschaft im Überblickread:units
list_propertiesLiegenschaften auflistenread:units

get_connection_info

Meine Verbindung · scope read:units · readOnlyHint: true · idempotentHint: true · destructiveHint: false · openWorldHint: false
Zeigt, womit diese Verbindung zu Messpunkt arbeitet: für welchen Kunden (Mandant), mit welchen erteilten Rechten (in verständlichen Sätzen) und für welche Liegenschaften (alle, auch künftige, oder eine Liste), und wo die Verbindung im Vermieter-Portal getrennt wird. Nützlich, wenn unklar ist, warum eine Liegenschaft oder ein Tool nicht verfügbar ist. Liest keine Verbrauchs- oder Gerätedaten und ändert nichts. Benötigt das Recht read:units.

No input.

Input schema
{
  "properties": {},
  "type": "object"
}
Output schema
{
  "properties": {
    "how_to_disconnect": {
      "description": "Wie die Verbindung getrennt oder geändert wird.",
      "type": "string"
    },
    "property_scope": {
      "description": "Welche Liegenschaften die Verbindung sehen darf.",
      "properties": {
        "all": {
          "description": "true, wenn die Verbindung alle Liegenschaften umfasst, auch später hinzukommende.",
          "type": "boolean"
        },
        "properties": {
          "default": null,
          "description": "Bei All=false: die freigegebenen Liegenschaften.",
          "items": {
            "properties": {
              "address": {
                "type": "string"
              },
              "id": {
                "format": "uuid",
                "type": "string"
              },
              "name": {
                "type": "string"
              }
            },
            "required": [
              "id",
              "name",
              "address"
            ],
            "type": "object"
          },
          "type": [
            "array",
            "null"
          ]
        }
      },
      "required": [
        "all"
      ],
      "type": "object"
    },
    "scopes": {
      "description": "Die erteilten Rechte.",
      "items": {
        "properties": {
          "description": {
            "description": "Was dieses Recht erlaubt, in einem Satz.",
            "type": "string"
          },
          "scope": {
            "description": "Technischer Name des Rechts, z. B. read:units.",
            "type": "string"
          }
        },
        "required": [
          "scope",
          "description"
        ],
        "type": "object"
      },
      "type": "array"
    },
    "summary": {
      "description": "Ein Satz: zu welchem Kunden die Verbindung gehört (Rechte, Umfang und Trennen stehen in den eigenen Feldern).",
      "type": "string"
    },
    "tenant_name": {
      "default": null,
      "description": "Name des Mandanten (Kunde), zu dem diese Verbindung gehört; fehlt, wenn er nicht ermittelt werden kann.",
      "type": [
        "string",
        "null"
      ]
    }
  },
  "required": [
    "scopes",
    "property_scope",
    "how_to_disconnect",
    "summary"
  ],
  "type": "object"
}

get_consumption

Verbrauch je Monat · scope read:readings · readOnlyHint: true · idempotentHint: true · destructiveHint: false · openWorldHint: false
Liefert Monatswerte des Verbrauchs einer Liegenschaft. Die Liegenschaft wird als property per Name, Adress-Teilstring oder ID angegeben; passen mehrere, kommt eine Kandidatenliste. Werte sind höchstens monatlich aufgelöst (nie Tages- oder Rohwerte) und jede Kennzahl hat ihre eigene Einheit: heat in kWh, hca in HKV-Einheiten (dimensionslos, Einheit unit), water_cold, water_warm und water_outdoor in m3. electricity ist reserviert: messpunkt.io hat derzeit keine lesbaren Stromzähler, es kommen keine Werte; fragt jemand nach Strom, das so sagen und nicht auf defekte Zähler schließen. Aussenwasser (water_outdoor) wird getrennt von Kalt- und Warmwasser ausgewiesen; eine Summe über verschiedene Kennzahlen gibt es nicht. Zeitraum: from_month und to_month als JJJJ-MM; ohne Angabe die letzten 12 abgeschlossenen Monate, höchstens 36 Monate je Aufruf; der laufende Monat ist nie enthalten. breakdown wählt die Gliederung: systems (je Anlage, Standard), sectors (je Bereich einer Anlage) oder usage_units (je Nutzeinheit, anteilig nach Zuordnung der Bereiche). Fragt jemand nach einer Wohnung oder Nutzeinheit, breakdown=usage_units verwenden, mit usage_unit (Name oder ID) für genau eine Einheit. Mit include_devices=true kommen die Gerätesegmente dazu; deren baseline_origin sagt, woher der Startwert eines Tausch-Heizkostenverteilers stammt: recorded (erfasster Startwert), assumed_zero (angenommen 0, nicht erfasst), first_reading (erster Messwert nach Einbau; Verbrauch davor unbekannt), portal_rule (Stand zu Beginn des Zeitraums, wie im Portal) oder none (kein Startwert). Ein angenommener Startwert wird immer gemeldet. Jeder Monatswert trägt einen Status; calibration_expired heißt, ein Gerät mit abgelaufener Eichung trägt nichts zum Wert bei. Eichstatus unbekannt — das heißt nicht, dass die Eichung in Ordnung ist. Differenzzähler: kein Wert in V1. Benötigt das Recht read:readings.
InputTypeRequiredDescription (as delivered)
breakdownstring
default "systems"
noOptional: systems (je Anlage, Standard), sectors (je Bereich) oder usage_units (je Nutzeinheit).
from_monthstring | null
default null
noOptional: erster Monat als JJJJ-MM, z. B. 2025-01. Ohne Angabe: 11 Monate vor to_month.
include_devicesboolean
default false
noOptional: true liefert zusätzlich die Gerätesegmente (Startwert mit baseline_origin, K-Faktor, Verbrauch roh und mit Faktor).
metricsarray | null
default null
noOptional: nur diese Kennzahlen, aus heat, hca, water_cold, water_warm, water_outdoor, electricity (reserviert, derzeit ohne Werte). Ohne Angabe: alle.
propertystringyesName (auch nur ein Teil), Adresse oder ID der Liegenschaft, z. B. „Gartenweg“.
to_monthstring | null
default null
noOptional: letzter Monat als JJJJ-MM, z. B. 2025-12. Ohne Angabe: der letzte abgeschlossene Monat.
usage_unitstring | null
default null
noOptional: Name oder ID einer Nutzeinheit (z. B. „WE 2“); liefert nur diese Einheit und gliedert nach usage_units.
Input schema
{
  "properties": {
    "breakdown": {
      "default": "systems",
      "description": "Optional: systems (je Anlage, Standard), sectors (je Bereich) oder usage_units (je Nutzeinheit).",
      "type": "string"
    },
    "from_month": {
      "default": null,
      "description": "Optional: erster Monat als JJJJ-MM, z. B. 2025-01. Ohne Angabe: 11 Monate vor to_month.",
      "type": [
        "string",
        "null"
      ]
    },
    "include_devices": {
      "default": false,
      "description": "Optional: true liefert zusätzlich die Gerätesegmente (Startwert mit baseline_origin, K-Faktor, Verbrauch roh und mit Faktor).",
      "type": "boolean"
    },
    "metrics": {
      "default": null,
      "description": "Optional: nur diese Kennzahlen, aus heat, hca, water_cold, water_warm, water_outdoor, electricity (reserviert, derzeit ohne Werte). Ohne Angabe: alle.",
      "items": {
        "type": [
          "string",
          "null"
        ]
      },
      "type": [
        "array",
        "null"
      ]
    },
    "property": {
      "description": "Name (auch nur ein Teil), Adresse oder ID der Liegenschaft, z. B. „Gartenweg“.",
      "type": "string"
    },
    "to_month": {
      "default": null,
      "description": "Optional: letzter Monat als JJJJ-MM, z. B. 2025-12. Ohne Angabe: der letzte abgeschlossene Monat.",
      "type": [
        "string",
        "null"
      ]
    },
    "usage_unit": {
      "default": null,
      "description": "Optional: Name oder ID einer Nutzeinheit (z. B. „WE 2“); liefert nur diese Einheit und gliedert nach usage_units.",
      "type": [
        "string",
        "null"
      ]
    }
  },
  "required": [
    "property"
  ],
  "type": "object"
}
Output schema
{
  "properties": {
    "assumed_zero_devices": {
      "default": null,
      "description": "Immer gesetzt, wenn ein Gerät mit angenommenem Startwert 0 (baseline_origin assumed_zero) im Zeitraum liegt, auch ohne include_devices.",
      "items": {
        "$ref": "#/properties/devices/items"
      },
      "type": [
        "array",
        "null"
      ]
    },
    "breakdown": {
      "default": null,
      "description": "Gewählte Gliederung: systems, sectors oder usage_units; nur bei ok.",
      "type": [
        "string",
        "null"
      ]
    },
    "candidates": {
      "default": null,
      "description": "Bei ambiguous: die passenden Liegenschaften (id, Name, Adresse).",
      "items": {
        "properties": {
          "address": {
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "address"
        ],
        "type": "object"
      },
      "type": [
        "array",
        "null"
      ]
    },
    "devices": {
      "default": null,
      "description": "Nur mit include_devices=true: die Gerätesegmente mit Startwert und baseline_origin.",
      "items": {
        "properties": {
          "adjusted_consumption": {
            "default": null,
            "description": "Verbrauch im Zeitraum mit dem K-Faktor dieses Geräts.",
            "type": [
              "number",
              "null"
            ]
          },
          "baseline_date": {
            "default": null,
            "description": "Datum des Startwerts (JJJJ-MM-TT).",
            "type": [
              "string",
              "null"
            ]
          },
          "baseline_origin": {
            "description": "Herkunft des Startwerts: recorded (erfasster Startwert), assumed_zero (angenommen 0, NICHT erfasst), first_reading (erster Messwert nach Einbau; Verbrauch davor unbekannt), portal_rule (Stand zu Beginn des Zeitraums, wie im Portal) oder none (kein Startwert).",
            "type": "string"
          },
          "baseline_value": {
            "default": null,
            "description": "Startwert des Geräts in der Einheit der Kennzahl.",
            "type": [
              "number",
              "null"
            ]
          },
          "device_id": {
            "description": "Stabile ID des Geräts.",
            "format": "uuid",
            "type": "string"
          },
          "device_type": {
            "description": "Gerätetyp.",
            "type": "string"
          },
          "factor": {
            "description": "K-Faktor dieses Geräts (Heizkostenverteiler); ein Tausch wirkt nicht rückwirkend.",
            "type": "number"
          },
          "installed_on": {
            "default": null,
            "description": "Einbaudatum (JJJJ-MM-TT), falls bekannt.",
            "type": [
              "string",
              "null"
            ]
          },
          "metric": {
            "description": "Kennzahl des Geräts (z. B. hca).",
            "type": [
              "string",
              "null"
            ]
          },
          "raw_consumption": {
            "default": null,
            "description": "Verbrauch im Zeitraum, roh (ohne K-Faktor).",
            "type": [
              "number",
              "null"
            ]
          },
          "removed_on": {
            "default": null,
            "description": "Ausbaudatum (JJJJ-MM-TT), falls ausgebaut.",
            "type": [
              "string",
              "null"
            ]
          },
          "serial_number": {
            "description": "Seriennummer.",
            "type": "string"
          }
        },
        "required": [
          "device_id",
          "serial_number",
          "device_type",
          "metric",
          "factor",
          "baseline_origin"
        ],
        "type": "object"
      },
      "type": [
        "array",
        "null"
      ]
    },
    "entries": {
      "default": null,
      "description": "Die Werte je Auswertungseinheit; nur bei ok.",
      "items": {
        "properties": {
          "name": {
            "description": "Die Auswertungseinheit: bei systems eine Anlage, bei sectors ein Bereich einer Anlage, bei usage_units eine Nutzeinheit.",
            "type": "string"
          },
          "sector_id": {
            "default": null,
            "description": "ID des Bereichs (nur bei sectors).",
            "format": "uuid",
            "type": [
              "string",
              "null"
            ]
          },
          "series": {
            "description": "Eine Reihe je Kennzahl, jede in ihrer Einheit.",
            "items": {
              "properties": {
                "label": {
                  "description": "Deutsche Bezeichnung der Kennzahl.",
                  "type": "string"
                },
                "metric": {
                  "description": "Kennzahl: heat (Wärmemenge), hca (Heizkostenverteiler), water_cold, water_warm, water_outdoor (Aussenwasser) oder electricity (reserviert, derzeit ohne Werte).",
                  "type": "string"
                },
                "months": {
                  "description": "Monatswerte aufsteigend; Monate ohne Eintrag hatten keine Daten.",
                  "items": {
                    "properties": {
                      "calibration_data_missing": {
                        "default": null,
                        "description": "true, wenn für mindestens ein eichpflichtiges Gerät in diesem Wert keine Eichdaten vorliegen. Das heißt nicht, dass die Eichung in Ordnung ist.",
                        "type": [
                          "boolean",
                          "null"
                        ]
                      },
                      "month": {
                        "description": "Monat als JJJJ-MM.",
                        "type": "string"
                      },
                      "status": {
                        "description": "measured (gemessen), partially_substituted, substituted (ersetzt), calculated (berechnet), calibration_expired (Gerät mit abgelaufener Eichung trägt nichts bei), missing (keine Daten) oder unknown.",
                        "type": "string"
                      },
                      "value": {
                        "description": "Verbrauch dieses Monats in der Einheit der Kennzahl.",
                        "type": "number"
                      }
                    },
                    "required": [
                      "month",
                      "value",
                      "status"
                    ],
                    "type": "object"
                  },
                  "type": "array"
                },
                "total": {
                  "description": "Summe der gelisteten Monate, in derselben Einheit.",
                  "type": "number"
                },
                "unit": {
                  "description": "Einheit dieser Kennzahl: kWh, m3 oder unit (HKV-Einheiten, dimensionslos). Jede Kennzahl hat ihre eigene Einheit.",
                  "type": "string"
                }
              },
              "required": [
                "metric",
                "label",
                "unit",
                "months",
                "total"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "shared_sectors": {
            "default": null,
            "description": "Nur bei usage_units: Bereiche, die diese Nutzeinheit mit anderen teilt oder nur zum Teil trägt, mit ihrem Anteil in Prozent; nur diese Anteile sind im Wert enthalten.",
            "items": {
              "properties": {
                "percent": {
                  "description": "Anteil dieser Nutzeinheit am Bereich in Prozent.",
                  "type": "number"
                },
                "sector": {
                  "description": "Name des geteilten Bereichs.",
                  "type": "string"
                }
              },
              "required": [
                "sector",
                "percent"
              ],
              "type": "object"
            },
            "type": [
              "array",
              "null"
            ]
          },
          "system_id": {
            "default": null,
            "description": "ID der Anlage (bei systems und sectors).",
            "format": "uuid",
            "type": [
              "string",
              "null"
            ]
          },
          "system_name": {
            "default": null,
            "description": "Name der Anlage (bei systems und sectors).",
            "type": [
              "string",
              "null"
            ]
          },
          "system_type": {
            "default": null,
            "description": "Art der Anlage, z. B. Heating oder Water.",
            "type": [
              "string",
              "null"
            ]
          },
          "usage_unit_id": {
            "default": null,
            "description": "ID der Nutzeinheit (nur bei usage_units).",
            "format": "uuid",
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "name",
          "series"
        ],
        "type": "object"
      },
      "type": [
        "array",
        "null"
      ]
    },
    "first_month_with_values": {
      "default": null,
      "description": "Nur wenn im Zeitraum Monate ohne Werte liegen: der erste Monat (JJJJ-MM), ab dem diese Liegenschaft überhaupt Werte hat; fehlt, wenn es keine gibt.",
      "type": [
        "string",
        "null"
      ]
    },
    "from_month": {
      "default": null,
      "description": "Erster Monat des Zeitraums (JJJJ-MM); nur bei ok.",
      "type": [
        "string",
        "null"
      ]
    },
    "message": {
      "default": null,
      "description": "Klartext bei ambiguous und not_found.",
      "type": [
        "string",
        "null"
      ]
    },
    "months_without_values": {
      "default": null,
      "description": "Monate (JJJJ-MM) des Zeitraums, für die es keine Werte gibt, wenn der Zeitraum nur teilweise abgedeckt ist; die Summen umfassen dann nur die übrigen Monate.",
      "items": {
        "type": "string"
      },
      "type": [
        "array",
        "null"
      ]
    },
    "not_evaluated_measuring_points": {
      "default": null,
      "description": "Messpunkte, die zu einer angefragten Kennzahl gehören, aber nicht ausgewertet werden (reason no_system: keiner Anlage zugeordnet); sie tragen zu keinem Wert bei. Fehlt, wenn keiner betroffen ist.",
      "items": {
        "properties": {
          "id": {
            "description": "ID des Messpunkts.",
            "format": "uuid",
            "type": "string"
          },
          "localization": {
            "description": "Lage / Bezeichnung des Messpunkts.",
            "type": "string"
          },
          "reason": {
            "description": "Warum der Messpunkt nicht ausgewertet wird: no_system (keiner Anlage zugeordnet).",
            "type": "string"
          }
        },
        "required": [
          "id",
          "localization",
          "reason"
        ],
        "type": "object"
      },
      "type": [
        "array",
        "null"
      ]
    },
    "notes": {
      "default": null,
      "description": "Hinweise zur Einordnung der Werte; immer lesen.",
      "items": {
        "type": "string"
      },
      "type": [
        "array",
        "null"
      ]
    },
    "property": {
      "default": null,
      "description": "Die Liegenschaft; nur bei ok.",
      "properties": {
        "address": {
          "type": "string"
        },
        "id": {
          "format": "uuid",
          "type": "string"
        },
        "name": {
          "type": "string"
        }
      },
      "required": [
        "id",
        "name",
        "address"
      ],
      "type": [
        "object",
        "null"
      ]
    },
    "status": {
      "description": "ok, ambiguous (mehrere Liegenschaften passen, siehe candidates) oder not_found.",
      "type": "string"
    },
    "to_month": {
      "default": null,
      "description": "Letzter Monat des Zeitraums (JJJJ-MM); nur bei ok.",
      "type": [
        "string",
        "null"
      ]
    }
  },
  "required": [
    "status"
  ],
  "type": "object"
}

get_device_status

Gerätestatus · scope read:devices · readOnlyHint: true · idempotentHint: true · destructiveHint: false · openWorldHint: false
Zeigt je Gerät einer Liegenschaft, ob es stumm ist (mehr als 7 Tage kein Funktelegramm), das Datum des letzten Empfangs, den Eichstatus (ok, expired, replaced, not_required, unknown) mit Ablaufdatum sowie Ein- und Ausbau bzw. Tausch. Die Liegenschaft wird als property per Name, Adress-Teilstring oder ID angegeben; passen mehrere, kommt eine Kandidatenliste. Mit only_problems=true erscheinen nur stumme Geräte und Geräte mit abgelaufenem oder unbekanntem Eichstatus. Ausgebaute Geräte erscheinen nur mit include_removed=true. Eichstatus unbekannt — das heißt nicht, dass die Eichung in Ordnung ist. Der letzte Empfang ist nur als Datum angegeben. Differenzzähler: kein Wert in V1. Benötigt das Recht read:devices.
InputTypeRequiredDescription (as delivered)
include_removedboolean
default false
noOptional: true nimmt auch ausgebaute Geräte auf. Standard false.
only_problemsboolean
default false
noOptional: true zeigt nur stumme Geräte und Geräte mit abgelaufenem oder unbekanntem Eichstatus.
propertystringyesName (auch nur ein Teil), Adresse oder ID der Liegenschaft, z. B. „Gartenweg“.
Input schema
{
  "properties": {
    "include_removed": {
      "default": false,
      "description": "Optional: true nimmt auch ausgebaute Geräte auf. Standard false.",
      "type": "boolean"
    },
    "only_problems": {
      "default": false,
      "description": "Optional: true zeigt nur stumme Geräte und Geräte mit abgelaufenem oder unbekanntem Eichstatus.",
      "type": "boolean"
    },
    "property": {
      "description": "Name (auch nur ein Teil), Adresse oder ID der Liegenschaft, z. B. „Gartenweg“.",
      "type": "string"
    }
  },
  "required": [
    "property"
  ],
  "type": "object"
}
Output schema
{
  "properties": {
    "candidates": {
      "default": null,
      "description": "Bei ambiguous: die passenden Liegenschaften (id, Name, Adresse).",
      "items": {
        "properties": {
          "address": {
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "address"
        ],
        "type": "object"
      },
      "type": [
        "array",
        "null"
      ]
    },
    "devices": {
      "default": null,
      "description": "Die Geräte, sortiert nach Messpunkt und Seriennummer; nur bei ok.",
      "items": {
        "properties": {
          "calibration_state": {
            "description": "Eichstatus: ok, expired (abgelaufen), replaced (Gerät wurde getauscht bzw. ausgebaut), not_required (keine Eichpflicht, z. B. Heizkostenverteiler) oder unknown. Eichstatus unbekannt — das heißt nicht, dass die Eichung in Ordnung ist.",
            "type": "string"
          },
          "calibration_valid_until": {
            "default": null,
            "description": "Letzter Tag der Eichgültigkeit (JJJJ-MM-TT), wenn bekannt.",
            "type": [
              "string",
              "null"
            ]
          },
          "device_type": {
            "description": "Gerätetyp, z. B. HeatCostAllocator, WaterMeter.",
            "type": "string"
          },
          "id": {
            "description": "Stabile ID des Geräts.",
            "format": "uuid",
            "type": "string"
          },
          "installed_on": {
            "default": null,
            "description": "Einbaudatum (JJJJ-MM-TT), wenn bekannt.",
            "type": [
              "string",
              "null"
            ]
          },
          "last_received_on": {
            "default": null,
            "description": "Datum (JJJJ-MM-TT) des letzten Funkempfangs, ohne Uhrzeit; fehlt, wenn das Gerät nie gesendet hat.",
            "type": [
              "string",
              "null"
            ]
          },
          "measuring_point": {
            "description": "Messpunkt, an dem das Gerät hängt (z. B. Raum oder Zählerplatz).",
            "type": "string"
          },
          "removed_on": {
            "default": null,
            "description": "Ausbaudatum (JJJJ-MM-TT), wenn das Gerät ausgebaut wurde.",
            "type": [
              "string",
              "null"
            ]
          },
          "replaced_by_device_id": {
            "default": null,
            "description": "ID des Ersatzgeräts, wenn dieses Gerät getauscht wurde.",
            "format": "uuid",
            "type": [
              "string",
              "null"
            ]
          },
          "serial_number": {
            "description": "Seriennummer.",
            "type": "string"
          },
          "silent": {
            "description": "true, wenn das Gerät seit mehr als 7 Tagen kein Funktelegramm gesendet hat oder nie gesendet hat. Ausgebaute Geräte sind nie stumm.",
            "type": "boolean"
          },
          "usage_units": {
            "default": null,
            "description": "Namen der Nutzeinheiten (Wohnungen), zu denen der Bereich des Messpunkts gehört; fehlt, wenn keine zugeordnet ist.",
            "items": {
              "type": "string"
            },
            "type": [
              "array",
              "null"
            ]
          }
        },
        "required": [
          "id",
          "serial_number",
          "device_type",
          "measuring_point",
          "silent",
          "calibration_state"
        ],
        "type": "object"
      },
      "type": [
        "array",
        "null"
      ]
    },
    "message": {
      "default": null,
      "description": "Klartext bei ambiguous und not_found.",
      "type": [
        "string",
        "null"
      ]
    },
    "not_evaluated_measuring_points": {
      "default": null,
      "description": "Messpunkte, die keiner Anlage zugeordnet sind und deshalb nicht ausgewertet werden (reason no_system).",
      "items": {
        "properties": {
          "id": {
            "description": "ID des Messpunkts.",
            "format": "uuid",
            "type": "string"
          },
          "localization": {
            "description": "Lage / Bezeichnung des Messpunkts.",
            "type": "string"
          },
          "reason": {
            "description": "Warum der Messpunkt nicht ausgewertet wird: no_system (keiner Anlage zugeordnet).",
            "type": "string"
          }
        },
        "required": [
          "id",
          "localization",
          "reason"
        ],
        "type": "object"
      },
      "type": [
        "array",
        "null"
      ]
    },
    "notes": {
      "default": null,
      "description": "Hinweise zur Einordnung der Werte; immer lesen.",
      "items": {
        "type": "string"
      },
      "type": [
        "array",
        "null"
      ]
    },
    "property": {
      "default": null,
      "description": "Die Liegenschaft; nur bei ok.",
      "properties": {
        "address": {
          "type": "string"
        },
        "id": {
          "format": "uuid",
          "type": "string"
        },
        "name": {
          "type": "string"
        }
      },
      "required": [
        "id",
        "name",
        "address"
      ],
      "type": [
        "object",
        "null"
      ]
    },
    "status": {
      "description": "ok, ambiguous (mehrere Liegenschaften passen, siehe candidates) oder not_found.",
      "type": "string"
    },
    "summary": {
      "default": null,
      "description": "Zählung der Geräte; nur bei ok.",
      "properties": {
        "calibration_expired": {
          "description": "Davon mit abgelaufener Eichung.",
          "type": "integer"
        },
        "calibration_unknown": {
          "description": "Davon mit unbekanntem Eichstatus.",
          "type": "integer"
        },
        "silent": {
          "description": "Davon stumm.",
          "type": "integer"
        },
        "total": {
          "description": "Anzahl der gelisteten Geräte.",
          "type": "integer"
        }
      },
      "required": [
        "total",
        "silent",
        "calibration_expired",
        "calibration_unknown"
      ],
      "type": [
        "object",
        "null"
      ]
    }
  },
  "required": [
    "status"
  ],
  "type": "object"
}

get_property_overview

Liegenschaft im Überblick · scope read:units · readOnlyHint: true · idempotentHint: true · destructiveHint: false · openWorldHint: false
Zeigt eine Liegenschaft im Überblick: ihre Nutzeinheiten mit den aktuellen Mietern (wie im Vermieter-Portal, ohne Ausgezogene), ihre Anlagen und die Zahl der Messpunkte. Die Liegenschaft wird als property per Name, Adress-Teilstring oder ID angegeben; passen mehrere, antwortet das Tool mit einer Kandidatenliste. Liefert keine Verbrauchswerte (dafür get_consumption) und keinen Gerätestatus (dafür get_device_status). Benötigt das Recht read:units.
InputTypeRequiredDescription (as delivered)
propertystringyesName (auch nur ein Teil), Adresse oder ID der Liegenschaft, z. B. „Gartenweg“.
Input schema
{
  "properties": {
    "property": {
      "description": "Name (auch nur ein Teil), Adresse oder ID der Liegenschaft, z. B. „Gartenweg“.",
      "type": "string"
    }
  },
  "required": [
    "property"
  ],
  "type": "object"
}
Output schema
{
  "properties": {
    "candidates": {
      "default": null,
      "description": "Bei ambiguous: die passenden Liegenschaften (id, Name, Adresse).",
      "items": {
        "properties": {
          "address": {
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "address"
        ],
        "type": "object"
      },
      "type": [
        "array",
        "null"
      ]
    },
    "difference_meter_count": {
      "default": null,
      "description": "Davon Differenzzähler-Messpunkte. Sie tragen keinen eigenen Wert und fehlen deshalb in get_consumption und get_device_status (sie sind nicht null). 0 heißt: der Differenzzähler-Hinweis in den Tool-Beschreibungen betrifft diese Liegenschaft nicht; nur bei ok.",
      "type": [
        "integer",
        "null"
      ]
    },
    "measuring_point_count": {
      "default": null,
      "description": "Anzahl der aktiven Messpunkte (nicht der Geräte); nur bei ok.",
      "type": [
        "integer",
        "null"
      ]
    },
    "message": {
      "default": null,
      "description": "Klartext bei ambiguous und not_found.",
      "type": [
        "string",
        "null"
      ]
    },
    "not_evaluated_measuring_point_count": {
      "default": null,
      "description": "Davon Messpunkte, die keiner Anlage zugeordnet sind und deshalb nicht ausgewertet werden (zu keinem Verbrauch beitragen); nur bei ok.",
      "type": [
        "integer",
        "null"
      ]
    },
    "notes": {
      "default": null,
      "description": "Hinweise zur Einordnung der Werte.",
      "items": {
        "type": "string"
      },
      "type": [
        "array",
        "null"
      ]
    },
    "property": {
      "default": null,
      "description": "Die Liegenschaft; nur bei ok.",
      "properties": {
        "address": {
          "type": "string"
        },
        "id": {
          "format": "uuid",
          "type": "string"
        },
        "name": {
          "type": "string"
        }
      },
      "required": [
        "id",
        "name",
        "address"
      ],
      "type": [
        "object",
        "null"
      ]
    },
    "status": {
      "description": "ok, ambiguous (mehrere Liegenschaften passen, siehe candidates) oder not_found.",
      "type": "string"
    },
    "systems": {
      "default": null,
      "description": "Anlagen (Heizung, Wasser ...); nur bei ok.",
      "items": {
        "properties": {
          "id": {
            "description": "Stabile ID der Anlage.",
            "format": "uuid",
            "type": "string"
          },
          "name": {
            "description": "Name der Anlage.",
            "type": "string"
          },
          "type": {
            "description": "Art der Anlage, z. B. Heating oder Water.",
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "type"
        ],
        "type": "object"
      },
      "type": [
        "array",
        "null"
      ]
    },
    "usage_units": {
      "default": null,
      "description": "Nutzeinheiten mit aktuellen Mietern; nur bei ok.",
      "items": {
        "properties": {
          "current_occupants": {
            "description": "Aktuelle Mieter. Leer bedeutet: aktuell kein Mieter eingetragen. Ausgezogene und künftige Mieter fehlen.",
            "items": {
              "properties": {
                "move_in_date": {
                  "default": null,
                  "description": "Einzugsdatum (JJJJ-MM-TT), falls bekannt.",
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "move_out_date": {
                  "default": null,
                  "description": "Auszugsdatum (JJJJ-MM-TT), falls bereits eingetragen (der Auszugstag zählt noch als aktuell).",
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "name": {
                  "description": "Name des Haushalts / Mieters, wie im Vermieter-Portal.",
                  "type": "string"
                }
              },
              "required": [
                "name"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "heated_area_m2": {
            "default": null,
            "description": "Beheizte Fläche in m², falls erfasst.",
            "type": [
              "number",
              "null"
            ]
          },
          "id": {
            "description": "Stabile ID der Nutzeinheit.",
            "format": "uuid",
            "type": "string"
          },
          "name": {
            "description": "Name der Nutzeinheit, z. B. „WE 01“.",
            "type": "string"
          },
          "warm_water_area_m2": {
            "default": null,
            "description": "Warmwasser-Fläche in m², falls erfasst.",
            "type": [
              "number",
              "null"
            ]
          }
        },
        "required": [
          "id",
          "name",
          "current_occupants"
        ],
        "type": "object"
      },
      "type": [
        "array",
        "null"
      ]
    }
  },
  "required": [
    "status"
  ],
  "type": "object"
}

list_properties

Liegenschaften auflisten · scope read:units · readOnlyHint: true · idempotentHint: true · destructiveHint: false · openWorldHint: false
Listet die Liegenschaften, die für diese Verbindung freigegeben sind: ID, Name, Adresse, Anzahl Nutzeinheiten und Anlagen. Mit query (Teil des Namens oder der Adresse, Groß-/Kleinschreibung egal, Zeichen wie % gelten wörtlich) werden nur die passenden Liegenschaften gelistet. Es wird seitenweise geblättert (cursor aus der vorigen Antwort, mit demselben query; limit 1 bis 100, Standard 25). Die Namen der Liegenschaften können bei allen anderen Tools statt der ID verwendet werden. Benötigt das Recht read:units.
InputTypeRequiredDescription (as delivered)
cursorstring | null
default null
noOptional: cursor aus der vorigen Antwort, um die nächste Seite zu holen; bei einer Suche mit demselben query wie zuvor.
limitinteger | null
default null
noOptional: Anzahl je Seite, 1 bis 100, Standard 25.
querystring | null
default null
noOptional: Teil des Namens oder der Adresse, z. B. „Gartenweg“.
Input schema
{
  "properties": {
    "cursor": {
      "default": null,
      "description": "Optional: cursor aus der vorigen Antwort, um die nächste Seite zu holen; bei einer Suche mit demselben query wie zuvor.",
      "type": [
        "string",
        "null"
      ]
    },
    "limit": {
      "default": null,
      "description": "Optional: Anzahl je Seite, 1 bis 100, Standard 25.",
      "type": [
        "integer",
        "null"
      ]
    },
    "query": {
      "default": null,
      "description": "Optional: Teil des Namens oder der Adresse, z. B. „Gartenweg“.",
      "type": [
        "string",
        "null"
      ]
    }
  },
  "type": "object"
}
Output schema
{
  "properties": {
    "message": {
      "default": null,
      "description": "Hinweis in Klartext, z. B. bei leerem Ergebnis oder abgeschnittener Suche.",
      "type": [
        "string",
        "null"
      ]
    },
    "next_cursor": {
      "default": null,
      "description": "Cursor für die nächste Seite; fehlt, wenn es keine weitere gibt.",
      "type": [
        "string",
        "null"
      ]
    },
    "properties": {
      "description": "Die Liegenschaften, sortiert nach Name.",
      "items": {
        "properties": {
          "address": {
            "description": "Hauptadresse als eine Zeile.",
            "type": "string"
          },
          "id": {
            "description": "Stabile ID der Liegenschaft; kann bei allen anderen Tools als property angegeben werden.",
            "format": "uuid",
            "type": "string"
          },
          "name": {
            "description": "Name der Liegenschaft.",
            "type": "string"
          },
          "system_count": {
            "description": "Anzahl der Anlagen (Heizung, Wasser ...).",
            "type": "integer"
          },
          "usage_unit_count": {
            "description": "Anzahl der Nutzeinheiten (Wohnungen, Läden ...).",
            "type": "integer"
          }
        },
        "required": [
          "id",
          "name",
          "address",
          "usage_unit_count",
          "system_count"
        ],
        "type": "object"
      },
      "type": "array"
    },
    "status": {
      "description": "ok, oder not_found, wenn die Suche nichts ergeben hat.",
      "type": "string"
    }
  },
  "required": [
    "status",
    "properties"
  ],
  "type": "object"
}