CaLesVaut

Is this listing too expensive? French property sales (DVF), crime, rents, risks, schools

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
93%
Naming quality
82%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~3,691Tokens (tool definitions)
~2.2 KBTypical response size
Significant attention impact (2.88% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "calesvaut": {
      "url": "https://calesvaut.fr/mcp"
    }
  }
}

Remote endpoints

https://calesvaut.fr/mcpstreamable-http

What it can do

Tool inventory

Tools (10)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢find_place(query)

Resolves a city name or postcode: its centre, extent and number of recorded sales, and the French communes of that name (INSEE codes) for crime_stats.

Input Schema

{
  "type": "object",
  "properties": {
    "query": {
      "description": "City, its start, a word of its name (\"Hardelot\" for Neufchâtel-Hardelot) or postcode.",
      "type": "string"
    }
  },
  "required": [
    "query"
  ]
}
🟢property_prices(address, lat, lng, place, radius_m, ...)

Median sale price and price per m² of recorded sales within a radius, overall, per property type and per year, over the last years of data.

Input Schema

{
  "type": "object",
  "properties": {
    "address": {
      "description": "Street address with its postcode or city (e.g. \"17 rue Gambey, 75011 Paris\"), located where its sales were recorded (else its street's). Ignored when lat and lng are given.",
      "type": "string"
    },
    "lat": {
      "description": "Latitude (WGS84).",
      "type": "number"
    },
    "lng": {
      "description": "Longitude (WGS84).",
      "type": "number"
    },
    "place": {
      "description": "City, city start or postcode (e.g. \"Carnac\", \"Paris 11e\", \"75011\"); with address, the place it is in. Ignored when lat and lng are given.",
      "type": "string"
    },
    "radius_m": {
      "description": "Radius in metres (default 500, at most 3000).",
      "maximum": 3000,
      "minimum": 50,
      "type": "integer"
    },
    "type": {
      "description": "Property type as the source names it, e.g. \"Appartement\" or \"Maison\" in France.",
      "type": "string"
    },
    "years": {
      "description": "Years of sales counted back from the latest (default 5, at most 12).",
      "maximum": 12,
      "minimum": 1,
      "type": "integer"
    }
  },
  "required": []
}
🟢sales_at_address(address, limit, place, type)

Every recorded sale at a street address (date, price, floor area, price per m², rooms, type), newest first, and a summary of its street with its latest other sales. Spellings are loose: "17 bis avenue de Saint-Mandé" finds "17 B AV DE ST MANDE". Without a number, the street's sales. When the street is not found, similar street names.

Input Schema

{
  "type": "object",
  "properties": {
    "address": {
      "description": "Street address, with its postcode or city unless place gives it (e.g. \"17 rue Gambey, 75011 Paris\").",
      "type": "string"
    },
    "limit": {
      "description": "Sales returned (default 50, at most 200).",
      "maximum": 200,
      "minimum": 1,
      "type": "integer"
    },
    "place": {
      "description": "City or postcode the address is in, when the address does not say.",
      "type": "string"
    },
    "type": {
      "description": "Property type as the source names it, e.g. \"Appartement\" or \"Maison\" in France.",
      "type": "string"
    }
  },
  "required": [
    "address"
  ]
}
🟢recent_sales(address, lat, limit, lng, max_price, ...)

The latest recorded sales within a radius (date, price, floor area, price per m², rooms, type, address, distance).

Input Schema

{
  "type": "object",
  "properties": {
    "address": {
      "description": "Street address with its postcode or city (e.g. \"17 rue Gambey, 75011 Paris\"), located where its sales were recorded (else its street's). Ignored when lat and lng are given.",
      "type": "string"
    },
    "lat": {
      "description": "Latitude (WGS84).",
      "type": "number"
    },
    "limit": {
      "description": "Sales returned (default 20, at most 100).",
      "maximum": 100,
      "minimum": 1,
      "type": "integer"
    },
    "lng": {
      "description": "Longitude (WGS84).",
      "type": "number"
    },
    "max_price": {
      "description": "Maximum price.",
      "type": "integer"
    },
    "min_surface": {
      "description": "Minimum floor area in m².",
      "type": "integer"
    },
    "place": {
      "description": "City, city start or postcode (e.g. \"Carnac\", \"Paris 11e\", \"75011\"); with address, the place it is in. Ignored when lat and lng are given.",
      "type": "string"
    },
    "radius_m": {
      "description": "Radius in metres (default 300, at most 2000).",
      "maximum": 2000,
      "minimum": 50,
      "type": "integer"
    },
    "type": {
      "description": "Property type as the source names it, e.g. \"Appartement\" or \"Maison\" in France.",
      "type": "string"
    }
  },
  "required": []
}
🟢crime_stats(address, commune, lat, lng, place)

Offences recorded by police and gendarmerie (SSMSI, latest year) for a French commune — by name, INSEE code or position — per indicator, as rates per 1,000 inhabitants (per 1,000 dwellings for burglaries), next to its département, région and France, with the yearly trend.

