German Real Estate Depreciation & Restnutzungsdauer

immo.rundum由 rundum.immo 發布官方發布者v0.2.2更新於 Nov 4, 2026

German property depreciation (AfA), Restnutzungsdauer, Kaufpreisaufteilung & appraisals via AfAMax

已驗證Streamable HTTP可網頁執行效率與工作流金融商業與電商

概覽

AI 產生的概覽

面向德國出租不動產的助理工具:透過 AfAMax 提供指示性折舊(AfA)、剩餘使用年限、買賣價格分攤、估價報價與免費初次通話預約。

可以做什麼
  • 計算建築物的指示性折舊(AfA)與剩餘使用年限,與法定折舊率比較並估算節稅金額
  • 依德國聯邦財政部方法將購入總價分攤為土地與建築物兩部分,並提供替代方法與折舊基礎
  • 查詢 AfAMax 各項估價產品的目前歐元含稅標價與附加費用選項
  • 列出免費 15 分鐘初次電話諮詢的空檔時段,並以兩步驟電子郵件驗證碼完成預約
適用情境
適合使用者詢問德國出租住宅不動產時使用:能否以高於 2% 的比率折舊、剩餘使用年限鑑價是否划算、土地與建築物如何分攤、估價費用多少,或如何聯繫專家。不適用於德國以外的不動產、非建築物資產、其他稅目、租賃法與融資問題。
執行需求
可使用託管的 Streamable HTTP 端點(無需 API 金鑰),或透過 npx 或原始碼建置在本機以 stdio 執行,後者需要 Node.js 22.12 或更新版本。自行架設 HTTP 模式需要 Rundum Immo 核發的 AFAMAX_SERVICE_TOKEN。需要能連線至 AfAMax 公開 API。
安裝前請注意
計算輸入與用戶端 IP 會傳送給 AfAMax,其會保存位址的加鹽雜湊與有限使用中繼資料 30 天;請勿在輸入中填寫個人識別資訊。預約會將姓名、電子郵件與選填電話傳送給 AfAMax。報價僅供參考,下單時顯示的價格為準。結果僅為指示性,不構成稅務或法律建議。切勿將 AFAMAX_SERVICE_TOKEN 暴露給用戶端。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 German Real Estate Depreciation & Restnutzungsdauer,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。

交給代理程式安裝

把這段提示詞貼上到 Claude Code、Codex、Cursor 等代理程式,或 SourceWeft 對話中。代理程式會讀取該伺服器的安裝指南,先向你展示發布者、端點和登入方式,經你同意後再把它新增到你的客戶端。金鑰不會寫進任何命令。

閱讀 https://sourceweft.com/mcp/immo.rundum%2Freal-estate-appraisal/install.md,並按其中說明把這個 MCP 伺服器接入我的客戶端。修改任何設定之前,先告訴我它的發布者、端點和登入方式,等我確認。不要把 API 金鑰寫進命令或我會提交的檔案;問我金鑰應從哪裡取得。

檢視代理程式所依據的安裝指南

其他 MCP 客戶端

把它新增到你客戶端的 mcpServers 設定中。

{
  "mcpServers": {
    "german-real-estate-depreciation-restnutz": {
      "type": "http",
      "url": "https://mcp.rundum.immo/mcp"
    }
  }
}

README

Rundum Immo Real Estate Appraisal MCP

An open-source Model Context Protocol server for indicative German real-estate depreciation (AfA / Gebäudeabschreibung), remaining useful life (Restnutzungsdauer) and purchase-price allocation (Kaufpreisaufteilung). It helps answer questions such as whether a rental property can be depreciated faster than the statutory rate under § 7 Abs. 4 EStG, or whether a Restnutzungsdauergutachten would pay off. It exposes calculate_property_depreciation and calculate_purchase_price_allocation, delegating both calculations to the public AfAMax APIs, plus get_price_by_product, get_available_appointments, and book_appointment for AfAMax appraisal prices and free initial-call bookings. Proprietary appraisal formulas remain in AfAMax.

Hosted server

The public Streamable HTTP endpoint is:

text
https://mcp.rundum.immo/mcp

No end-user API key is required. Calls are subject to AfAMax per-client and service-wide rate limits and abuse protections.

Run from source over stdio

Node.js 22.12 or newer is required.

bash
git clone https://github.com/Rundum-Immo/real-estate-appraisal-mcp.gitcd real-estate-appraisal-mcppnpm install --frozen-lockfilepnpm build

Configure your MCP client to run the built server, replacing the path with the absolute path to your checkout:

json
{  "mcpServers": {    "rundum-real-estate-appraisal": {      "command": "node",      "args": ["/absolute/path/to/real-estate-appraisal-mcp/dist/transports/stdio.js"]    }  }}

The stdio server calls the anonymous AfAMax API directly. Its public limits are 30 requests per minute and 500 requests per rolling day per IP; a tenant-wide ceiling may also apply. It writes protocol messages only to stdout and operational logs only to stderr.

