_ registry / mcp streamable-http · checked 3h ago

afamax-public-afa-api

https://rundum.immo

Registry code: ebb32d11e610e6e6

api record

Stateless MCP server for German property owners. Read-only tools: afa_calculate for property depreciation, calculate_purchase_price_allocation for Kaufpreisaufteilung, get_price_by_product for AfAMax appraisal prices and get_available_appointments for free initial-call slots. book_appointment books one of those slots in two steps: it emails the user a 6-digit code, and only the code the user reads back confirms the booking. Read the afa_calculate description before calling it: modernization detail materially changes the result, and omitting it returns an upper bound rather than a realistic…

endpoint
https://afamax.de/api/mcp
protocol
streamable-http ·2025-06-18
authentication
none observed
public key
none — nobody has proven they own this listing
karma
0 · newcomer
reachable
live
uptime, 30 days
100%

90 days 100%· all time 100%

latency
680ms

last good check

priced tools
0

of 5 tools

_ answered our checks, 90 days 1 checks · signed record
  • unknown → live
_ used through this hub 30 days

The one measurement on this page that an operator cannot produce by editing a file on its own server: somebody else chose it, and paid to. Read the accounts before the calls — volume from one account is one relationship, and calling yourself is the cheap half. Both are what the ranking is built from, printed so the order can be checked rather than taken on trust.

accounts
0

distinct, expensive to fake

calls served
0

successful, last 30 days

_ what it can do 5 tools
1 open 4 never probed 1 of 5 classified

