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®.
37 tools: 27 change things and 10 only read.
Scanned Oct 21, 2026
- Deletes or cancels0Claude Code: deny
- Can't be undone0Claude Code: ask
- Changes things27Claude Code: ask: see these tools
- Only reads10Claude Code: allow: see these tools
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/mcpTools
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_neighborhood_searchSearches Berlin neighborhoods (LOR Planungsräume) by name.No findings
Why it is in this group
- The name "berlin_neighborhood_search" says "search": a word for reading.
Description, as the server wrote it Searches Berlin neighborhoods (LOR Planungsräume) by name. Parameters: - q (required): search term (min. 3 characters) - limit: max. results (default: 25) - bezirk_id/ortsteil_id: optional filters to narrow the search Example: q="Kollwitz" finds the "Kollwitzplatz" neighborhood
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
searchSemantic search over guthmann.estate — market insights, reports, neighborhood portraits, listing exposés, project pages and the company's own pages.No findings
Why it is in this group
- The name "search" says "search": a word for reading.
Description, as the server wrote it Semantic search over guthmann.estate — market insights, reports, neighborhood portraits, listing exposés, project pages and the company's own pages. Hybrid retrieval (vector + keyword, no reranking); one result per page with title, description, image, best-matching snippet and score. Use it for questions that need prose (analysis, context, advice); use the data tools for exact numbers and `listings` for what is currently for sale — the search index follows the website with up to six hours of delay. Parameters: - q: natural-language query, in the language of the pages you want (min 2 characters) - locale: "de" | "en" — language of the indexed pages (default: en) - section: comma-separated filter — "listings" (exposés), "projects" (new-build projects), "market-intelligence" (insights, reports, portraits), "pages" (company, services, guides); omit for all - limit: 1-20 pages (default: 10) Key response fields: - url, title, description, image, section, language - snippet (best-matching text passage), score (0-1)
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: true
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/mcpRun in a terminal.
Claude Code permissions
Allow the reads, ask before a change, deny the deletes. Paste into .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.