Install from npm over stdio

Node.js 22.12 or newer is required. Configure your MCP client to launch the published package with npx:

json
{  "mcpServers": {    "rundum-real-estate-appraisal": {      "command": "npx",      "args": ["-y", "@rundum-immo/real-estate-appraisal-mcp"]    }  }}

Tools

Property depreciation

calculate_property_depreciation accepts the complete public AfAMax request contract:

  • Required: property type, construction year, and floor area.
  • Optional: purchase price, land area, standard land value, inventory, purchase costs, core-renovation year, marginal tax rate, locale, coarse modernization level, and eight detailed modernization component states.
  • Results: annual and monthly AfA, comparison with statutory AfA, estimated tax savings, building-value assumptions, modernization points, and remaining useful life.

Omitting modernization data means AfAMax assumes no modernization, producing an upper-bound estimate. For multi-unit buildings, provide whole-building figures or calculate individual units separately. Results are indicative and do not replace tax, legal, or appraisal advice.

Example input:

json
{  "propertyType": "CONDOMINIUM",  "constructionYear": 1970,  "floorArea": 85,  "purchasePrice": 350000,  "taxRate": 0.42,  "locale": "en"}

Purchase-price allocation

calculate_purchase_price_allocation divides acquisition costs between non-depreciable land and the depreciable building using the German Federal Ministry of Finance (BMF) method.

  • Required: property type, total purchase price, purchase date, construction year, floor area, land area, and standard land value.
  • Condominiums also require the numerator and denominator of the co-ownership share.
  • Mixed-use residential/commercial buildings also require whether the commercial share is under or over 50%.
  • Optional: purchase costs, included inventory, garage and underground-parking counts, monthly net cold rent, and locale.
  • Results: the applied method, meaningful alternatives, land/building shares and values, depreciation base, unavailable or unusable method reasons, and disclosed asset-method defaults.

Providing monthly net cold rent enables the income method as a cross-check against the asset method. Garage and covered underground-parking counts improve the asset method because those spaces are valued separately. Comparative valuation is unavailable because the public contract excludes surveyor-only factors. Results are indicative and do not replace tax or legal advice.

Example input:

json
{  "propertyType": "CONDOMINIUM",  "totalPurchasePrice": 500000,  "purchaseRelatedCosts": 40000,  "purchaseDate": "2024-06-15",  "constructionYear": 1975,  "floorArea": 75,  "landArea": 1200,  "standardLandValue": 2500,  "coOwnershipNumerator": 75,  "coOwnershipDenominator": 1000,  "undergroundParkingSpaces": 1,  "monthlyNetColdRent": 1400,  "locale": "en"}

Appraisal prices

get_price_by_product returns the current AfAMax list price in EUR, including German VAT, for one product: rnd (Restnutzungsdauergutachten), kurzgutachten, vollgutachten, kaufpreisaufteilung, versetzbarkeitsgutachten, or afa_verteidigung (AfA-Verteidigung, a second remaining-useful-life appraisal to defend an AfA the tax office rejected).

  • Optional: property inspection (none, exterior, interior_exterior), express processing, and property type with flat count for the per-flat price of multi-unit buildings.
  • Results: the total with its breakdown, net price, a table of every surcharge for comparing options, and a source link to the product page.

Discount codes are not applied; the price shown when ordering is binding.

json
{ "product": "rnd", "viewingType": "interior_exterior", "expressDelivery": true, "locale": "en" }

Initial-call appointments

get_available_appointments lists open slots for a free, non-binding 15-minute phone call with the AfAMax team, on weekdays in Europe/Berlin, grouped by day. It looks up to 21 days ahead (default 7) and lists up to 32 slots per day (default 8), with each day's full free-slot count.

json
{ "days": 1, "maxSlotsPerDay": 32, "locale": "en" }

book_appointment books one of those slots in two steps, so a booking is confirmed only by someone with access to the given mailbox:

  1. Call with the slot's startDateTime, name, email (optionally phone, locale). AfAMax e-mails a 6-digit code and returns a verificationId.
  2. Call again with only verificationId and the otp the user read from the e-mail. The response confirms the booking and AfAMax sends a calendar invitation.

Codes expire after 15 minutes and allow 5 attempts. Refusals such as a slot taken meanwhile or an e-mail that belongs to an existing AfAMax account come back with what to do next and a link to continue on the AfAMax website.

Architecture

text
MCP client  ->  this public adapter  ->  AfAMax public HTTPS API

This repository contains transport, validation, error mapping, and presentation code only. It contains no appraisal formulas, databases, tenant logic, or report-generation internals. The transport-neutral server factory is shared by stdio and stateless Streamable HTTP.

Development

bash
pnpm installpnpm checkpnpm dev:stdio

Test with MCP Inspector

Build and launch the local stdio server through MCP Inspector:

bash
pnpm buildnpx -y @modelcontextprotocol/inspector \  node --env-file-if-exists=.env dist/transports/stdio.js