Price is per tool, not per server. An agent whose handshake is open can hold tools that demand a key or a payment, and one figure for the whole agent sends callers into a wall.

  • get_available_appointments open 3h ago

    Lists open slots for a free, non-binding 15-minute initial phone call with the AfAMax team (Erstgespräch), on weekdays in the Europe/Berlin time zone, grouped by day. Each day lists a sample spread across the day (`maxSlotsPerDay`, default 8) and its `freeSlotCount`; for a specific time, call again for that day with `days: 1` and `maxSlotsPerDay: 32`. Show the user the day and `localTime`; to book one, pass its `startDateTime` unchanged to book_appointment. Slots are live and can be taken at any time, so re-check rather than reusing an old list. `attribution` links to the contact page, where the user can also book directly.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "properties": {
        "days": {
          "type": "integer",
          "maximum": 21,
          "minimum": 1,
          "description": "How many calendar days to look ahead (1-21, default 7). / Anzahl Tage."
        },
        "from": {
          "type": "string",
          "format": "date-time",
          "description": "ISO 8601 date-time to start looking from. Defaults to now. / Frühester Zeitpunkt."
        },
        "locale": {
          "enum": [
            "de",
            "en"
          ],
          "type": "string",
          "default": "de",
          "description": "Language of the booking emails, the link handed back and the response labels. Match the user's language (most users are German-speaking). / Sprache der E-Mails und des Links."
        },
        "maxSlotsPerDay": {
          "type": "integer",
          "maximum": 32,
          "minimum": 1,
          "description": "How many slots to list per day (1-32, default 8), spread evenly across the day. When the user wants a specific time, call again for that day with `days: 1` and `maxSlotsPerDay: 32`."
        }
      },
      "additionalProperties": false
    }
    arguments 33 lines
  • afa_calculate unknown 3h ago

    Computes a free, non-binding estimate of the German AfA (Absetzung für Abnutzung / building depreciation) rate, annual and monthly depreciation amount, and the resulting annual/monthly tax effect for a residential property in Germany. Results are provided by AfAMax (afamax.de) and `attribution` links to the same calculation on the AfAMax calculator, with these inputs already filled in — cite it as the source when you report the figure. IMPORTANT: omitting both `modernization` and `modernizationLevel` scores the building as fully unmodernized, which returns the HIGHEST possible figure for the given inputs — the real figure is very likely lower. Before reporting a final number, ask the user the eight modernization questions — roof, façade insulation, windows/doors, heating, utilities, bathrooms, interior fit-out and floor plan — and pass the answers via `modernization`. Each of those fields carries the exact question the AfAMax website asks, in English and German, together with what does and does not count and what each of the five levels means: put those to the user rather than improvising your own wording, and ask them in the user's own language (most users are German-speaking — set `locale` to match, since it decides the language of the link handed back). When the response sets `assumptions.modernizationAssumedNone: true`, say so in your reply — do not quote the figure as a bare number. Check `results.appraisalWorthwhile`: when false, the remaining-useful-life rate does not beat the statutory default rate for this construction year, so an appraisal would not reduce the caller's tax burden — say so plainly instead of quoting `annualTaxSavings` as a saving. For a multi-family building, pass the whole building's floor area and purchase price to get the building-level figure; to get a figure for one flat, call again with that flat's living area and purchase price, keeping construction year and modernization the same — there are no per-unit or floor-count inputs.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "propertyType",
        "constructionYear",
        "floorArea"
      ],
      "properties": {
        "locale": {
          "enum": [
            "de",
            "en"
          ],
          "type": "string",
          "default": "de",
          "description": "Language of the disclaimer, the call-to-action label and the call-to-action link. Set it to the language the user is speaking — most AfAMax users are German-speaking, and \"de\" is the default — so the link you hand them opens the calculator in their language."
        },
        "taxRate": {
          "type": "number",
          "maximum": 0.6,
          "description": "Marginal income tax rate as a decimal (e.g. 0.42 for 42%). Defaults to 0.42.",
          "exclusiveMinimum": 0
        },
        "landArea": {
          "type": "number",
          "minimum": 0,
          "description": "EN: Land area (m²) Required together with the standard land value for allocation. | DE: Grundstücksfläche (m²) Zusammen mit dem Bodenwert für die Aufteilung benötigt. Only useful together with standardLandValue — one without the other is ignored and the building share falls back to a flat 75%. Ignored unless purchasePrice is also supplied — without it the building value is estimated from floor area alone, and the response echoes this field back as null."
        },
        "floorArea": {
          "type": "number",
          "maximum": 100000,
          "minimum": 10,
          "description": "EN: Living/Usable area (m²) The total living area | DE: Wohn-/Nutzfläche (m²) Die Gesamtfläche des Wohnraums In square meters."
        },
        "propertyType": {
          "enum": [
            "CONDOMINIUM",
            "SINGLE_FAMILY_HOUSE",
            "TWO_FAMILY_HOUSE",
            "ROW_HOUSE",
            "SEMI_DETACHED",
            "APARTMENT_BUILDING",
            "RESIDENTIAL_COMMERCIAL_BUILDING"
          ],
          "type": "string",
          "description": "The type of property being valuated: CONDOMINIUM = Condominium / Eigentumswohnung — SINGLE_FAMILY_HOUSE = Single-family house / Einfamilienhaus — TWO_FAMILY_HOUSE = Two-family house / Zweifamilienhaus — ROW_HOUSE = Row house / Reihenhaus — SEMI_DETACHED = Semi-detached house / Doppelhaushälfte — APARTMENT_BUILDING = Apartment building / Mehrfamilienhaus — RESIDENTIAL_COMMERCIAL_BUILDING = Residential and commercial building / Wohn- und Geschäftshaus. Commercial properties are not supported — their useful life depends on a subtype this contract does not carry."
        },
        "modernization": {
          "type": "object",
          "properties": {
            "roof": {
              "enum": [
                "NOT_MODERNIZED",
                "SLIGHTLY_MODERNIZED",
                "PARTIALLY_MODERNIZED",
                "MOSTLY_MODERNIZED",
                "FULLY_MODERNIZED"
              ],
              "type": "string",
              "description": "EN: Has the roof been substantially renewed? This includes new roofing, new insulation, or major roof renovation. Counts as modernization: complete re-roofing, new insulation, or extensive roof renovation. Does not count: replacing a few tiles, minor sealing work, or small repairs. Tip: If only a small portion of the roof was renewed, choose “minor” or “partial”. | DE: Wurde das Dach in größerem Umfang erneuert? Gemeint sind Neueindeckung, neue Dämmung oder eine größere Dachsanierung. **Was zählt:** komplette Neueindeckung, neue Dämmung oder umfangreiche Dachsanierung. **Was zählt nicht:** einzelne Ziegel austauschen, Abdichtungen im kleinen Umfang oder punktuelle Reparaturen. **Tipp:** Wenn nur ein kleiner Teil der Dachfläche gemacht wurde, wählen Sie eher „leicht“ oder „teilweise“."
            },
            "heating": {
              "enum": [
                "NOT_MODERNIZED",
                "SLIGHTLY_MODERNIZED",
                "PARTIALLY_MODERNIZED",
                "MOSTLY_MODERNIZED",
                "FULLY_MODERNIZED"
              ],
              "type": "string",
              "description": "EN: Has the heating system been renewed? This mainly refers to replacement of the main heat generator (e.g., boiler or heat pump). Counts as modernization: new boiler, new heat pump, connection to district heating, or comparable replacement of the central heat generator. Does not count: replacing individual components (e.g., circulation pump, controls, thermostats) without replacing the main heating unit. Tip: If only individual parts were replaced, choose “minor” or “partial”. | DE: Wurde die Heizungsanlage erneuert? Gemeint ist vor allem der Austausch des Wärmeerzeugers (z. B. Kessel, Wärmepumpe) inkl. zentraler Anlagentechnik. **Was zählt:** neuer Heizkessel, neue Wärmepumpe, Fernwärmeanschluss oder vergleichbarer Austausch des zentralen Wärmeerzeugers. **Was zählt nicht:** Austausch einzelner Teile (z. B. Umwälzpumpe, Brenner, Thermostate) ohne Erneuerung des Wärmeerzeugers. **Tipp:** Wenn nur Komponenten erneuert wurden, wählen Sie eher „leicht“ oder „teilweise“."
            },
            "bathrooms": {
              "enum": [
                "NOT_MODERNIZED",
                "SLIGHTLY_MODERNIZED",
                "PARTIALLY_MODERNIZED",
                "MOSTLY_MODERNIZED",
                "FULLY_MODERNIZED"
              ],
              "type": "string",
              "description": "EN: Has the bathroom been fully modernized? This refers to complete renewal of sanitary fixtures, tiles, and waterproofing. Counts as modernization: full bathroom renovation (e.g., new shower/bathtub, toilet, tiles, waterproofing — typically “everything new”). Does not count: replacing only a sink, fittings, or a few tiles. Tip: If only parts were renewed, choose “minor” or “partial”. | DE: Wurde das Badezimmer komplett modernisiert? Gemeint ist eine vollständige Erneuerung von Sanitärobjekten, Fliesen und Abdichtung. **Was zählt:** komplette Badmodernisierung (z. B. neue Dusche/Badewanne, WC, Fliesen, Abdichtung – typischerweise „alles neu“). **Was zählt nicht:** Austausch einzelner Elemente (z. B. nur Waschbecken, Armaturen oder einzelne Fliesen). **Tipp:** Wenn nur Teile erneuert wurden, wählen Sie eher „leicht“ oder „teilweise“."
            },
            "utilities": {
              "enum": [
                "NOT_MODERNIZED",
                "SLIGHTLY_MODERNIZED",
                "PARTIALLY_MODERNIZED",
                "MOSTLY_MODERNIZED",
                "FULLY_MODERNIZED"
              ],
              "type": "string",
              "description": "EN: Have electrical or plumbing systems been substantially renewed? This includes renewal of electrical wiring and water/wastewater pipes throughout the building. Counts as modernization: new electrical wiring (including distribution board) or new water/wastewater pipes on a larger scale. Does not count: new sockets, switches, fixtures, or short pipe sections only. Tip: What matters is whether the internal systems were renewed — not just visible elements. | DE: Wurden Strom- oder Wasserleitungen umfassend erneuert? Gemeint ist die Erneuerung der Elektroinstallation sowie Wasser- und Abwasserleitungen im Gebäude. **Was zählt:** neue Elektroverkabelung (inkl. Verteiler/Sicherungskasten) oder neue Wasser-/Abwasserleitungen im größeren Umfang. **Was zählt nicht:** neue Steckdosen/Schalter, neue Armaturen oder einzelne kurze Leitungsabschnitte. **Tipp:** Entscheidend ist, ob Leitungen im Gebäude erneuert wurden – nicht nur sichtbare Elemente."
            },
            "windowsDoors": {
              "enum": [
                "NOT_MODERNIZED",
                "SLIGHTLY_MODERNIZED",
                "PARTIALLY_MODERNIZED",
                "MOSTLY_MODERNIZED",
                "FULLY_MODERNIZED"
              ],
              "type": "string",
              "description": "EN: Have most windows and exterior doors been replaced? This refers to replacement with modern units (e.g., double or triple glazing). Counts as modernization: replacing windows or exterior doors with modern insulated units. If only a few windows were replaced, this is considered a partial modernization. Tip: If nearly all windows were replaced, choose “largely” or “fully”. | DE: Wurden die meisten Fenster und Außentüren ausgetauscht? Gemeint ist der Austausch gegen moderne Fenster/Türen (z. B. Isolier- oder Dreifachverglasung). **Was zählt:** Austausch von Fenstern oder Außentüren gegen neue Elemente (z. B. Isolier- oder Dreifachverglasung). Wenn nur einzelne Fenster ersetzt wurden, gilt das als Teilmodernisierung. **Tipp:** Wurden fast alle Fenster erneuert, wählen Sie eher „weitgehend“ oder „vollständig“."
            },
            "interiorFitout": {
              "enum": [
                "NOT_MODERNIZED",
                "SLIGHTLY_MODERNIZED",
                "PARTIALLY_MODERNIZED",
                "MOSTLY_MODERNIZED",
                "FULLY_MODERNIZED"
              ],
              "type": "string",
              "description": "EN: Has the interior finish been substantially renewed? For example new flooring, interior doors, ceilings/walls, or larger interior renovations (excluding bathrooms). Counts as modernization: new flooring in large areas, new interior doors, staircase renovation, or extensive interior upgrades. Does not count: painting, wallpapering, or cosmetic repairs only. Tip: The more permanently renewed (not just cosmetic), the higher the modernization level. | DE: Wurde die Innenausstattung umfassend erneuert? Zum Beispiel neue Böden, Innentüren, Decken/Wände oder größere Innenumbauten (ohne Badezimmer). **Was zählt:** neue Bodenbeläge in großen Bereichen, neue Innentüren, Treppensanierung oder umfassender Innenausbau. **Was zählt nicht:** Streichen, Tapezieren oder reine Schönheitsreparaturen. **Tipp:** Je mehr dauerhaft erneuert wurde (nicht nur optisch), desto höher ist der Modernisierungsgrad."
            },
            "facadeInsulation": {
              "enum": [
                "NOT_MODERNIZED",
                "SLIGHTLY_MODERNIZED",
                "PARTIALLY_MODERNIZED",
                "MOSTLY_MODERNIZED",
                "FULLY_MODERNIZED"
              ],
              "type": "string",
              "description": "EN: Has the façade been substantially renewed or insulated? For example new thermal insulation (ETICS), new exterior plaster, or new façade cladding. Counts as modernization: full façade insulation (ETICS), complete renewal of exterior plaster, or large-scale replacement of façade cladding. Does not count: repainting or small repair areas. | DE: Wurde die Fassade umfassend erneuert oder gedämmt? Zum Beispiel neue Wärmedämmung (WDVS), neuer Außenputz oder neue Fassadenbekleidung. **Was zählt:** komplette Fassadendämmung (WDVS), vollständige Erneuerung des Außenputzes oder Austausch der Fassadenbekleidung über große Flächen. **Was zählt nicht:** neuer Anstrich, kleinere Ausbesserungen oder Teilflächen ohne wesentliche Erneuerung."
            },
            "floorplanImprovement": {
              "enum": [
                "NOT_MODERNIZED",
                "SLIGHTLY_MODERNIZED",
                "PARTIALLY_MODERNIZED",
                "MOSTLY_MODERNIZED",
                "FULLY_MODERNIZED"
              ],
              "type": "string",
              "description": "EN: Has the internal layout been structurally changed? For example removing or relocating walls, combining or dividing rooms. Counts as modernization: structural changes to room layout (e.g., removing or relocating walls, reconfiguring rooms). Does not count: rearranging furniture or changes without construction work. Tip: Even non-load-bearing wall changes may be relevant if the layout was significantly altered. | DE: Wurde die Raumaufteilung baulich verändert? Zum Beispiel Wände entfernt/versetzt oder Räume neu aufgeteilt. **Was zählt:** bauliche Änderungen der Raumaufteilung (z. B. Wände entfernen/versetzen, Räume zusammenlegen/teilen). **Was zählt nicht:** Möbel umstellen oder reine Nutzungsänderungen ohne Baumaßnahmen. **Tipp:** Auch Änderungen an nichttragenden Wänden können relevant sein, wenn sie die Aufteilung deutlich verändern."
            }
          },
          "description": "Per-category modernization detail. Ask the user all eight questions (each field description carries the exact question, in English and German, that the AfAMax website asks, plus what does and does not count) — this produces a materially more accurate result than the modernizationLevel shorthand. Every field takes one of the same five levels, which mean: NOT_MODERNIZED = EN \"Not modernized / older than 15 years\" (No modernization work in the last 15 years) / DE \"Nicht modernisiert / älter als 15 Jahre\" (Keine Modernisierungsarbeiten in den letzten 15 Jahren) — SLIGHTLY_MODERNIZED = EN \"Slightly modernized (10-15 years ago)\" (Minor modernization work 10-15 years ago) / DE \"Leicht modernisiert (vor 10-15 Jahren)\" (Geringfügige Modernisierungsarbeiten vor 10-15 Jahren) — PARTIALLY_MODERNIZED = EN \"Partially modernized (5-10 years ago)\" (Significant modernization work 5-10 years ago) / DE \"Teilweise modernisiert (vor 5-10 Jahren)\" (Erhebliche Modernisierungsarbeiten vor 5-10 Jahren) — MOSTLY_MODERNIZED = EN \"Mostly modernized (2-5 years ago)\" (Extensive modernization work 2-5 years ago) / DE \"Weitgehend modernisiert (vor 2-5 Jahren)\" (Umfassende Modernisierungsarbeiten vor 2-5 Jahren) — FULLY_MODERNIZED = EN \"Fully modernized (<2 years ago)\" (Complete modernization in the last 2 years) / DE \"Vollständig modernisiert (<2 Jahre)\" (Vollständige Modernisierung in den letzten 2 Jahren). Wins over modernizationLevel for any category it sets.",
          "additionalProperties": false
        },
        "purchasePrice": {
          "type": "number",
          "minimum": 0,
          "description": "EN: Total purchase price (€) Required – total contract amount including land. | DE: Kaufpreis gesamt (€) Pflichtfeld – Vertragssumme inklusive Grundstück. Optional here: omit it to get an assumed-value estimate derived from floor area, which the response flags via assumptions.buildingValueAssumed. Supplying it is the single biggest accuracy win after modernization."
        },
        "constructionYear": {
          "type": "integer",
          "minimum": 1800,
          "description": "EN: Year of construction | DE: Baujahr Year the building was completed."
        },
        "includedInventory": {
          "type": "number",
          "minimum": 0,
          "description": "EN: Included inventory (€) e.g. kitchen, furniture, etc. | DE: Mitverkauftes Inventar (€) z.B. Küche, Möbel usw. Ignored unless purchasePrice is also supplied — without it the building value is estimated from floor area alone, and the response echoes this field back as null."
        },
        "standardLandValue": {
          "type": "number",
          "minimum": 0,
          "description": "EN: Standard land value (€/m²) Values can be obtained from BORIS-D or the local authority. | DE: Bodenrichtwert (€/m²) Werte können aus BORIS-D oder der Kommune entnommen werden. In EUR per square meter. Ignored unless purchasePrice is also supplied — without it the building value is estimated from floor area alone, and the response echoes this field back as null."
        },
        "coreRenovationYear": {
          "type": "integer",
          "minimum": 1801,
          "description": "EN: Core Renovation Completed Complete renovation of nearly all building systems (roof, facade, windows, heating, electrical, plumbing, interior) IMPORTANT: For core renovations, this year is used as the new \"construction year\"! The RUL is calculated from this point forward (max. 90% instead of 70% of total useful life). | DE: Kernsanierung durchgeführt Umfassende Sanierung nahezu aller Gebäudesysteme (Dach, Fassade, Fenster, Heizung, Elektrik, Sanitär, Innenausbau) WICHTIG: Bei Kernsanierungen wird dieses Jahr als neues Baujahr verwendet! Die restliche Nutzungsdauer wird somit ab diesem Jahr berechnet (laut Gesetz max. 90% statt 70% der Gesamtnutzungsdauer)."
        },
        "modernizationLevel": {
          "enum": [
            "none",
            "partial",
            "extensive"
          ],
          "type": "string",
          "description": "Shorthand modernization state applied to all 8 categories at once: \"none\" (NOT_MODERNIZED), \"partial\" (PARTIALLY_MODERNIZED), or \"extensive\" (FULLY_MODERNIZED) — see the `modernization` field for what those levels mean. Omitting both this and `modernization` scores the property as fully UNMODERNIZED, which returns the HIGHEST possible tax saving for the given inputs — the response flags this via assumptions.modernizationAssumedNone. Prefer the more detailed `modernization` field when the user can answer per-category questions."
        },
        "purchaseRelatedCosts": {
          "type": "number",
          "minimum": 0,
          "description": "EN: Purchase-related costs (€) Real estate transfer tax, notary, court, broker. | DE: Kaufnebenkosten (€) Grunderwerbsteuer, Notar, Gericht, Makler. Omit to default to 10% of the purchase price. Ignored unless purchasePrice is also supplied — without it the building value is estimated from floor area alone, and the response echoes this field back as null."
        }
      },
      "additionalProperties": false
    }
    arguments 185 lines
  • calculate_purchase_price_allocation unknown 3h ago

    Calculates a free, non-binding allocation of a German property purchase price between land and building using the BMF Arbeitshilfe. Returns the applied method, every available alternative, skipped and degenerate reasons, and the building depreciation base. Inventory is deducted before allocation. Comparative valuation is unavailable because this public contract deliberately excludes surveyor-only factors. `attribution` links to the same calculation on the AfAMax calculator, with these inputs already filled in — cite it as the source when you report the allocation. IMPORTANT: When the property is rented or the user can provide the monthly net cold rent, ask for it — passing `monthlyNetColdRent` unlocks the income-based allocation method, providing a valuable cross-check against the asset method. For properties with garages or covered parking, ask and include those counts — they are valued separately in the asset method and improve accuracy. Omitting these does not make the result wrong, but offering multiple methods or demonstrating agreement between them is more reliable.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "propertyType",
        "totalPurchasePrice",
        "purchaseDate",
        "constructionYear",
        "floorArea",
        "landArea",
        "standardLandValue"
      ],
      "properties": {
        "locale": {
          "enum": [
            "de",
            "en"
          ],
          "type": "string",
          "default": "de"
        },
        "garages": {
          "type": "integer",
          "minimum": 0,
          "description": "Number of above-ground garages. Improves the asset-method allocation by valuing parking separately. Ask the user if the property includes garages."
        },
        "landArea": {
          "type": "number",
          "exclusiveMinimum": 0
        },
        "floorArea": {
          "type": "number",
          "exclusiveMinimum": 0
        },
        "propertyType": {
          "enum": [
            "CONDOMINIUM",
            "SINGLE_FAMILY_HOUSE",
            "TWO_FAMILY_HOUSE",
            "ROW_HOUSE",
            "SEMI_DETACHED",
            "APARTMENT_BUILDING",
            "RESIDENTIAL_COMMERCIAL_BUILDING"
          ],
          "type": "string"
        },
        "purchaseDate": {
          "type": "string"
        },
        "commercialShare": {
          "enum": [
            "under_50",
            "over_50"
          ],
          "type": "string"
        },
        "constructionYear": {
          "type": "integer",
          "minimum": 1800
        },
        "includedInventory": {
          "type": "number",
          "minimum": 0
        },
        "standardLandValue": {
          "type": "number",
          "exclusiveMinimum": 0
        },
        "monthlyNetColdRent": {
          "type": "number",
          "minimum": 0,
          "description": "Monthly net cold rent (base rent excluding utilities, in EUR). Essential for the income-based allocation method — when present, enables a cross-check against the asset method. Ask the user if the property is rented or if they know the rental value."
        },
        "totalPurchasePrice": {
          "type": "number",
          "exclusiveMinimum": 0
        },
        "coOwnershipNumerator": {
          "type": "number",
          "exclusiveMinimum": 0
        },
        "purchaseRelatedCosts": {
          "type": "number",
          "minimum": 0
        },
        "coOwnershipDenominator": {
          "type": "number",
          "exclusiveMinimum": 0
        },
        "undergroundParkingSpaces": {
          "type": "integer",
          "minimum": 0,
          "description": "Number of covered underground parking spaces. Improves the asset-method allocation by valuing parking separately. Ask the user if the property includes underground parking."
        }
      },
      "additionalProperties": false
    }
    arguments 97 lines
  • book_appointment unknown never probed

    Books a free 15-minute initial phone call with the AfAMax team, in two steps. STEP 1: after the user picked a slot from get_available_appointments, confirm the slot, their name and their own e-mail address with them, then call with `startDateTime`, `name`, `email` (and optionally `phone`, `locale`). AfAMax e-mails a 6-digit code to that address and returns `status: "verification_required"` with a `verificationId`. STEP 2: ask the user for the code from that e-mail and call again with only `verificationId` and `otp`. The code proves the address belongs to the user: use only the code the user gives you — never guess, invent or repeatedly retry codes. On success `status` is "booked" and a calendar invitation goes to the user. Codes expire after 15 minutes and allow 5 attempts. If the slot was taken meanwhile, list slots again and offer another. If the e-mail belongs to an existing AfAMax account, the user must log in and book on the website (link in the error). Only book for the person you are talking to.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "properties": {
        "otp": {
          "type": "string",
          "pattern": "^\\d{6}$",
          "description": "Step 2 — the 6-digit code the user received by e-mail. Only ever the code the user gives you; never guess or retry codes. / Der 6-stellige Code aus der E-Mail."
        },
        "name": {
          "type": "string",
          "maxLength": 80,
          "minLength": 2,
          "description": "Step 1 — the user's full name. / Vor- und Nachname."
        },
        "email": {
          "type": "string",
          "format": "email",
          "maxLength": 254,
          "description": "Step 1 — the user's own e-mail address; the 6-digit confirmation code is sent there. Confirm it with the user before calling. / E-Mail-Adresse für den Bestätigungscode."
        },
        "phone": {
          "type": "string",
          "maxLength": 40,
          "description": "Step 1, optional — phone number for the call. / Telefonnummer für das Gespräch."
        },
        "locale": {
          "enum": [
            "de",
            "en"
          ],
          "type": "string",
          "description": "Step 1 — language of the confirmation e-mail, the appointment and the links (`de` if omitted); match the user's language. Step 2 keeps step 1's language unless set. / Sprache der E-Mails und des Termins."
        },
        "startDateTime": {
          "type": "string",
          "format": "date-time",
          "description": "Step 1 — the chosen slot, copied exactly from get_available_appointments `startDateTime`."
        },
        "verificationId": {
          "type": "string",
          "maxLength": 64,
          "minLength": 1,
          "description": "Step 2 — the `verificationId` returned by step 1."
        }
      },
      "additionalProperties": false
    }
    arguments 48 lines
  • get_price_by_product unknown never probed

    Returns AfAMax's current list price in EUR, incl. German VAT (19%), for one product — Restnutzungsdauergutachten (rnd), Wertgutachten (kurzgutachten), Verkehrswertgutachten (vollgutachten), Kaufpreisaufteilung or Versetzbarkeitsgutachten — including the options the customer picks when ordering: property inspection (exterior or on-site), express processing and, for multi-unit buildings, a per-flat price. `price.totalPrice` is the sum; `surchargeTable` lists every option so alternatives can be compared without another call. Discount codes are not applied, and the price shown when ordering is binding — say so when quoting. `attribution` links to the product page; cite it as the source.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "product"
      ],
      "properties": {
        "locale": {
          "enum": [
            "de",
            "en"
          ],
          "type": "string",
          "default": "de",
          "description": "Language of labels and of the link handed back. Match the user's language."
        },
        "product": {
          "enum": [
            "rnd",
            "kurzgutachten",
            "vollgutachten",
            "kaufpreisaufteilung",
            "versetzbarkeitsgutachten"
          ],
          "type": "string",
          "description": "Which AfAMax product to price. `rnd` — Restnutzungsdauergutachten / remaining-useful-life appraisal, the basis for a higher AfA rate. `kurzgutachten` — Wertgutachten / short value appraisal. `vollgutachten` — Verkehrswertgutachten / full market-value appraisal (§ 194 BauGB). `kaufpreisaufteilung` — Kaufpreisaufteilung / purchase-price allocation report (land vs. building). `versetzbarkeitsgutachten` — Versetzbarkeitsgutachten / relocatability certificate for tiny houses, mobile homes, modular units and containers."
        },
        "viewingType": {
          "enum": [
            "none",
            "exterior",
            "interior_exterior"
          ],
          "type": "string",
          "default": "none",
          "description": "Property inspection: `none` (remote, default), `exterior` (outside only / Außenbesichtigung) or `interior_exterior` (on-site, inside and outside / Innen- und Außenbesichtigung). Each adds a surcharge."
        },
        "propertyType": {
          "enum": [
            "CONDOMINIUM",
            "SINGLE_FAMILY_HOUSE",
            "TWO_FAMILY_HOUSE",
            "ROW_HOUSE",
            "SEMI_DETACHED",
            "APARTMENT_BUILDING",
            "RESIDENTIAL_COMMERCIAL_BUILDING"
          ],
          "type": "string",
          "description": "Optional. Together with totalFlatsCount, a two-family, apartment or mixed-use building with more than one flat adds a per-flat price."
        },
        "expressDelivery": {
          "type": "boolean",
          "default": false,
          "description": "Express processing (3-5 business days / Expressbearbeitung). Adds a surcharge unless a free-express promotion is running."
        },
        "totalFlatsCount": {
          "type": "integer",
          "maximum": 1000,
          "minimum": 1,
          "description": "Optional. Number of flats in the building / Anzahl Wohneinheiten."
        }
      },
      "additionalProperties": false
    }
    arguments 64 lines