Input Schema

{
  "type": "object",
  "properties": {
    "address": {
      "description": "Street address with its postcode or city (e.g. \"17 rue Gambey, 75011 Paris\"), located where its sales were recorded (else its street's). Ignored when lat and lng are given.",
      "type": "string"
    },
    "commune": {
      "description": "Commune name or INSEE code (e.g. \"Carnac\", \"56034\"), or a département code (\"56\").",
      "type": "string"
    },
    "lat": {
      "description": "Latitude (WGS84).",
      "type": "number"
    },
    "lng": {
      "description": "Longitude (WGS84).",
      "type": "number"
    },
    "place": {
      "description": "City, city start or postcode (e.g. \"Carnac\", \"Paris 11e\", \"75011\"); with address, the place it is in. Ignored when lat and lng are given.",
      "type": "string"
    }
  },
  "required": []
}
🟢commune_profile(address, commune, lat, lng, place)

For a French commune (by name, INSEE code or position) or département: asking rents per m² (charges included) for flats, small and large flats and houses, with their range (ANIL/DHUP Carte des loyers); the energy ratings (DPE A–G) of its dwellings diagnosed since July 2021 and the share of passoires thermiques (F or G, which may no longer be let: G since 2025, F from 2028), per flats and houses (ADEME); its natural risks: the risks listed by the state (DDRM), natural disaster (CatNat) decrees since 1982, prevention plans, radon potential (Géorisques); its local tax rates (DGFiP, in %): taxe foncière on buildings and on land, the household waste tax (TEOM; null where a fee pays for it), taxe d'habitation (on second homes and vacant dwellings only since 2023) with the commune's surcharge on second homes, the latest year's and the first's, the taxe foncière year by year, and for a commune how each rate splits between the commune, its syndicates, its intercommunality (named), special taxes and GEMAPI; its median price per m² of recorded sales (DVF) for flats, houses and both over the latest two years against the two before, and year by year; its home internet (ARCEP Ma connexion internet): the share of premises fibre, cable, copper DSL (copper_closed: no new subscribers), fixed 4G, radio and satellite reach, the share getting 8 and 30 Mbit/s and 1 Gbit/s by wire, and its premises by best technology; each mobile operator's 4G coverage of its homes (Orange, SFR, Bouygues Telecom, Free Mobile: the share of homes at each level of ARCEP's simulated maps, very good meaning indoors; metropolitan France), and their antennas in the commune (sites with 4G, 5G, 5G at 3.5 GHz). Each compared with its département and France.

Input Schema

{
  "type": "object",
  "properties": {
    "address": {
      "description": "Street address with its postcode or city (e.g. \"17 rue Gambey, 75011 Paris\"), located where its sales were recorded (else its street's). Ignored when lat and lng are given.",
      "type": "string"
    },
    "commune": {
      "description": "Commune name or INSEE code (e.g. \"Carnac\", \"56034\"), or a département code (\"56\").",
      "type": "string"
    },
    "lat": {
      "description": "Latitude (WGS84).",
      "type": "number"
    },
    "lng": {
      "description": "Longitude (WGS84).",
      "type": "number"
    },
    "place": {
      "description": "City, city start or postcode (e.g. \"Carnac\", \"Paris 11e\", \"75011\"); with address, the place it is in. Ignored when lat and lng are given.",
      "type": "string"
    }
  },
  "required": []
}
🟢amenities_nearby(address, lat, lng, place, radius_m)

Schools (maternelle, primaire, collège/lycée), bakeries, night clubs, noisy bars and every bar or café within a radius (France): count per kind and the nearest ones.

Input Schema

{
  "type": "object",
  "properties": {
    "address": {
      "description": "Street address with its postcode or city (e.g. \"17 rue Gambey, 75011 Paris\"), located where its sales were recorded (else its street's). Ignored when lat and lng are given.",
      "type": "string"
    },
    "lat": {
      "description": "Latitude (WGS84).",
      "type": "number"
    },
    "lng": {
      "description": "Longitude (WGS84).",
      "type": "number"
    },
    "place": {
      "description": "City, city start or postcode (e.g. \"Carnac\", \"Paris 11e\", \"75011\"); with address, the place it is in. Ignored when lat and lng are given.",
      "type": "string"
    },
    "radius_m": {
      "description": "Radius in metres (default 500, at most 3000).",
      "maximum": 3000,
      "minimum": 50,
      "type": "integer"
    }
  },
  "required": []
}
🟢street_prices(address, lat, limit, lng, order, ...)

The streets around a place with their recorded sales (DVF) and median price per m² over the last 5 years, the most expensive first, or ranked by how their median moved: the latest 24 months against the 24 before (falling or rising first; only streets with at least 8 sales with a floor area in each period have a change). Each street with 5 sales or more has a page on the site (url).

Input Schema