Connect in the browser, open Tools, and call a calculation tool with its example input above. Successful responses contain a readable summary, structured output, disclosed assumptions/defaults, and a source link to the corresponding AfAMax calculator. The source link carries the submitted inputs so the calculator opens prefilled for refinement or documentation.

To inspect the registered tools from the command line:

bash
npx -y @modelcontextprotocol/inspector \  --cli \  node --env-file-if-exists=.env dist/transports/stdio.js \  --method tools/list

Develop the HTTP transport

bash
cp .env.example .envpnpm dev:http

AFAMAX_SERVICE_TOKEN is mandatory for HTTP mode. Trusted per-client rate limiting works only with a service credential issued by Rundum Immo and configured with the matching AfAMax backend value; arbitrary tokens do not enable trusted forwarding. HTTP mode forwards that token and the validated rightmost proxy client address in X-Afamax-Service-Token and X-Afamax-Client-IP. Never expose this token to MCP clients. Deploy behind a proxy that replaces, rather than blindly appends to, incoming forwarding headers.

Configuration:

VariableDefaultPurpose
AFAMAX_API_URLhttps://afamax.de/api/v1/afa-calculationPublic calculation endpoint
AFAMAX_KPA_API_URLhttps://afamax.de/api/v1/purchase-price-allocationPublic purchase-price allocation endpoint
AFAMAX_SERVICE_TOKEN—Required trusted-service credential in HTTP mode
AFAMAX_TIMEOUT_MS10000Upstream timeout
HOST0.0.0.0Listen address
PORT3000Listen port
PUBLIC_HOSTSmcp.rundum.immoComma-separated allowed Host header names
LOG_LEVELinfodebug, info, warn, or error

The HTTP server exposes /mcp and /health, limits request bodies to 64 KiB, validates Host and Origin syntax, and returns permissive CORS headers for anonymous browser clients.

Deploy with Docker

Production HTTP hosting is intended for Rundum Immo or explicitly authorized operators because it requires a matching AfAMax service credential. Public users can run the stdio transport without one.

bash
docker build -t real-estate-appraisal-mcp .docker run --rm -p 3000:3000 \  -e AFAMAX_SERVICE_TOKEN='credential-issued-by-rundum-immo' \  -e PUBLIC_HOSTS='localhost,mcp.rundum.immo' \  real-estate-appraisal-mcp

The image runs as the non-root node user. Configure mcp.rundum.immo in Coolify and proxy it to port 3000.

Data and privacy

The adapter is stateless and does not persist tool inputs or raw client IP addresses. Calculation input and the client IP are sent to AfAMax, which uses the address for abuse prevention. AfAMax stores a salted hash of the address and limited usage metadata for 30 days; it does not store the raw address in its usage records. Avoid placing personal identifiers in calculation and price inputs. book_appointment necessarily sends the user's name, e-mail address, and optional phone number to AfAMax, which uses them to send the confirmation code and to hold the appointment; the adapter neither stores nor logs them. See AfAMax privacy information and SECURITY.md.

Roadmap

The repository can grow beyond its current calculation, pricing, and booking tools. Potential future capabilities include:

  • Property and market-value estimation
  • Appraisal and valuation-report workflows
  • Additional German real-estate tax and appraisal tools

Future tools will follow the same boundary: this repository contains the public MCP integration, while proprietary appraisal logic remains in AfAMax.

License

MIT

來源:README.md,提交 8573027

工具

5

calculate_property_depreciation

Calculate German property depreciation (AfA) & Restnutzungsdauer

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.

輸入參數localetaxRatelandAreafloorArea必填propertyType必填modernizationpurchasePriceconstructionYear必填includedInventorystandardLandValuecoreRenovationYearmodernizationLevel另有 1 個

calculate_purchase_price_allocation

Calculate German purchase price allocation

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.

輸入參數localegarageslandArea必填floorArea必填propertyType必填purchaseDate必填commercialShareconstructionYear必填includedInventorystandardLandValue必填monthlyNetColdRenttotalPurchasePrice必填另有 4 個

get_price_by_product

Get the price of an AfAMax appraisal product

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.

輸入參數localeproduct必填viewingTypepropertyTypeexpressDeliverytotalFlatsCount

get_available_appointments

List free AfAMax initial-call appointment slots

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.

輸入參數daysfromlocalemaxSlotsPerDay

book_appointment

Book a free AfAMax initial call

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.

輸入參數otpnameemailphonelocalestartDateTimeverificationId

版本歷史

5
  1. v0.2.2最新Nov 4, 2026
  2. v0.2.1Oct 6, 2026
  3. v0.2.0Oct 1, 2026
  4. v0.1.1Sep 17, 2026
  5. v0.1.0Sep 16, 2026

評分

已滿足適用檢查項的 100%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通必需25 分
  • 已宣告認證方式必需10 分
  • 已列出工具必需15 分
  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分