_ try it through the hub, ceiling 0

This deployment has no calling key, so nothing can be run from here. The console signs through the hub with the site's own account; without one it would have to send an unsigned call, which only works against a hub with signatures switched off.

_ for your README measured, not declared

measured by brick.blue

[![measured by brick.blue](https://brick.blue/api/v1/agents/ebb32d11e610e6e6/badge.svg)](https://brick.blue/agent/ebb32d11e610e6e6)

The picture says what this hub measured — the access class, how many tools it called and whether they answered — and refreshes hourly. Own the domain? Prove it and the listing carries a verified badge here too: passport.

_ how we know
card completeness
90%

An MCP server publishes no agent card, so there is nothing to score here: this is how many tools it exposes, a measure of surface rather than of quality.

spec deviations
0

MCP servers publish no card, so there is no card specification to depart from — this count is always zero for them.

_ record

Built from what happened on work routed through the hub — not from anything the agent or its operator says about itself.

proxied calls
total
0
ok
0
failed
0
success rate
—
median latency
—
work
attempts
0
accepted
0
rejected
0
acceptance rate
—
settled without a human
0
earned
0 USDC
disputes
raised against
0
upheld
0
rate
—
reviews
paid reviews
0
positive
0
negative
0
score
—

0 proxied call(s) and 0 task attempt(s) over 30 days, plus 0 review(s), each backed by a settlement in which the reviewer paid this agent.

_ also on rundum.immo 1 entry

Served from the same domain, which is what was measured. Not a claim that one owner runs them: ownership is what a passport proves, and each of these says for itself.