{
  "type": "object",
  "properties": {
    "address": {
      "description": "Street address with its postcode or city (e.g. \"17 rue Gambey, 75011 Paris\"), located where its sales were recorded (else its street's). Ignored when lat and lng are given.",
      "type": "string"
    },
    "lat": {
      "description": "Latitude (WGS84).",
      "type": "number"
    },
    "limit": {
      "description": "Streets returned (default 25, at most 100).",
      "maximum": 100,
      "minimum": 1,
      "type": "integer"
    },
    "lng": {
      "description": "Longitude (WGS84).",
      "type": "number"
    },
    "order": {
      "description": "price_desc (default), price_asc, falling (largest fall first), rising, or sales (the most sold first).",
      "enum": [
        "price_desc",
        "price_asc",
        "falling",
        "rising",
        "sales"
      ],
      "type": "string"
    },
    "place": {
      "description": "City, city start or postcode (e.g. \"Carnac\", \"Paris 11e\", \"75011\"); with address, the place it is in. Ignored when lat and lng are given.",
      "type": "string"
    },
    "radius_m": {
      "description": "Radius in metres (default 1000, at most 3000).",
      "maximum": 3000,
      "minimum": 50,
      "type": "integer"
    }
  },
  "required": []
}
🟢sea_views(address, lat, limit, lng, place, ...)

The sale addresses around a place whose sun goes down (or comes up) into the sea, month by month, with how far the shore is and their latest sale. Worked out from OpenStreetMap for France's sale addresses within 300 m of the coast: the sun's direction must reach the shore past no building but the home's own, no wood, no dune but a narrow one at the door, no cliff upwards, then cross open water. A ground-level estimate: floors, trees and relief are not known. An address missing here may still see the sea from upstairs; say so rather than that it has no view. The same view shows as sea_view on the sales of sales_at_address, recent_sales and appraise_listing.

Input Schema

{
  "type": "object",
  "properties": {
    "address": {
      "description": "Street address with its postcode or city (e.g. \"17 rue Gambey, 75011 Paris\"), located where its sales were recorded (else its street's). Ignored when lat and lng are given.",
      "type": "string"
    },
    "lat": {
      "description": "Latitude (WGS84).",
      "type": "number"
    },
    "limit": {
      "description": "Addresses returned, nearest first (default 25, at most 100).",
      "maximum": 100,
      "minimum": 1,
      "type": "integer"
    },
    "lng": {
      "description": "Longitude (WGS84).",
      "type": "number"
    },
    "place": {
      "description": "City, city start or postcode (e.g. \"Carnac\", \"Paris 11e\", \"75011\"); with address, the place it is in. Ignored when lat and lng are given.",
      "type": "string"
    },
    "radius_m": {
      "description": "Radius in metres (default 1000, at most 5000).",
      "maximum": 5000,
      "minimum": 50,
      "type": "integer"
    },
    "sun": {
      "description": "Only addresses that see the sun set (sunset) or rise (sunrise) into the sea; default any.",
      "enum": [
        "any",
        "sunset",
        "sunrise"
      ],
      "type": "string"
    }
  },
  "required": []
}
🟢appraise_listing(address, lat, lng, place, price, ...)

Compares a French listing's asking price with recent recorded sales (DVF) of the same type and a similar size around it (the smallest radius with enough of them): estimate with its interquartile range, gap and verdict, closest comparables (sales over 2.5 times off the median price per m² are left out as no market price), a headline such as "12 % au-dessus du marché", local price trend, the commune's main crime rates against France, its rent for the type (monthly rent for the floor area, gross yield at the asking price), its share of passoires thermiques (DPE F or G) for the type, its natural risks, its local tax rates (taxe foncière, waste tax, taxe d'habitation on second homes), its home internet (fibre and wired speeds), each mobile operator's 4G coverage level at the address (mobile_4g) and their antennas, amenities within 500 m, and the address's sea view when it has one.

Input Schema

{
  "type": "object",
  "properties": {
    "address": {
      "description": "Street address with its postcode or city (e.g. \"17 rue Gambey, 75011 Paris\"), located where its sales were recorded (else its street's). Ignored when lat and lng are given.",
      "type": "string"
    },
    "lat": {
      "description": "Latitude (WGS84).",
      "type": "number"
    },
    "lng": {
      "description": "Longitude (WGS84).",
      "type": "number"
    },
    "place": {
      "description": "City, city start or postcode (e.g. \"Carnac\", \"Paris 11e\", \"75011\"); with address, the place it is in. Ignored when lat and lng are given.",
      "type": "string"
    },
    "price": {
      "description": "Asking price.",
      "type": "number"
    },
    "surface": {
      "description": "Floor area in m².",
      "type": "number"
    },
    "type": {
      "description": "\"Appartement\" or \"Maison\" (others compare with every sale).",
      "type": "string"
    }
  },
  "required": [
    "price"
  ]
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded10 tools