immo.rundum/real-estate-appraisal
OfficialServer Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| HOST | No | Listen address | 0.0.0.0 |
| PORT | No | Listen port | 3000 |
| LOG_LEVEL | No | debug, info, warn, or error | info |
| PUBLIC_HOSTS | No | Comma-separated allowed Host header names | mcp.rundum.immo |
| AFAMAX_API_URL | No | Public calculation endpoint | https://afamax.de/api/v1/afa-calculation |
| AFAMAX_TIMEOUT_MS | No | Upstream timeout | 10000 |
| AFAMAX_KPA_API_URL | No | Public purchase-price allocation endpoint | https://afamax.de/api/v1/purchase-price-allocation |
| AFAMAX_SERVICE_TOKEN | No | Required trusted-service credential in HTTP mode |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
AfAMax tools for German residential rental property (vermietete Immobilien): depreciation (AfA / Gebäudeabschreibung), remaining useful life (Restnutzungsdauer), purchase-price allocation (Kaufpreisaufteilung), appraisal prices and a free initial call. Most users are German-speaking and ask colloquially.
Domain: under § 7 Abs. 4 EStG a rental building is depreciated at a flat statutory rate — usually 2 % a year (3 % if completed from 2023, 2.5 % if completed before 1925). If the building's actual remaining useful life is shorter (verkürzte Restnutzungsdauer, § 7 Abs. 4 Satz 2 EStG), a higher rate is possible; a Restnutzungsdauergutachten is the usual proof. Only the building is depreciable, never the land, so the land/building split sets the depreciation base.
Which tool:
Faster or higher depreciation, "mehr als 2 % AfA", "schneller abschreiben", an old or unrenovated building, a shorter useful life, or whether a Restnutzungsdauergutachten pays off → calculate_property_depreciation. It compares the statutory rate with the remaining-useful-life rate, estimates tax savings and returns appraisalWorthwhile.
Land vs. building share, Gebäudeanteil, Bodenrichtwert, a disputed Finanzamt split → calculate_purchase_price_allocation.
What a Gutachten costs → get_price_by_product (prices only; it does not say whether an appraisal pays off).
Talking to an expert → get_available_appointments, then book_appointment.
A typical flow: allocation → depreciation → if appraisalWorthwhile, price the rnd product → offer the initial call.
Out of scope: property outside Germany, depreciation of anything other than buildings (cars, equipment, solar systems), other taxes (Grunderwerbsteuer, Grundsteuer, Erbschaftsteuer, capital gains), tenancy law and financing. Results are indicative and never replace tax or legal advice.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| calculate_property_depreciationA | Calculate indicative German property depreciation (AfA / Gebäudeabschreibung) and the building's remaining useful life (Restnutzungsdauer) for residential rental property through AfAMax. Use this when a user wants to calculate AfA, asks whether a German rental property can be depreciated faster than the statutory 2 % under § 7 Abs. 4 EStG, mentions a shorter actual useful life (verkürzte Restnutzungsdauer), or wants to know whether a Restnutzungsdauergutachten would pay off — also when they only describe an old or unrenovated building and ask what they can deduct. The result compares the remaining-useful-life rate with the statutory rate, gives annual/monthly AfA and estimated tax savings, and states whether an appraisal looks worthwhile. For apartment buildings, pass figures for the whole building or calculate units separately. Ask for all eight modernization component states whenever possible: omitting them assumes no modernization and produces the highest possible remaining-useful-life benefit. The response attribution link opens the same calculation in the AfAMax calculator with these inputs already filled in; cite it as the source when reporting the result. The result is non-binding and does not replace tax or legal advice. |
| calculate_purchase_price_allocationA | Calculate a free, non-binding German property purchase-price allocation (Kaufpreisaufteilung) through AfAMax using the BMF Arbeitshilfe. Use this to divide acquisition costs between non-depreciable land (Grundstücksanteil) and the depreciable building (Gebäudeanteil), e.g. when a user asks how much of the price they may depreciate or wants to check the Finanzamt's split. Its depreciationBase is the base for the building's AfA. Inventory is deducted before allocation. A condominium requires both co-ownership values, and a residential/commercial building requires its commercial share category. Comparative valuation is unavailable because this public contract excludes surveyor-only factors. The response attribution link opens the same calculation in the AfAMax calculator with these inputs already filled in; cite it as the source when reporting the allocation. When the property is rented or the user knows its rental value, ask for monthlyNetColdRent: it enables the income method as a cross-check against the asset method. Ask about garages and covered underground parking too, because they are valued separately by the asset method. Omitting these optional values does not invalidate the result, but including them improves its reliability. The result does not replace tax or legal advice. |
| get_price_by_productA | Returns AfAMax's current list price in EUR, incl. German VAT (19%), for one product — Restnutzungsdauergutachten (rnd), Wertgutachten (kurzgutachten), Verkehrswertgutachten (vollgutachten), Kaufpreisaufteilung, Versetzbarkeitsgutachten or AfA-Verteidigung (afa_verteidigung, a second remaining-useful-life appraisal to defend an AfA the tax office rejected) — 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. This tool only quotes prices: to estimate whether a Restnutzungsdauergutachten would pay off, use calculate_property_depreciation. The response attribution links to the product page; cite it as the source when reporting the price. |
| get_available_appointmentsA | 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. The response attribution links to the contact page, where the user can also book directly. |
| book_appointmentA | 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. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 5 tools
Each tool targets a distinct action-object pair: two different calculations (AfA depreciation vs. purchase-price allocation), a price lookup, and a list/book pair for appointments. The descriptions actively cross-reference and rule out the nearest confusable alternative (e.g. get_price_by_product explicitly says to use calculate_property_depreciation for a pay-off estimate). No two tools could plausibly be swapped by an agent.
All five names use snake_case with a leading verb and a concrete object (calculate_*, get_*, book_*), and the get_/book_ pairing for appointments follows an obvious convention. Minor variation in prepositional phrasing (get_price_by_product) does not break the pattern.
Five tools is a tight, well-scoped surface where each tool has a clear role and none is redundant. It leans slightly thin because two of the five slots are consumed by the appointment list/book pair, leaving only three tools for the actual appraisal/calculation domain.
The surface covers two calculators (AfA and Kaufpreisaufteilung), pricing, and booking, but the product catalogue implies appraisals that can be ordered (Restnutzungsdauergutachten, Wertgutachten, Verkehrswertgutachten) with no order, status, or report-retrieval tool — the descriptions push those steps to the website. An agent can quote a price but cannot complete or follow up on the core purchase workflow, which is a notable gap.