Skip to content

GUTHMANN® Berlin Real Estate

by guthmann.estate · remote · no sign-in to list tools · v0.3.0 · published by estate.guthmann

Berlin real estate for AI agents: granular market data and property search, free, by GUTHMANN®.

Changes · 27

37 tools: 27 change things and 10 only read.

Scanned Oct 21, 2026

No check matched anything in the tool definitions. No finding is not a safety guarantee. How the checks work.

claude mcp add --transport http guthmann https://mcp.guthmann.estate/mcp

Tools

Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.

37 tools

Changes things 27Claude Code: ask
  • berlin_conservation_areasBerlin social conservation areas (Milieuschutzgebiete, §172 BauGB).No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Berlin social conservation areas (Milieuschutzgebiete, §172 BauGB). 124 areas in 6 categories with polygon geometry. Parameters: - kategorie_id: filter by category ("erhaltungsgebiet" | "erweiterung" | "aufstellungsbeschluss" | "untersuchungsgebiet" | "beobachtungsgebiet" | "aufgehoben") - erweiterungen: "true" to embed extensions as a nested array inside their main area - include: comma-separated geo attributes; available: "centroid". Polygons are provided as GeoJSON URLs in geometry_urls - lat/lon: WGS84 point lookup. Returns only areas containing the point (typically 0 or 1 match). lat and lon must be provided together. Key response fields: array of { id, name, kategorie_id, kategorie_name, parent_id, beschreibung (description), datum (date), flaeche_km2 (area in km²), geometry_urls, centroid?, erweiterungen? (extensions) } Use for: "Is this address in a social conservation area?" (with lat/lon), overview of all Milieuschutz areas.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • listing_detailsOne GUTHMANN listing in detail: prices and running costs, areas, amenities, energy certificate, exposé texts, images, contact and the exposé URL on guthmann.estate.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    One GUTHMANN listing in detail: prices and running costs, areas, amenities, energy certificate, exposé texts, images, contact and the exposé URL on guthmann.estate. When the address is not released, street/house number are null and the coordinate is deterministically offset by 150-300 m (koordinaten_versetzt = true). Parameters: - public_id: public listing id (hex, from listings or the exposé URL) - locale: "de" | "en" (default: en)

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • listingsThe GUTHMANN listings: the broker's active inventory in Berlin (for sale: owner-occupier apartments, investment apartments, apartment buildings, commercial).No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    The GUTHMANN listings: the broker's active inventory in Berlin (for sale: owner-occupier apartments, investment apartments, apartment buildings, commercial). Every card carries its exposé URL on guthmann.estate. Addresses only for released listings, otherwise ZIP/District (Ortsteil)/Borough (Bezirk). Parameters: - segment: "APARTMENT_LIVING" | "APARTMENT_INVEST" | "APARTMENT_BUILDING" | "COMMERCIAL" - bezirk / ortsteil: name filter, e.g. "Pankow" / "Prenzlauer Berg" - preis_min / preis_max: purchase price in EUR - zimmer_min, flaeche_min: lower bounds for rooms / living area (m²) - locale: "de" | "en" for title, texts and exposé URL (default: en) - limit: 1-100 (default: 50) Key response fields: - public_id (key for listing_details), titel (title), teaser, expose_url - kaufpreis (purchase price), kaufpreis_pro_qm (price per m²), kaltmiete (net rent), bruttorendite (gross yield), mietfaktor (price-to-rent multiple) - wohnflaeche (living area), anzahl_zimmer (rooms), baujahr (construction year), energie_wertklasse (energy class) - bezirk (Borough), ortsteil (District), plz (ZIP), adresse (null when adresse_verborgen), bild (small first-party preview image, suitable for inline display)

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • macro_bund_yieldsYields on German government bonds (Bunds).No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Yields on German government bonds (Bunds). Source: Bundesbank. Parameters: - start/end: YYYY-MM-DD - recent: number of most recent periods - limit, fields, include: "metadata" Key response fields (German names): - rendite_10j: 10-year Bund yield - rendite_15j: 15-year Bund yield - rendite_30j: 30-year Bund yield

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • macro_construction_pricesConstruction price index for residential buildings.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Construction price index for residential buildings. Source: Bundesbank. Quarterly data (2015=100). Parameters: - start/end: YYYY-MM-DD - recent: number of most recent periods Key response fields (German names): - preisindex: construction price index - preisindex_delta_1q: change vs. previous quarter - preisindex_delta_1j: change vs. previous year

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • macro_ecb_policy_ratesECB key interest rates.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    ECB key interest rates. Source: Bundesbank. Parameters: - start/end: YYYY-MM-DD - recent: number of most recent periods - limit, fields, include: "metadata" Key response fields (German names): - zinssatz_hauptrefinanzierungssatz: main refinancing rate (the ECB's key rate) - zinssatz_einlagefazilitaet: deposit facility rate - zinssatz_spitzenrefinanzierungsfazilitaet: marginal lending facility rate

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • macro_gdpGDP data (gross domestic product).No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    GDP data (gross domestic product). Source: Bundesbank. Quarterly data, price-adjusted, seasonally and calendar-adjusted (2015=100). Parameters: - start/end: YYYY-MM-DD - recent: number of most recent periods Key response fields (German names): - kettenindex: GDP chain-linked index - kettenindex_delta_1q: change vs. previous quarter - kettenindex_delta_1j: change vs. previous year

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • macro_inflation_hicpInflation data (HICP - harmonized index of consumer prices).No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Inflation data (HICP - harmonized index of consumer prices). Source: Bundesbank. Parameters: - start/end: YYYY-MM-DD - recent: number of most recent periods Key response fields (German names): - hvpi_gesamt: overall HICP - hvpi_gesamt_ohne_energie_nahrungsmittel: core inflation (HICP excluding energy and food) - hvpi_energie, hvpi_nahrungsmittel, hvpi_dienstleistungen, hvpi_mieten: energy, food, services, rents

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • macro_labor_employmentEmployment statistics.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Employment statistics. Source: Bundesbank. Parameters: - start/end: YYYY-MM-DD - recent: number of most recent periods Key response fields (German names): - erwerbstaetige: persons in employment (seasonally adjusted) - sv_beschaeftigte: employees subject to social insurance contributions - geringfuegig_beschaeftigte: marginally employed (mini-jobs)

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • macro_labor_short_time_workShort-time work (Kurzarbeit) statistics.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Short-time work (Kurzarbeit) statistics. Source: Bundesbank. Parameters: - start/end: YYYY-MM-DD - recent: number of most recent periods Key response fields (German names): - kurzarbeiter: short-time workers (seasonally adjusted)

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • macro_labor_unemploymentUnemployment statistics.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Unemployment statistics. Source: Bundesbank. Parameters: - start/end: YYYY-MM-DD - recent: number of most recent periods Key response fields (German names): - arbeitslose: registered unemployed (seasonally adjusted) - arbeitslosenquote: unemployment rate (%)

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • macro_mortgage_lendingMortgage rates for residential housing loans.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Mortgage rates for residential housing loans. Source: Bundesbank. Parameters: - start/end: YYYY-MM-DD - recent: number of most recent periods - limit, fields, include: "metadata" Key response fields (German names): - zinssatz_gesamt: average rate across all fixed-interest periods - zinssatz_5_bis_10j: rate for 5-10 year fixed-interest periods - zinssatz_ueber_10j: rate for fixed-interest periods over 10 years - volumen_gesamt: new lending volume

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • market_berlin_apartment_buildingsBerlin apartment building market (rental buildings, "Zinshäuser") - transaction data.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Berlin apartment building market (rental buildings, "Zinshäuser") - transaction data. Source: transaction data from the Berlin committee of valuation experts (GAA, Gutachterausschuss). Parameters: - rbs: "stadt" | "bezirk" | "stadtteil" | "ortsteil" — bezirk = Borough, ortsteil = District Time filters: - start/end: flexible date values (YYYY, YYYY-MM, YYYY-MM-DD) - recent: number of most recent periods (alternative to start/end) Additional filters: - bezirk_id, stadtteil_id, ortsteil_id - limit, fields, include: "metadata" Key response fields: - transaktionspreis: average total purchase price (€) - transaktionen: number of transactions - vielfaches: purchase price multiplier (purchase price / annual net cold rent) - vielfaches_delta_*j: absolute change of the multiplier (1y, 5y, 10y, 15y) - transaktionspreis_m2: price per m² of living space Ideal for: investment market analysis, yield comparisons across locations

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • market_berlin_apartmentsBerlin apartment market data (listings + transactions).No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Berlin apartment market data (listings + transactions). Sources: listing/offer data (IMV) + transaction data from the Berlin committee of valuation experts (GAA, Gutachterausschuss). Parameters: - zeitraum: "jahr" (default) | "monat" | "quartal" (abgeschlossene Quartale) - jahr: transaction data (GAA) + listing data (IMV), finest level: block - monat: listing data (IMV) only, finest level: District (Ortsteil) - quartal: listing data (IMV) only, closed quarters, finest level: District (Ortsteil) - rbs: spatial aggregation level — bezirk = Borough, ortsteil = District, planungsraum = Neighborhood (LOR Planungsraum) - For zeitraum=jahr: "stadt" | "bezirk" | "stadtteil" | "ortsteil" | "planungsraum" | "block" - For zeitraum=monat or quartal: "stadt" | "bezirk" | "stadtteil" | "ortsteil" Time filters: - start/end: flexible date values (YYYY, YYYY-MM, YYYY-MM-DD) - recent: number of most recent periods (alternative to start/end) Additional filters: - bezirk_id, stadtteil_id, ortsteil_id, planungsraum_id, block_id - baualtertyp: "neubau" (new construction) | "bestand" (existing stock) - limit, fields, include: "metadata" Key response fields (depending on zeitraum): - zeitraum=jahr: transaktionspreis_m2 (transaction price per m²), anzahl_transaktionen (number of transactions), kaufangebotspreis_m2 (asking sale price per m²), mietangebotspreis_m2 (asking rent per m²) - zeitraum=monat: kaufangebotspreis_m2, anzahl_kaufangebote (number of sale listings), kaufangebot_vermarktungszeit (time on market)

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • market_germany_apartment_buildingsNational price index data for the German apartment building market.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    National price index data for the German apartment building market. Source: vdp. Quarterly data for apartment buildings (rental buildings, "Mehrfamilienhäuser") across Germany. Time filters: - start/end: flexible date values (YYYY, YYYY-MM, YYYY-MM-DD) - recent: number of most recent periods (quarters) Response controls: - limit, fields, include: "metadata" Key response fields: - preisindex: price index for apartment buildings - preisindex_delta_1q: quarter-over-quarter change - preisindex_delta_1j: year-over-year change

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • market_germany_residentialNational market data for the German residential real estate market.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    National market data for the German residential real estate market. Sources: DESTATIS, vdp, HYPOPORT. Includes price AND transaction indices for various market segments. Parameters: - zeitraum: "jahr" (default) | "quartal" - jahr: all price and transaction indices, regional and per source - quartal: only the Germany-wide price indices of DESTATIS, vdp and HYPOPORT, current up to the second-to-last quarter; periode like "2026-Q2"; DESTATIS arrives one quarter after the other two Time filters: - start/end: flexible date values (YYYY, YYYY-MM, YYYY-MM-DD) - recent: number of most recent periods (years or quarters) Response controls: - limit, fields, include: "metadata" Key response fields: PRICE INDICES: - preisindex_gesamt_destatis, preisindex_gesamt_vdp, preisindex_gesamt_hypoport (overall price index per source) - preisindex_landkreise_kreisfreie_staedte (all districts), preisindex_grossstaedte_top_7 (top-7 major cities), preisindex_staedte_top_127 (top-127 cities) (zeitraum=jahr only) - *_delta_1j / *_delta_proz_1j: change vs. previous year (quarterly: vs. same quarter a year earlier) - *_delta_1q / *_delta_proz_1q: change vs. previous quarter (zeitraum=quartal only) TRANSACTION INDICES (zeitraum=jahr only): - transaktionsindex_landkreise_kreisfreie_staedte, transaktionsindex_grossstaedte_top_7, transaktionsindex_staedte_top_127

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • socio_berlin_age_groupsBerlin population by 8 age groups, additionally by population group.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Berlin population by 8 age groups, additionally by population group. Source: Amt für Statistik Berlin-Brandenburg. Parameters: - rbs: "stadt" (city) | "bezirk" (Borough) | "stadtteil" | "ortsteil" (District) | "planungsraum" (Neighborhood, LOR Planungsraum) - bevoelkerungsgruppe: "alle" (all) | "mit_migrationshintergrund" (with migration background) (optional) - altersgruppe: age group, e.g. "alter_unter_6", "alter_65_und_mehr" (optional) - bezirk_id, stadtteil_id, ortsteil_id, planungsraum_id: geographic filters - start/end, recent, limit, fields, include: "metadata" Key response fields: - bevoelkerungsgruppe_id/_name (population group), altersgruppe_id/_name (age group), anzahl_einwohner (number of residents)

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • socio_berlin_census_buildingsZensus 2022 building data for Berlin.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Zensus 2022 building data for Berlin. Source: Statistisches Bundesamt, Zensus 2022. Without a category: total number of buildings. With a category: - bauweise: construction type (detached, row house, semi-detached) - eigentumsform: ownership type (private individual, cooperative, municipality) - heizungsart: heating type (central heating, per-floor heating, individual stoves) - energietraeger: energy source (gas, oil, district heating, electricity) Parameters: - rbs: "stadt" (city) | "bezirk" (Borough) | "stadtteil" | "ortsteil" (District) | "planungsraum" (Neighborhood, LOR Planungsraum) - kategorie: "bauweise" | "eigentumsform" | "heizungsart" | "energietraeger" (optional) - bezirk_id, stadtteil_id, ortsteil_id, planungsraum_id: geographic filters - start/end, recent, limit, fields, include: "metadata"

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • socio_berlin_census_dwellingsZensus 2022 dwelling stock data for Berlin.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Zensus 2022 dwelling stock data for Berlin. Source: Statistisches Bundesamt, Zensus 2022. Without a category: total number of dwellings. With a category: - raeume: breakdown by number of rooms - flaeche: breakdown by floor-area cluster (under 40 m², 40-59 m², etc.) - nutzung: breakdown by type of use (owner-occupied, rented, vacant) Parameters: - rbs: "stadt" (city) | "bezirk" (Borough) | "stadtteil" | "ortsteil" (District) | "planungsraum" (Neighborhood, LOR Planungsraum) - kategorie: "raeume" | "flaeche" | "nutzung" (optional) - bezirk_id, stadtteil_id, ortsteil_id, planungsraum_id: geographic filters - start/end, recent, limit, fields, include: "metadata"

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • socio_berlin_census_householdsZensus 2022 household data for Berlin.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Zensus 2022 household data for Berlin. Source: Statistisches Bundesamt, Zensus 2022. Without a category: total number of households. With a category: - groesse: household size (1 person, 2 persons, etc.) - wohndauer: length of residence (under 1 year, 1-5 years, etc.) Parameters: - rbs: "stadt" (city) | "bezirk" (Borough) | "stadtteil" | "ortsteil" (District) | "planungsraum" (Neighborhood, LOR Planungsraum) - kategorie: "groesse" | "wohndauer" (optional) - bezirk_id, stadtteil_id, ortsteil_id, planungsraum_id: geographic filters - start/end, recent, limit, fields, include: "metadata"

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • socio_berlin_census_rentsZensus 2022 rent data for Berlin.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Zensus 2022 rent data for Berlin. Source: Statistisches Bundesamt, Zensus 2022. Without a category: weighted average across all dwellings (net cold rent, net cold rent per m², count). With category "flaeche": rent per m² by floor-area cluster. Parameters: - rbs: "stadt" (city) | "bezirk" (Borough) | "stadtteil" | "ortsteil" (District) | "planungsraum" (Neighborhood, LOR Planungsraum) - kategorie: "flaeche" (optional) - bezirk_id, stadtteil_id, ortsteil_id, planungsraum_id: geographic filters - start/end, recent, limit, fields, include: "metadata" Key response fields: - nettokaltmiete: average net cold rent (EUR) - nettokaltmiete_m2: net cold rent per m² (EUR) - anzahl_wohnungen: number of dwellings

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • socio_berlin_census_vacancyZensus 2022 dwelling vacancy data for Berlin.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Zensus 2022 dwelling vacancy data for Berlin. Source: Statistisches Bundesamt, Zensus 2022. Breakdown by vacancy category (duration or reason). Parameters: - rbs: "stadt" (city) | "bezirk" (Borough) | "stadtteil" | "ortsteil" (District) | "planungsraum" (Neighborhood, LOR Planungsraum) - kategorie: "dauer" (duration) | "grund" (reason) (optional) - bezirk_id, stadtteil_id, ortsteil_id, planungsraum_id: geographic filters - start/end, recent, limit, fields, include: "metadata" Key response fields: - kategorie_id, kategorie_label: vacancy category - anzahl: number of vacant dwellings

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • socio_berlin_construction_activityConstruction activity data for Berlin.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Construction activity data for Berlin. Source: Amt für Statistik Berlin-Brandenburg. Shows net changes: building balance, dwelling balance, living-space balance. Parameters: - rbs: "stadt" (city) | "bezirk" (Borough) | "stadtteil" | "ortsteil" (District) | "planungsraum" (Neighborhood, LOR Planungsraum) - bezirk_id, stadtteil_id, ortsteil_id, planungsraum_id: geographic filters - start/end: period (YYYY, YYYY-MM, YYYY-MM-DD) - recent: number of most recent periods - limit, fields, include: "metadata" Key response fields: - gebaeude_saldo: net change in number of buildings - wohnungen_saldo: net change in number of dwellings - wohnflaeche_m2_saldo: net change in living space (m²)

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • socio_berlin_migration_externalExternal migration for Berlin: migration across the city boundary, annual, by nationality.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    External migration for Berlin: migration across the city boundary, annual, by nationality. Source: Amt für Statistik Berlin-Brandenburg. Parameters: - rbs: "stadt" (city) | "bezirk" (Borough) | "stadtteil" | "ortsteil" (District) | "planungsraum" (Neighborhood, LOR Planungsraum) - bezirk_id, stadtteil_id, ortsteil_id, planungsraum_id: geographic filters - staat_code: filter by country code (e.g. "000" for Germany) - alpha2: filter by ISO 3166-1 alpha-2 code (e.g. "TR") - start/end, recent, limit, fields, include: "metadata" Key response fields: - zuzuege: move-ins to Berlin - fortzuege: move-outs from Berlin - saldo: net migration (move-ins minus move-outs)

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • socio_berlin_migration_matrixMigration matrix for Berlin: migration flows between areas (moves within Berlin, annual).No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Migration matrix for Berlin: migration flows between areas (moves within Berlin, annual). The RBS level applies to both origin and destination. Source: Amt für Statistik Berlin-Brandenburg. Parameters: - rbs: "stadt" (city) | "bezirk" (Borough) | "stadtteil" | "ortsteil" (District) | "planungsraum" (Neighborhood, LOR Planungsraum) (default: bezirk) - von_rbs_id: filter by origin-area ID - nach_rbs_id: filter by destination-area ID - min_personen: lower bound on number of persons (default 1) - start/end, recent, limit, fields, include: "metadata" Key response fields: - von_rbs_id/von_rbs_name: origin area - nach_rbs_id/nach_rbs_name: destination area - anzahl_personen: number of moves

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • socio_berlin_originBerlin population with a migration background, by area of origin.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote itContains invisible characters, shown as [U+…]
    Berlin population with a migration background, by area of origin. Source: Amt für Statistik Berlin-Brandenburg. ⚠[U+FE0F] herkunft_ebene: "eu_gesamt" is the aggregate over the individual "eu_land" entries. The default (drittland,eu_gesamt,nicht_zuordenbar) prevents double-counting EU countries. Parameters: - rbs: "stadt" (city) | "bezirk" (Borough) | "stadtteil" | "ortsteil" (District) | "planungsraum" (Neighborhood, LOR Planungsraum) - herkunft_ebene: origin level, comma-separated, e.g. "drittland,eu_gesamt" (optional; default prevents double counting) - herkunftsgebiet: area of origin, e.g. "tuerkei", "ukraine", "eu" (optional) - top: top N areas of origin by count (optional) - bezirk_id, stadtteil_id, ortsteil_id, planungsraum_id: geographic filters - start/end, recent, limit, fields, include: "metadata" Key response fields: - herkunftsgebiet_id/_name (area of origin), herkunft_ebene (origin level), anzahl_einwohner_mit_migrationshintergrund (residents with a migration background)

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • socio_berlin_populationPopulation stock for Berlin (headline figures) at the Neighborhood level (LOR Planungsraum), semi-annual.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Population stock for Berlin (headline figures) at the Neighborhood level (LOR Planungsraum), semi-annual. Source: Amt für Statistik Berlin-Brandenburg. Parameters: - rbs: "stadt" (city) | "bezirk" (Borough) | "stadtteil" | "ortsteil" (District) | "planungsraum" (Neighborhood) - bezirk_id, stadtteil_id, ortsteil_id, planungsraum_id: geographic filters - start/end, recent, limit, fields, include: "metadata" Key response fields: - einwohner_gesamt (total population), einwohner_maennlich/_weiblich (male/female) - einwohner_deutsch/_auslaendisch (German/foreign nationals), einwohner_ohne/_mit_migrationshintergrund (without/with migration background) - frauen_anteil, auslaender_anteil, migrationshintergrund_anteil: shares of women, foreign nationals, migration background (0–1)

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
Only reads 10Claude Code: allow
  • berlin_borough_detailsReturns details for one Berlin borough (Bezirk) by ID, optionally with all its districts.No findings

    Why it is in this group

    • The description's first verb is "return": a word for reading.
    Description, as the server wrote it
    Returns details for one Berlin borough (Bezirk) by ID, optionally with all its districts. Parameters: - bezirk_id (required): 2-digit ID ("01" to "12") - ortsteile: "true" to include all districts of the borough Key response fields: { bezirk_id, bezirk_name, ortsteile?: [...] } (ortsteile = districts) Example: bezirk_id="03" → Pankow with 13 districts (Prenzlauer Berg, Weißensee, etc.)

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • berlin_boroughsReturns all 12 Berlin boroughs (Bezirke) with IDs and names.No findings

    Why it is in this group

    • The description's first verb is "return": a word for reading.
    Description, as the server wrote it
    Returns all 12 Berlin boroughs (Bezirke) with IDs and names. Key response fields: array of { bezirk_id, bezirk_name } - bezirk_id: 2 digits ("01" to "12") - bezirk_name: e.g. "Mitte", "Friedrichshain-Kreuzberg", "Pankow" Use when: - You need an overview of Berlin's administrative structure - You need a bezirk_id for market data queries Do NOT use when: - You already know the bezirk_id → use berlin_borough_details directly

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • berlin_conservation_area_detailsReturns a single Berlin social conservation area (Milieuschutzgebiet) by ID.No findings

    Why it is in this group

    • The description's first verb is "return": a word for reading.
    Description, as the server wrote it
    Returns a single Berlin social conservation area (Milieuschutzgebiet) by ID. For main areas, associated extensions are embedded automatically. Parameters: - id (required): 12-character hex string (deterministic area ID) - include: comma-separated geo attributes; available: "centroid". Polygons are provided as GeoJSON URLs in geometry_urls Key response fields: { id, name, kategorie_id, kategorie_name, parent_id, beschreibung (description), datum (date), flaeche_km2 (area in km²), geometry_urls, centroid?, erweiterungen? (extensions) }

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • berlin_district_detailsReturns details for one Berlin district (Ortsteil) by ID, optionally with its neighborhoods.No findings

    Why it is in this group

    • The description's first verb is "return": a word for reading.
    Description, as the server wrote it
    Returns details for one Berlin district (Ortsteil) by ID, optionally with its neighborhoods. Parameters: - ortsteil_id (required): 4-digit ID (e.g. "0301") - planungsraeume: "true" to include all neighborhoods of the district Key response fields: { ortsteil_id, ortsteil_name, bezirk_id, bezirk_name, planungsraeume?: [...] } (planungsraeume = neighborhoods)

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • berlin_districtsReturns all 97 Berlin districts (Ortsteile), optionally filtered by borough.No findings

    Why it is in this group

    • The description's first verb is "return": a word for reading.
    Description, as the server wrote it
    Returns all 97 Berlin districts (Ortsteile), optionally filtered by borough. Parameters: - bezirk_id (optional): filter to the districts of one borough - bezirke: "true" to include borough references Key response fields: array of { ortsteil_id, ortsteil_name, bezirk_id?, bezirk_name? } - ortsteil_id: 4 digits (e.g. "0301" for Prenzlauer Berg) Examples of well-known districts: - Prenzlauer Berg (0301), Kreuzberg (0201), Mitte (0101) - Charlottenburg (0401), Neukölln (0801), Friedrichshain (0202)

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • berlin_neighborhood_detailsReturns details for one Berlin neighborhood (LOR Planungsraum) by ID, optionally with its blocks.No findings

    Why it is in this group

    • The description's first verb is "return": a word for reading.
    Description, as the server wrote it
    Returns details for one Berlin neighborhood (LOR Planungsraum) by ID, optionally with its blocks. Parameters: - planungsraum_id (required): 8-digit ID - bloecke: "true" to include all blocks of the neighborhood Key response fields: { planungsraum_id, planungsraum_name, bezirk_id, bezirk_name, ortsteil_id, ortsteil_name, bloecke?: [...] } (bloecke = blocks)

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • berlin_neighborhoodsReturns all 542 Berlin neighborhoods (LOR Planungsräume), optionally filtered by borough or district.No findings

    Why it is in this group

    • The description's first verb is "return": a word for reading.
    Description, as the server wrote it
    Returns all 542 Berlin neighborhoods (LOR Planungsräume), optionally filtered by borough or district. Parameters: - bezirk_id (optional): filter by borough - ortsteil_id (optional): filter by district - bezirke/ortsteile: "true" to include parent references Key response fields: array of { planungsraum_id, planungsraum_name, ... } - planungsraum_id: 8 digits (e.g. "03010101") Neighborhoods are the finest statistical level in Berlin. Ideal for granular market analyses.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • field_metadataReturns field definitions for interpreting API responses.No findings

    Why it is in this group

    • The description's first verb is "return": a word for reading.
    Description, as the server wrote it
    Returns field definitions for interpreting API responses. Use this to understand fields, units, data types, and sources. Parameters: - domain (optional): specific domain for detailed field information - locale: "de" (default) | "en" Available domains: - berlin: geographic reference data — Boroughs (Bezirke), Districts (Ortsteile), Neighborhoods (LOR Planungsräume) - immobilienmarkt.berlin.wohnungen: Berlin apartment market - immobilienmarkt.berlin.mehrfamilienhaeuser: Berlin apartment buildings - makrooekonomie.kapitalmarkt: mortgage lending rates, Bund yields - makrooekonomie.geldpolitik: ECB policy rates - makrooekonomie.arbeitsmarkt: unemployment, employment Without a domain parameter: returns an overview of all available domains.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false

This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.

Install

Pinned to version 0.3.0. Values in angle brackets are yours to fill in.

claude mcp add --transport http guthmann https://mcp.guthmann.estate/mcp

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.

.claude/settings.json
{
  "permissions": {
    "allow": [
      "mcp__guthmann__berlin_boroughs",
      "mcp__guthmann__berlin_borough_details",
      "mcp__guthmann__berlin_districts",
      "mcp__guthmann__berlin_district_details",
      "mcp__guthmann__berlin_neighborhoods",
      "mcp__guthmann__berlin_neighborhood_search",
      "mcp__guthmann__berlin_neighborhood_details",
      "mcp__guthmann__berlin_conservation_area_details",
      "mcp__guthmann__field_metadata",
      "mcp__guthmann__search"
    ],
    "ask": [
      "mcp__guthmann__berlin_conservation_areas",
      "mcp__guthmann__market_berlin_apartments",
      "mcp__guthmann__market_berlin_apartment_buildings",
      "mcp__guthmann__market_germany_residential",
      "mcp__guthmann__market_germany_apartment_buildings",
      "mcp__guthmann__listings",
      "mcp__guthmann__listing_details",
      "mcp__guthmann__macro_ecb_policy_rates",
      "mcp__guthmann__macro_mortgage_lending",
      "mcp__guthmann__macro_bund_yields",
      "mcp__guthmann__macro_labor_unemployment",
      "mcp__guthmann__macro_labor_employment",
      "mcp__guthmann__macro_labor_short_time_work",
      "mcp__guthmann__macro_inflation_hicp",
      "mcp__guthmann__macro_construction_prices",
      "mcp__guthmann__macro_gdp",
      "mcp__guthmann__socio_berlin_construction_activity",
      "mcp__guthmann__socio_berlin_migration_external",
      "mcp__guthmann__socio_berlin_migration_matrix",
      "mcp__guthmann__socio_berlin_population",
      "mcp__guthmann__socio_berlin_age_groups",
      "mcp__guthmann__socio_berlin_origin",
      "mcp__guthmann__socio_berlin_census_dwellings",
      "mcp__guthmann__socio_berlin_census_vacancy",
      "mcp__guthmann__socio_berlin_census_rents",
      "mcp__guthmann__socio_berlin_census_buildings",
      "mcp__guthmann__socio_berlin_census_households"
    ],
    "deny": []
  }
}

Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as guthmann. Review it before you use it.