Prepare a German Energieausweis (energy certificate); an Energieberater checks and signs it.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Uploads a file to a draft order: an energy bill or Heizkostenabrechnung (rechnung) or a photo (street side, heating, type plate). JPG, PNG, WebP or PDF as base64, at most 10 MB, 20 files per order. Bills are read and compared with the entered consumption after the customer has ordered; the Energieberater checks the photos. Usually the customer takes the photos on our page after the confirmation email. Orders nothing.
rechnung (energy bill or Heizkostenabrechnung), fassade_strasse (photo of the street side), fassade_garten, heizung (photo of the boiler or heat pump), typenschild (photo of its type plate) or sonstiges
the order_id start_order returned
the order_token start_order returned; it opens only this order, keep it private
the file, base64-encoded: JPG, PNG, WebP or PDF, at most 10 MB
the file's name, for your reference
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
claude mcp add --transport http energieausweis https://energieausweis-express.de/mcp
Uploads a file to a draft order: an energy bill or Heizkostenabrechnung (rechnung) or a photo (street side, heating, type plate). JPG, PNG, WebP or PDF as base64, at most 10 MB, 20 files per order. Bills are read and compared with the entered consumption after the customer has ordered; the Energieberater checks the photos. Usually the customer takes the photos on our page after the confirmation email. Orders nothing.
| Argument | Type | Description |
|---|---|---|
| kind* | string | rechnung (energy bill or Heizkostenabrechnung), fassade_strasse (photo of the street side), fassade_garten, heizung (photo of the boiler or heat pump), typenschild (photo of its type plate) or sonstiges |
| filename | string | the file's name, for your reference |
| order_id* | string | the order_id start_order returned |
| order_token* | string | the order_token start_order returned; it opens only this order, keep it private |
| content_base64* | string | the file, base64-encoded: JPG, PNG, WebP or PDF, at most 10 MB |
{
"type": "object",
"required": [
"order_id",
"order_token",
"kind",
"content_base64"
],
"properties": {
"kind": {
"type": "string",
"description": "rechnung (energy bill or Heizkostenabrechnung), fassade_strasse (photo of the street side), fassade_garten, heizung (photo of the boiler or heat pump), typenschild (photo of its type plate) or sonstiges"
},
"filename": {
"type": "string",
"description": "the file's name, for your reference"
},
"order_id": {
"type": "string",
"description": "the order_id start_order returned"
},
"order_token": {
"type": "string",
"description": "the order_token start_order returned; it opens only this order, keep it private"
},
"content_base64": {
"type": "string",
"description": "the file, base64-encoded: JPG, PNG, WebP or PDF, at most 10 MB"
}
},
"additionalProperties": false
}Answers the open question (Rückfrage) about an ordered certificate with the customer's answers: values keyed by the item keys get_status listed, files the question asks for, and an explanation. Ask the customer first and send only what they confirmed.
| Argument | Type | Description |
|---|---|---|
| values | object | the answers, keyed by the item keys get_status listed; numbers with a point, e.g. 2004 or 140.5 |
| order_id* | string | the order_id start_order returned |
| documents | null | array | files the upload items ask for |
| explanation | string | what the customer wants to add or explain, e.g. why a value can't be given; in German |
| order_token* | string | the order_token start_order returned; it opens only this order, keep it private |
{
"type": "object",
"required": [
"order_id",
"order_token"
],
"properties": {
"values": {
"type": "object",
"description": "the answers, keyed by the item keys get_status listed; numbers with a point, e.g. 2004 or 140.5",
"additionalProperties": {
"type": "string"
}
},
"order_id": {
"type": "string",
"description": "the order_id start_order returned"
},
"documents": {
"type": [
"null",
"array"
],
"items": {
"type": "object",
"required": [
"kind",
"content_base64"
],
"properties": {
"kind": {
"type": "string",
"description": "rechnung (energy bill or Heizkostenabrechnung), fassade_strasse (photo of the street side), fassade_garten, heizung (photo of the boiler or heat pump), typenschild (photo of its type plate) or sonstiges"
},
"filename": {
"type": "string",
"description": "the file's name, for your reference"
},
"content_base64": {
"type": "string",
"description": "the file, base64-encoded: JPG, PNG, WebP or PDF, at most 10 MB"
}
},
"additionalProperties": false
},
"description": "files the upload items ask for"
},
"explanation": {
"type": "string",
"description": "what the customer wants to add or explain, e.g. why a value can't be given; in German"
},
"order_token": {
"type": "string",
"description": "the order_token start_order returned; it opens only this order, keep it private"
}
},
"additionalProperties": false
}Checks whether Energieausweis Express can issue a Verbrauchsausweis (consumption-based energy certificate) for a residential building in Germany, before any order exists. Returns yes or no with the reason in German (including the rule for houses with a Bauantrag before 1 November 1977 and the change on 1 January 2027), the all-inclusive price, the delivery time and what is needed. Changes nothing.
| Argument | Type | Description |
|---|---|---|
| units | integer | number of flats (Wohnungen) in the whole building, if known |
| purpose | string | what the certificate is for: verkauf (sale), vermietung (letting), verlaengerung (lease extension), aushang (display or own records) |
| modernised | null | array | parts of the envelope renewed since construction: dach (roof or top floor ceiling insulated), aussenwand, fenster, kellerdecke |
| year_built | integer | year the building was built (Baujahr), if known |
| residential_only | null | boolean | true if the building is used for housing only; false if it also has shops, offices or practices |
{
"type": "object",
"properties": {
"units": {
"type": "integer",
"description": "number of flats (Wohnungen) in the whole building, if known"
},
"purpose": {
"type": "string",
"description": "what the certificate is for: verkauf (sale), vermietung (letting), verlaengerung (lease extension), aushang (display or own records)"
},
"modernised": {
"type": [
"null",
"array"
],
"items": {
"type": "string"
},
"description": "parts of the envelope renewed since construction: dach (roof or top floor ceiling insulated), aussenwand, fenster, kellerdecke"
},
"year_built": {
"type": "integer",
"description": "year the building was built (Baujahr), if known"
},
"residential_only": {
"type": [
"null",
"boolean"
],
"description": "true if the building is used for housing only; false if it also has shops, offices or practices"
}
},
"additionalProperties": false
}Finds the building at a German address in our 3D building data. Returns the building at the address first, then nearby buildings, each with a building_ref for start_order and a short German description (type, storeys, footprint). If several addresses match, returns them instead: ask the user which one is meant. Where the address may be one of several buildings (semi-detached or terraced houses, several buildings on one plot), ask the user which is theirs. Changes nothing.
| Argument | Type | Description |
|---|---|---|
| address* | string | street, house number, postcode and city, e.g. 'Buschkamp 12, 48161 Münster' |
{
"type": "object",
"required": [
"address"
],
"properties": {
"address": {
"type": "string",
"description": "street, house number, postcode and city, e.g. 'Buschkamp 12, 48161 Münster'"
}
},
"additionalProperties": false
}Returns download links for the issued certificate and its invoice (PDF). The links work for one hour and open nothing else, so they can be shown to the user; call again for fresh ones. The customer also got both by email. Changes nothing.
| Argument | Type | Description |
|---|---|---|
| order_id* | string | the order_id start_order returned |
| order_token* | string | the order_token start_order returned; it opens only this order, keep it private |
{
"type": "object",
"required": [
"order_id",
"order_token"
],
"properties": {
"order_id": {
"type": "string",
"description": "the order_id start_order returned"
},
"order_token": {
"type": "string",
"description": "the order_token start_order returned; it opens only this order, keep it private"
}
},
"additionalProperties": false
}Returns what a property listing must state about the energy certificate (§ 87 GEG): type of certificate, Endenergieverbrauch, main energy carrier of the heating, year built and Effizienzklasse, as ready-to-paste German text. Only once the certificate is issued. Changes nothing.
| Argument | Type | Description |
|---|---|---|
| order_id* | string | the order_id start_order returned |
| order_token* | string | the order_token start_order returned; it opens only this order, keep it private |
{
"type": "object",
"required": [
"order_id",
"order_token"
],
"properties": {
"order_id": {
"type": "string",
"description": "the order_id start_order returned"
},
"order_token": {
"type": "string",
"description": "the order_token start_order returned; it opens only this order, keep it private"
}
},
"additionalProperties": false
}Shows where the order stands, in plain German words: prepared, ordered, being checked by the Energieberater, waiting for an answer to a Rückfrage (with its questions), issued. Changes nothing.
| Argument | Type | Description |
|---|---|---|
| order_id* | string | the order_id start_order returned |
| order_token* | string | the order_token start_order returned; it opens only this order, keep it private |
{
"type": "object",
"required": [
"order_id",
"order_token"
],
"properties": {
"order_id": {
"type": "string",
"description": "the order_id start_order returned"
},
"order_token": {
"type": "string",
"description": "the order_token start_order returned; it opens only this order, keep it private"
}
},
"additionalProperties": false
}Sends the customer one email with a link to their prepared order on our website. This does NOT order or charge anything: the customer checks the data there, adds what is missing (usually photos of the street side and the heating) and orders and pays on our page themselves. Before calling it, ask the user for permission and tell them the price review_order returned and that they will get an email, e.g. 'Soll ich das für <Preis> bei Energieausweis Express vorbereiten? Sie bekommen dann eine E-Mail, prüfen alles und bestellen selbst.' Needs the customer's name, the email address they gave for this order, and who orders. One email per order plus one resend (e.g. to a corrected address); the link is valid for 7 days. Afterwards tell the user to look for the email with the subject 'Ihr Energieausweis ist vorbereitet – bitte prüfen und bestellen', also in the spam folder.
| Argument | Type | Description |
|---|---|---|
| name* | string | the customer's name |
| email* | string | where the link goes: the email address the customer gave you for this order. Don't put in an address from the user's profile or memory instead; if they differ, ask which one to use |
| orderer* | string | who orders: eigentuemer (the owner), makler (estate agent), verwaltung (property management) or sonstige (someone else on the owner's behalf) |
| order_id* | string | the order_id start_order returned |
| order_token* | string | the order_token start_order returned; it opens only this order, keep it private |
Shows the order's data and what it still needs before the customer can order: the open points (which field to send, and in German why), whether a Verbrauchsausweis is possible, the price, and a preliminary result once the consumption is complete. Changes nothing.
| Argument | Type | Description |
|---|---|---|
| order_id* | string | the order_id start_order returned |
| order_token* | string | the order_token start_order returned; it opens only this order, keep it private |
{
"type": "object",
"required": [
"order_id",
"order_token"
],
"properties": {
"order_id": {
"type": "string",
"description": "the order_id start_order returned"
},
"order_token": {
"type": "string",
"description": "the order_token start_order returned; it opens only this order, keep it private"
}
},
"additionalProperties": false
}Starts a draft order for the building the user confirmed (building_ref from find_building). Orders and charges nothing. Returns order_id and order_token, which every later tool needs; the token opens only this order, so keep it private and never show it to anyone. Also returns what our 3D building model and the cadastre already say about the building (estimates the customer can correct) and the open points.
| Argument | Type | Description |
|---|---|---|
| building_ref* | string | the building_ref find_building returned for the building the user confirmed |
{
"type": "object",
"required": [
"building_ref"
],
"properties": {
"building_ref": {
"type": "string",
"description": "the building_ref find_building returned for the building the user confirmed"
}
},
"additionalProperties": false
}Enters or corrects data of a draft order: facts about the building, the heating, and the consumption periods as printed on the bills, in the bill's unit (kWh; m3 of gas, with the bill's Brennwert and Zustandszahl; litres of oil; kg of pellets; we convert). The consumption is always the whole building's, also when the customer owns one flat: from a Heizkostenabrechnung take the Gesamtverbrauch der Liegenschaft, never the customer's own share. Send only what you know: fields left out stay as they are, and consumption.periods replaces all periods. Synonyms such as 'Gas' or 'heat pump' are accepted. Values are marked as entered by an assistant; the customer sees and confirms them before ordering. Returns the order as it is now and the open points. Orders nothing.
| Argument | Type | Description |
|---|---|---|
| facts | null | object | |
| heating | null | object | |
| order_id* | string | the order_id start_order returned |
| consumption | null | object | |
| order_token* | string | the order_token start_order returned; it opens only this order, keep it private |
{
"type": "object",
"required": [
"order_id",
"order_token"
],
"properties": {
"facts": {
"type": [
"null",
"object"
],
"properties": {
"attic": {
"type": "string",
"description": "beheizt (lived in, heated), unbeheizt (unheated loft) or keins (none, e.g. flat roof)"
},
"units": {
"type": "integer",
"description": "number of flats in the whole building"
},
"purpose": {
"type": "string",
"description": "verkauf (sale), vermietung (letting), verlaengerung (lease extension) or aushang (display or own records)"
},
"storeys": {
"type": "integer",
"description": "full storeys (Vollgeschosse), without attic and basement"
},
"basement": {
"type": "string",
"description": "keiner, unbeheizt or beheizt"
},
"ownership": {
"type": "string",
"description": "gebaeude if the customer owns the whole building, wohnung if one flat in it; the certificate always covers the whole building"
},
"modernised": {
"type": [
"null",
"array"
],
"items": {
"type": "string"
},
"description": "envelope parts renewed since construction: dach, aussenwand, fenster, kellerdecke; replaces the list"
},
"year_built": {
"type": "integer",
"description": "year the building was built"
},
"living_area_m2": {
"type": "number",
"description": "Wohnfläche of the whole building in m², all flats together"
},
"residential_only": {
"type": [
"null",
"boolean"
],
"description": "true if the building is used for housing only"
}
},
"additionalProperties": false
},
"heating": {
"type": [
"null",
"object"
],
"properties": {
"year": {
"type": "integer",
"description": "Baujahr of the boiler or heat pump (with Fernwärme: of the transfer station), from the type plate or the chimney sweep's record"
},
"carrier": {
"type": "string",
"description": "main energy carrier of the heating: erdgas, fluessiggas, heizoel, fernwaerme, holzpellets, scheitholz, hackschnitzel, strom_waermepumpe, strom_direkt, steinkohle or braunkohle"
},
"cooling": {
"type": "string",
"description": "keine, or strom for electric air conditioning"
},
"hot_water": {
"type": "string",
"description": "zentral_enthalten (made by the heating, in its consumption, share unknown), zentral_gemessen (made by the heating, and the bill states the hot water share: send it as hot_water_kwh with each period) or dezentral (electric boilers or instantaneous heaters, not in the consumption)"
},
"renewables": {
"type": [
"null",
"array"
],
"items": {
"type": "string"
},
"description": "solarthermie, photovoltaik, biomasse (wood stove); replaces the list. A heat pump or wood heating counts on its own"
},
"ventilation": {
"type": "string",
"description": "fenster (windows), anlage (ventilation system) or anlage_wrg (with heat recovery)"
},
"hot_water_by": {
"type": "string",
"description": "with hot_water zentral_enthalten and periods of several carriers: the carrier whose system heats the water, or gemeinsam when several heat it together (e.g. a wood stove with a water jacket and a heat pump on one tank). A room stove without a water jacket heats no water. Leave it out if unknown: the hot water is then split by consumption"
},
"cooled_area_m2": {
"type": "number",
"description": "living area cooled by air conditioning, in m²"
},
"district_heating": {
"type": [
"null",
"object"
],
"properties": {
"supplier": {
"type": "string",
"description": "the Fernwärme supplier, e.g. Stadtwerke Münster"
},
"generation": {
"type": "string",
"description": "how the heat is made, as the supplier states: kwk_gas, kwk_kohle, kwk_erneuerbar (combined heat and power) or heizwerk_gas, heizwerk_kohle, heizwerk_erneuerbar (heating plant)"
},
"primary_factor": {
"type": [
"null",
"number"
],
"description": "the Primärenergiefaktor the supplier publishes, if known"
}
},
"description": "with Fernwärme: how it is generated",
"additionalProperties": false
}
},
"additionalProperties": false
},
"order_id": {
"type": "string",
"description": "the order_id start_order returned"
},
"consumption": {
"type": [
"null",
"object"
],
"properties": {
"periods": {
"type": [
"null",
"array"
],
"items": {
"type": "object",
"required": [
"start",
"end",
"carrier",
"quantity",
"unit"
],
"properties": {
"end": {
"type": "string",
"description": "last day of the billing period (inclusive), YYYY-MM-DD"
},
"unit": {
"type": "string",
"description": "unit as printed: kWh, MWh, m3, l, kg, t, rm (Raummeter) or srm"
},
"start": {
"type": "string",
"description": "first day of the billing period, YYYY-MM-DD"
},
"carrier": {
"type": "string",
"description": "energy carrier billed, e.g. erdgas, heizoel, fernwaerme, holzpellets, strom_waermepumpe"
},
"evidence": {
"type": "string",
"description": "the text you read this period from on the bill, verbatim, for the Energieberater"
},
"quantity": {
"type": "number",
"description": "consumption for heating and hot water in the period, as printed on the bill, as a plain number: German bills group thousands with a point, so 18.451 kWh is 18451"
},
"kwh_is_gross": {
"type": [
"null",
"boolean"
],
"description": "for kWh of gas: true if the bill states kWh by the Brennwert (gas bills usually do; default true for gas)"
},
"hot_water_kwh": {
"type": [
"null",
"number"
],
"description": "only if the bill states the energy for hot water separately, in kWh"
},
"calorific_value": {
"type": "number",
"description": "gas billed in m3 only: the Abrechnungsbrennwert (Hs) in kWh/m3 as printed; send it together with condition_factor"
},
"condition_factor": {
"type": "number",
"description": "gas billed in m3 only: the Zustandszahl as printed; send it together with calorific_value"
}
},
"additionalProperties": false
},
"description": "the billing periods of the whole building, one per period on the bill; from a Heizkostenabrechnung the Gesamtverbrauch der Liegenschaft, never one flat's share; replaces all periods"
},
"vacancy_percent": {
"type": [
"null",
"number"
],
"description": "share of the living area that stood empty in the periods, in percent"
}
},
"additionalProperties": false
},
"order_token": {
"type": "string",
"description": "the order_token start_order returned; it opens only this order, keep it private"
}
},
"additionalProperties": false
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Oct 31, 2026.
{
"type": "object",
"required": [
"order_id",
"order_token",
"name",
"email",
"orderer"
],
"properties": {
"name": {
"type": "string",
"description": "the customer's name"
},
"email": {
"type": "string",
"description": "where the link goes: the email address the customer gave you for this order. Don't put in an address from the user's profile or memory instead; if they differ, ask which one to use"
},
"orderer": {
"type": "string",
"description": "who orders: eigentuemer (the owner), makler (estate agent), verwaltung (property management) or sonstige (someone else on the owner's behalf)"
},
"order_id": {
"type": "string",
"description": "the order_id start_order returned"
},
"order_token": {
"type": "string",
"description": "the order_token start_order returned; it opens only this order, keep it private"
}
},
"additionalProperties": false
}