normi
Server Details
French property market data — 17M+ DVF sales, 22M+ DPE energy ratings, 20M+ building records.
- Status
- Healthy
- Uptime
- 24.1% over 41 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 33 tools
The set has several overlapping analytical tools, especially in DPE price analysis and market statistics/trend/health. Descriptions include 'when to use this vs X' guidance, which helps, but an agent still has to parse long text to avoid misselection. Boundaries are not always crisp across 33 tools.
Nearly all tools use a consistent snake_case, verb-first pattern such as add_property_to_portfolio, analyze_market_statistics, get_market_overview, and delete_market_alert. Minor variations like preposition placement do not break the overall predictability. The naming scheme is coherent throughout.
At 33 tools, the surface is well beyond the typical 3-15 range and feels heavy even for a broad real estate analytics domain. Many analysis tools overlap and could likely be consolidated or bundled into fewer entry points. The count suggests overexposure rather than a tightly scoped set.
The server covers core market analysis, property transactions, DPE, BDNB building data, portfolio CRUD, alert CRUD, and business lookup workflows. Minor gaps exist, such as individual property DPE details or direct rental listing search, but most foreseeable agent workflows have an available tool. The surface is largely complete with only small missing edges.
Available Tools
33 toolsadd_property_to_portfolioAdd Property to PortfolioAInspect
Add a property to your portfolio. For Maison/Appartement, an estimate is automatically computed (10 credits). For other types, only metadata is stored (2 credits).
REQUIRED: latitude, longitude, type_local, surface
Optional: label, address, code_postal, commune, pieces, purchase_price
Returns the created property record with estimate fields (if applicable).
Cost: 10 credits (Maison/Appartement) or 2 credits (other types)
| Name | Required | Description | Default |
|---|---|---|---|
| label | No | Custom label for this property | |
| pieces | No | Number of rooms | |
| address | No | Street address | |
| commune | No | Commune | |
| surface | Yes | Surface area in m² | |
| latitude | Yes | GPS latitude of the property | |
| longitude | Yes | GPS longitude of the property | |
| type_local | Yes | Property type | |
| code_postal | No | Postal code | |
| purchase_price | No | Purchase price in euros (for tracking gains) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the write profile (readOnlyHint=false, idempotentHint=false, destructiveHint=false), so the safety bar is lower. The description adds real context beyond that: automatic estimate computation for Maison/Appartement, metadata-only storage for other types, and a credit cost of 10 vs 2. It does not mention auth requirements or whether repeated calls create duplicates.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and the key conditional cost, and reasonably compact. Slightly redundant: the credit cost is stated twice (inline parenthetical and a trailing 'Cost:' line), which costs a sentence without new information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description steps in to say it returns the created property record with estimate fields, which is what an agent needs. Credit pricing and the estimate-vs-metadata branching are covered. It stops short of covering duplicate handling, idempotency behavior, or any error conditions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter is already documented in the schema, including the type_local enum. The description's required/optional listing merely restates what the schema's required array and field descriptions already encode, adding no format or constraint detail beyond it. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Add) and resource (property to portfolio), clearly distinguishing it from the sibling update_portfolio_property, delete_portfolio_property, and list_portfolio_properties tools. An agent can identify the create operation without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies usage (adding a property to your portfolio) but never states when to prefer this over siblings like estimate_property_value or update_portfolio_property. It does disclose a type-conditional behavior (estimate computed for Maison/Appartement, metadata only otherwise), which is useful, but no explicit when-not guidance or named alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analyze_building_age_price_impactAnalyze Building Age Price Impact (BDNB)ARead-onlyInspect
Get median prix/m² grouped by construction decade for a location.
Shows how building age affects price — the premium or discount of each era vs. the area median. Useful for advising whether older buildings trade at a discount and how much.
Construction decade buckets: avant_1919, 1919_1945, 1946_1970, 1971_1990, 1991_2005, 2006_plus
REQUIRED: at least one location — code_postal, commune, or code_departement OPTIONAL: type_local (Maison|Appartement)
Example output: { tranche: "1946_1970", nb: 312, prix_m2_median: 3800, vs_zone_pct: -12 } → buildings from 1946-1970 sell 12% below the area median
Cost: 10 credits
| Name | Required | Description | Default |
|---|---|---|---|
| commune | No | Commune name (e.g., 'LYON', 'PARIS 11') | |
| type_local | No | Property type filter: Maison or Appartement (default: all) | |
| code_postal | No | Postal code (e.g., '69001') | |
| code_departement | No | Department code (e.g., '69', '75') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds genuinely non-derivable context: the 10-credit cost, the at-least-one-location constraint, and the exact decade buckets returned. It stops short of describing pagination or result limits, keeping it out of the top tier.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core operation, then organized into labeled sections (buckets, required/optional, example, cost) that are easy to scan. The example-output line and its interpretation earn their place, though the block is longer than strictly minimal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by supplying a concrete example output row plus interpretation, the full set of decade bucket keys, the location requirement, and the cost. An agent has everything needed to invoke and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, which normally anchors a 3, but the description adds meaning the schema lacks: the schema declares no required fields, while the description states 'REQUIRED: at least one location — code_postal, commune, or code_departement', which is a real constraint not encoded anywhere in the schema. That lifts it above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb (Get median prix/m²) and a specific grouping dimension (construction decade) for a location, which no sibling tool covers — nothing else in the sibling list analyzes building age. An agent can select this without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a clear use context ('advising whether older buildings trade at a discount and how much'), which tells the agent when this is relevant. However, it never names an alternative (e.g., analyze_dpe_price_premium or get_zonal_price_distribution) or states when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analyze_building_stockAnalyze Building Stock (BDNB)ARead-onlyInspect
Get aggregate building stock characteristics for a location from the BDNB national database.
Counts ALL buildings (not just those with DVF transactions). Returns totals by construction decade, usage type, total housing units, and percentage of pre-1975 buildings (renovation indicator). par_usage (BDNB usage_principal): residentiel (= residentiel_collectif + residentiel_individuel), tertiaire, dependance, secondaire, non_renseigne; mixte and autre are kept for compatibility.
REQUIRED: at least one location — code_commune_insee, commune, or code_departement
code_commune_insee: 5-digit INSEE code (most precise, no ambiguity between same-name communes)
commune: city name (uppercase, e.g. "LYON")
code_departement: department code (e.g. "69")
Example output: { nb_batiments: 12500, annee_construction_median: 1968, pct_vieux: 42, par_tranche: { avant_1919: 800, "1946_1970": 4200, ... }, par_usage: { residentiel: 4440, residentiel_collectif: 2740, residentiel_individuel: 1700, tertiaire: 623, dependance: 38, secondaire: 11, non_renseigne: 986, mixte: 0, autre: 0 } }
Cost: 5 credits
| Name | Required | Description | Default |
|---|---|---|---|
| commune | No | Commune name (e.g., 'LYON') | |
| code_postal | No | Postal code (e.g., '75015') | |
| code_departement | No | Department code (e.g., '69') | |
| code_commune_insee | No | INSEE commune code (5 digits, e.g., '69123') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint=false, so the safety profile is covered. The description adds genuinely useful context beyond that: the credit cost, the 'all buildings' counting rule, and the par_usage bucket semantics (residentiel = collectif + individuel).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then constraints, then parameter guidance, then a concrete output sample. Dense but every block earns its place; the enum enumeration for par_usage is slightly verbose but relevant to interpreting results.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by supplying a worked example output covering top-level keys and nested par_tranche/par_usage maps, plus the required-input rule and cost. An agent has enough to call and interpret the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real meaning: it states the 'at least one of' requirement and calls out code_commune_insee as most precise to avoid same-name ambiguity. Minor gap: code_postal appears in the schema but is omitted from the location list in the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Get aggregate building stock characteristics') plus a scoped resource and names its data source (BDNB national database). The 'aggregate' framing and 'Counts ALL buildings (not just those with DVF transactions)' distinguishes it from row-level siblings like get_building_characteristics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly states the precondition ('at least one location') and ranks the location parameters by precision, and carves out its scope versus DVF-based tools. It does not explicitly name a sibling alternative the way a 5 would, so it stops at clear context without exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analyze_dpe_distributionAnalyze DPE DistributionARead-onlyInspect
Get the DPE (energy performance) class distribution for a location.
Returns the count and share of A–G energy ratings across all diagnosed properties.
REQUIRED: at least one location — code_postal, commune, or code_departement OPTIONAL: type_batiment (maison|appartement|immeuble), date_debut
Example: code_postal: "75011" → { count: 42300, distribution: { A: 812, B: 3100, ... }, pct: { A: 1.9, B: 7.3, ... } }
Cost: 10 credits
| Name | Required | Description | Default |
|---|---|---|---|
| commune | No | Commune name (e.g., 'PARIS 11', 'BORDEAUX') | |
| date_debut | No | Only count DPEs issued from this date (YYYY-MM-DD) | |
| code_postal | No | Postal code (e.g., '75011') | |
| type_batiment | No | Building type: maison, appartement, immeuble | |
| code_departement | No | Department code (e.g., '75', '33') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds genuinely useful context beyond annotations: the 10-credit cost, the at-least-one-location constraint, and the shape of the returned distribution, which the annotations do not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then constraints, then a compact example and cost line. Formatting is scannable and every element earns its place; the example JSON is slightly long but directly useful given there is no output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by showing the response shape (count, distribution, pct) in an example. Required-parameter semantics are fully specified. It lacks coverage of error behavior or result-size limits, but nothing essential for a correct call is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning the schema cannot express: the cross-parameter requirement that at least one of code_postal/commune/code_departement be supplied (the schema marks zero required fields). It also clarifies that distribution is per energy class A–G.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Get') and resource ('DPE class distribution') with a clear scope ('for a location') and spells out the return payload (count and share of A–G ratings). It is distinguishable from siblings like analyze_dpe_price_premium and analyze_dpe_price_and_thermal_risk, which concern price rather than class distribution.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operating context: REQUIRED at least one location parameter (code_postal, commune, or code_departement), OPTIONAL type_batiment and date_debut filters, plus a worked example and a cost figure. It does not name alternative tools or when-not-to-use conditions, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analyze_dpe_price_and_thermal_riskAnalyze DPE Price & Thermal RiskARead-onlyInspect
Combined DPE market analysis — price per energy class AND thermal sieve stock. Use when you need the full DPE picture in a single call.
Returns TWO distinct analyses:
Median price/m² per energy class (A–G) with taux_couverture_dpe (share of sales with a DPE within 200m)
prime_verte: each class's median vs class D (descriptive gap, see limitations in the response)
Thermal sieves (passoires thermiques): share of F/G transactions since 2022 with annual trend
WHEN TO USE THIS vs analyze_dpe_price_premium:
Use analyze_dpe_price_and_thermal_risk for a full DPE snapshot (prices + sieve stock + trend)
Use analyze_dpe_price_premium when you only need "how much more is an A vs the local median?"
REQUIRED: at least one location — code_postal, commune (e.g., "PARIS 11"), or code_departement OPTIONAL: type_local (Maison|Appartement)
Note: Alsace (dept. 67, 68) returns zero results — DVF does not cover Alsace-Moselle (Livre foncier). Matching: nearest DPE within 200m of each sale; it is often a neighbouring building, so class gaps are indicative.
Cost: 10 credits
| Name | Required | Description | Default |
|---|---|---|---|
| commune | No | Commune name in uppercase (e.g., 'LYON', 'PARIS 15') | |
| annee_min | No | Only include transactions from this year onward (default: all years) | |
| type_local | No | Property type filter (default: all) | |
| code_postal | No | Postal code | |
| code_departement | No | Department code |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint, but the description adds materially: cost (10 credits), the Alsace/dept 67-68 zero-result limitation, the 200m nearest-DPE matching caveat that class gaps are indicative, and the data-coverage limitation pointers for prime_verte. These are real behavioral traits an agent needs and are not in the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the one-line purpose, then structures detail into numbered analyses, a when-to-use block, param requirements, and caveats. Slightly long and the numbering (1, 2 then 3) is a bit uneven, but nearly every line carries information the caller needs for a multi-output analytical tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description fully explains the return shape (two distinct analyses, threshold/coverage metric, sieve share with annual trend), the constraints, the data limitations, and the cost. Nothing essential for correct invocation or interpretation appears missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the per-parameter descriptions are already present. However, the schema lists 0 required parameters, while the description supplies the true constraint ('REQUIRED: at least one location — code_postal, commune, or code_departement'), which is a meaningful addition the schema does not encode. It also clarifies the Maison|Appartement option but adds little else beyond schema syntax.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Combined DPE market analysis — price per energy class AND thermal sieve stock') and enumerates exactly what the three returned analyses are. It also names and contrasts with the closest sibling, analyze_dpe_price_premium, so an agent can distinguish them without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Has an explicit 'WHEN TO USE THIS vs analyze_dpe_price_premium' block that gives the selection condition for each ('full DPE snapshot' vs 'how much more is an A vs the local median'). This is textbook when-to-use/when-to-use-the-alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analyze_market_activityAnalyze Market ActivityARead-onlyInspect
Monthly transaction volume time series — use when you need to show how activity has changed over time, not when you need a single comparable number.
WHEN TO USE THIS vs score_market_health:
Use analyze_market_activity when the question is "show me how volume has evolved" or "is there seasonality?"
Use score_market_health when the question is "is this market good or bad?" or "compare two markets"
REQUIRED: At least one location filter:
code_postal, commune (e.g., "PARIS 11"), or code_departement
Optional:
type_local: Property type filter
months: Analysis period (default: 24, max: 60)
Returns:
Monthly transaction volumes with YoY changes
Trend direction: "increasing", "decreasing", or "stable"
Activity level: "hot", "normal", or "slow"
Seasonality: peak and low months
Market signal with description
Example: Lyon market activity: {commune: "LYON", type_local: "Appartement", months: 24}
Note: DVF data covers 2014–2025 (annual cadence). Use months ≥ 12 for reliable results.
Cost: 10 credits per call
| Name | Required | Description | Default |
|---|---|---|---|
| months | No | Number of months to analyze (default: 24) | |
| commune | No | ||
| type_local | No | ||
| code_postal | No | ||
| code_departement | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint/openWorldHint, so the description adds real behavioral context: a per-call cost of 10 credits, the DVF 2014–2025 data cadence with a months ≥ 12 reliability caveat, and a constraint the schema does not encode (at least one location filter is required despite zero required params).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and routing, then required/optional/returns/example/notes in scannable sections; every block carries information. The Returns list and example add some length, but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully describes the return payload (volumes with YoY, trend direction, activity level, seasonality, market signal) and also covers cost, data coverage, and the implicit required-filter rule. An agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 20%, so the description must compensate — it documents the commune example ('PARIS 11'), the role of code_departement/code_postal as alternative location filters, type_local as a property-type filter, and the months default/max. It does not clarify the distinction between code_postal and code_departement or behavior when multiple filters are combined, so it falls short of full compensation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Monthly transaction volume time series') and immediately distinguishes itself from the closest sibling by naming score_market_health and the question each answers. An agent can pick between them without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use vs when-not-to-use, with concrete trigger questions ('show me how volume has evolved' / 'is there seasonality?' vs 'is this market good or bad?'), plus the alternative tool named for the other case. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analyze_market_statisticsAnalyze Market StatisticsARead-onlyInspect
Get market statistics: avg/median prices, price per m², surface areas.
REQUIRED: You MUST provide at least one location filter:
code_postal (e.g., "75011")
commune (e.g., "PARIS 11" - uppercase; Paris uses "PARIS 01"–"PARIS 20")
code_departement (e.g., "75")
latitude + longitude for radius search
Examples:
Paris 11e market: {commune: "PARIS 11", type_local: "Appartement"}
500m radius: {latitude: 48.8566, longitude: 2.3522, radius_m: 500}
Department stats: {code_departement: "69", type_local: "Maison"}
Returns: count, price (min/max/avg/median), surface stats, price_per_m2
Note: radius_m > 1000m is automatically restricted to the last 12 months of data.
Cost: 5 credits per call
| Name | Required | Description | Default |
|---|---|---|---|
| commune | No | City/commune name (e.g., 'Paris', 'Lyon') | |
| date_fin | No | End date (YYYY-MM-DD) | |
| latitude | No | Latitude for radius search (requires longitude) | |
| radius_m | No | Radius in meters for location search (default: 500) | |
| longitude | No | Longitude for radius search (requires latitude) | |
| date_debut | No | Start date (YYYY-MM-DD) | |
| type_local | No | Property type | |
| code_postal | No | Postal code (e.g., '75001') | |
| exclude_vefa | No | Exclude VEFA (new-build, vente en l'état futur d'achèvement) sales (default: true — keeps 'ancien' results from double-counting new-build activity) | |
| include_terrain | No | Include terrain-only transactions in search results (default: false) | |
| code_departement | No | Department code (e.g., '73' for Savoie, '83' for Var) | |
| use_original_type | No | Use original type_local instead of smart computed_type_local (default: false) | |
| exclude_bulk_sales | No | Exclude bulk sales and aggregated transactions (default: true for clean market data) | |
| include_pouvoir_achat | No | Add a price-to-income ratio field (INSEE Filosofi × DVF). Ignored on radius searches. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes beyond the readOnlyHint/openWorldHint annotations by disclosing a real behavioral constraint (radius_m > 1000m is silently restricted to the last 12 months) and a cost of 5 credits per call. It also lists the return fields, though it doesn't say how results are ordered or capped.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose, then uses labeled sections (REQUIRED, Examples, Returns, Note, Cost) that are easy to scan. Three examples are arguably one more than needed, but each illustrates a distinct filter mode, so little is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter tool with no output schema, the description supplies the missing pieces: the required-filter rule, the returned metric set, the radius time-window caveat, and the per-call cost. An agent can invoke this correctly without opening the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuine semantics: the OR-relationship among location filters, the latitude+longitude pairing, the uppercase 'PARIS 11' convention for commune, and the 500m default radius. It adds real value over the schema descriptions without restating them.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource plus the exact output metrics (avg/median prices, price per m², surface areas), which lets an agent distinguish it from sibling analytics tools like analyze_price_trends or get_market_overview. It stops short of explicitly naming which sibling to use instead for trend or overview questions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states a hard precondition ('You MUST provide at least one location filter') and enumerates the four acceptable filter forms, then gives worked examples for each. It does not state when to prefer a sibling tool (e.g. compare_locations or estimate_property_value), so no exclusions are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analyze_price_trendsAnalyze Price TrendsARead-onlyInspect
Analyze price evolution over time - essential for market timing and investment decisions.
REQUIRED: At least one location filter:
code_postal, commune (e.g., "PARIS 11"), code_departement, or latitude+longitude
Optional:
type_local: "Maison", "Appartement", "Terrain", "Local commercial"
granularity: "month", "quarter" (default), or "year"
date_debut/date_fin: Date range (default: last 5 years)
Returns:
Time series with median/avg prices per period
Year-over-year changes (%)
Overall trend: "increasing", "decreasing", or "stable"
Total change over the period
Example: Paris 11e apartment price trends: {commune: "PARIS 11", type_local: "Appartement", granularity: "quarter"}
Note: DVF data covers 2014–2025 (annual cadence). Use date windows ≥ 12 months for reliable results.
Cost: 10 credits per call
| Name | Required | Description | Default |
|---|---|---|---|
| commune | No | City/commune name (e.g., 'PARIS') | |
| date_fin | No | End date YYYY-MM-DD (default: today) | |
| latitude | No | Latitude for radius search | |
| radius_m | No | Radius in meters | |
| longitude | No | Longitude for radius search | |
| date_debut | No | Start date YYYY-MM-DD (default: 5 years ago) | |
| type_local | No | Property type | |
| code_postal | No | Postal code (e.g., '75001') | |
| granularity | No | Time granularity (default: quarter) | quarter |
| exclude_vefa | No | ||
| code_departement | No | Department code (e.g., '75') | |
| exclude_bulk_sales | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, and the description adds meaningful context beyond them: the credit cost (10 credits/call), the underlying data coverage (DVF 2014–2025, annual cadence), and default date behavior. It stops short of describing pagination or output format limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then cleanly sectioned into REQUIRED / Optional / Returns / Example / Note / Cost. Every block is useful, though the Returns list is somewhat long and could be tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 12 parameters and no output schema, the description carries a lot of burden and handles it: it documents return structure, defaults, data-coverage limitations, and cost. A few parameters (radius_m, exclude_vefa, exclude_bulk_sales) are left entirely to the schema, but overall it is nearly complete for a tool of this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 83%, so the baseline is 3, but the description adds real value: it encodes the cross-parameter constraint ('at least one location filter') that the schema cannot express since required=0, explains defaults for granularity and date range, and gives a concrete example payload. This goes beyond the per-field schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Analyze price evolution over time,' which clearly separates it from siblings like get_zonal_price_distribution (static distribution) or analyze_market_statistics (aggregate stats). It does not explicitly name the sibling tools it competes with, so it falls short of the 5 benchmark for sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear usage context ('essential for market timing and investment decisions'), the mandatory location-filter constraint, and a reliability caveat (use windows ≥ 12 months). It never names alternative tools to use instead, so no explicit exclusions are present, but the when-to-use context is well covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analyze_purchasing_powerAnalyze Purchasing PowerARead-onlyInspect
Price-to-income ratio: how many years of median income to buy the median property here. Crosses DVF price/surface medians with INSEE Filosofi commune-level median income.
REQUIRED: You MUST provide one of:
code_postal (e.g., "75011")
commune (e.g., "LYON", "PARIS 11" - uppercase)
code_commune: explicit 5-digit INSEE code (e.g., "75111")
NOT SUPPORTED: code_departement alone, or latitude+longitude — a department spans hundreds of communes with no single meaningful income figure, and radius circles cross commune boundaries. Use analyze_market_statistics or find_property_comparables for those scopes instead.
Returns: ratio_prix_revenu (years of income), prix_bien_median, revenu_median_annuel_uc, annee_reference. ratio_prix_revenu is null when INSEE suppresses the commune's income figure (small population).
Cost: 5 credits per call
| Name | Required | Description | Default |
|---|---|---|---|
| commune | No | Commune name in uppercase (e.g., 'LYON', 'PARIS 15') | |
| date_fin | No | End date (YYYY-MM-DD) | |
| date_debut | No | Start date (YYYY-MM-DD) — subject to an auto-applied cap on large scopes | |
| type_local | No | Property type filter (default: all) | |
| code_postal | No | Postal code (e.g., '75011') | |
| code_commune | No | 5-digit INSEE commune code — bypasses commune resolution (e.g., '75111') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds genuinely useful behavior beyond that: the null return when INSEE suppresses a commune's income figure, the 5-credit cost, and the exact data sources. It does not cover auth or pagination, but for a read-only analytics call this is substantially richer than the annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is front-loaded with the metric in the first sentence, then blocks for required inputs, unsupported scopes, return values, and cost. Each section is short and earns its place; no filler or repetition of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly enumerates the returned fields (ratio_prix_revenu, prix_bien_median, revenu_median_annuel_uc, annee_reference) and explains the null case. Together with the locator constraints and cost disclosure, an agent has everything needed to call and interpret this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds a cross-parameter constraint the schema does not encode — 'You MUST provide one of' three locators — despite zero parameters being marked required. It also clarifies that code_commune bypasses commune resolution and rejects lat/lon and departement scopes, which the schema does not express.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific metric — 'how many years of median income to buy the median property here' — and names the exact data sources (DVF price/surface medians crossed with INSEE Filosofi median income). It also distinguishes itself from analyze_market_statistics and find_property_comparables by naming them as the right tools for the unsupported scopes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use conditions (one of code_postal, commune, code_commune), explicit when-not conditions (code_departement alone, latitude+longitude), and justifies the exclusions with reasoning about commune boundaries and income aggregation. Alternatives are named for the excluded scopes, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analyze_rental_yieldAnalyze Rental YieldARead-onlyInspect
Estimate gross rental yield for one French commune using ANIL asking-rent indicators and clean DVF sale prices.
REQUIRED:
code_insee: French 5-character INSEE commune code (e.g., "33063" for Bordeaux; Corsica codes such as "2A004" are supported)
OPTIONAL:
type_local: "Appartement" (default) or "Maison"
appartement_profile: "all" (default), "t1_t2", or "t3_plus" — apartments only
Returns the latest available 24-month DVF sale window, median sale price/m², ANIL's charges-included rent/m², estimated gross yield, confidence interval, and data-quality flags.
Important: this is a commune-level estimate, not a property valuation. It excludes taxes, financing, vacancy, maintenance, and management costs. ANIL rents are unfurnished advertised rents including charges.
Cost: 10 credits per call
| Name | Required | Description | Default |
|---|---|---|---|
| code_insee | Yes | INSEE commune code (e.g., '33063' for Bordeaux or '2A004' in Corsica) | |
| type_local | No | Property type (default: Appartement) | Appartement |
| appartement_profile | No | Apartment profile: all (default), t1_t2, or t3_plus. Only applies to Appartement. | all |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide readOnlyHint=true and openWorldHint=false, but the description adds crucial context beyond this: it specifies the return contents, the 24-month DVF window, the cost of 10 credits per call, and important methodological caveats (excludes certain costs, rent type). This goes well beyond the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with required/optional sections, clear bullet points, and a short cost note. However, the description is somewhat verbose and could be slightly more front-loaded with the core purpose before diving into details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of an output schema, the description compensates by detailing the return values (latest 24-month DVF window, median sale price/m², ANIL rent/m², estimated gross yield, confidence interval, data-quality flags). It also covers scope limitations and cost. Complete for an agent to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents parameters. The description adds value by explaining the INSEE code format and examples, clarifying that appartement_profile applies only to apartments, and specifying defaults and enum meanings.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Estimate) and resource (gross rental yield) with explicit data sources (ANIL asking-rent indicators, DVF sale prices). Clearly distinguishable from siblings like estimate_property_value or analyze_market_statistics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly frames the scope as commune-level and lists what it excludes (taxes, financing, vacancy, maintenance, management), guiding the agent away from misuse. However, it does not explicitly name alternative sibling tools that might be more appropriate for property-specific valuation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_locationsCompare LocationsARead-onlyInspect
Compare 2-5 neighborhoods side-by-side - perfect for investment location decisions.
REQUIRED:
locations: Array of 2-5 objects with {code_postal} or {commune}
Optional:
type_local: "Maison" or "Appartement" (default: Appartement)
date_debut: Start date (default: 1 year ago)
Returns per location:
Transaction count, median price/m², median price
Year-over-year price change
Rankings (cheapest, most expensive, highest volume, fastest growing)
Example: Compare Paris arrondissements by postal code: {locations: [{code_postal: "75011"}, {code_postal: "75020"}, {code_postal: "75019"}]}
Example: Compare cities by commune: {locations: [{commune: "LYON"}, {commune: "BORDEAUX"}, {commune: "NANTES"}]}
Note: DVF data covers 2014–2025 (annual cadence). Use date windows ≥ 12 months for reliable results.
Cost: 10 credits per call
| Name | Required | Description | Default |
|---|---|---|---|
| locations | Yes | 2-5 locations to compare | |
| date_debut | No | Start date (default: 1 year ago) | |
| type_local | No | Property type (default: Appartement) | Appartement |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the readOnly/openWorld annotations: cost (10 credits per call), DVF data coverage window (2014–2025, annual cadence), and a reliability caveat (use ≥12 month windows). These are exactly the operational facts an agent needs before committing a paid call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose, then uses labeled sections (REQUIRED / Optional / Returns / Example / Note / Cost) so an agent can scan quickly. Two examples and the Returns block are slightly redundant but each carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by enumerating the per-location return fields (transaction count, median price/m², YoY change, rankings). Combined with the cost, data-range, and default notes, nothing needed to call or interpret the tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3; the description goes further by clarifying that each location object takes either {code_postal} or {commune}, restating the defaults, and showing two worked invocation examples that illustrate the alternative shapes.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (compare), resource (2-5 neighborhoods/locations), and scope (side-by-side, 2-5) in the first line. The 'investment location decisions' framing distinguishes it from single-location siblings like analyze_market_statistics or estimate_property_value.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear use case ('perfect for investment location decisions') and concrete invocation examples for both code_postal and commune forms. It does not, however, name alternatives or state when not to use it versus e.g. find_property_comparables.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_market_alertCreate Market AlertAInspect
Create a webhook alert for new DVF transactions matching your criteria. Requires Pro or Enterprise plan. Max 20 active alerts per API key.
REQUIRED: webhook_url + at least one location filter (code_postal, commune, or code_departement)
Optional: type_local, prix_min, prix_max, surface_min, surface_max
When a matching transaction is added to DVF, a POST request is sent to your webhook_url with the transaction details.
Cost: 0 credits (Pro/Enterprise plan required)
| Name | Required | Description | Default |
|---|---|---|---|
| commune | No | Commune filter in uppercase (e.g., 'PARIS 11'). | |
| prix_max | No | Maximum price in euros. | |
| prix_min | No | Minimum price in euros. | |
| type_local | No | Property type filter. | |
| code_postal | No | Postal code filter. At least one location filter required. | |
| surface_max | No | Maximum surface in m². | |
| surface_min | No | Minimum surface in m². | |
| webhook_url | Yes | HTTPS URL that will receive POST notifications | |
| code_departement | No | Department code filter. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare write/non-idempotent/non-destructive; the description adds substantial behavioral context beyond that — the plan entitlement gate, a hard rate limit (20 active alerts per key), the asynchronous side effect (a POST to webhook_url when a matching transaction appears), and the credit cost. This is exactly what the description is for.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Information is front-loaded (purpose, then requirements, then inputs, then behavior, then cost) and every line earns its place. Required vs optional grouping makes the constraints scannable with no redundant prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a write tool with no output schema, the description covers the entitlement, quota, required inputs, the webhook delivery behavior, and cost. An agent has everything needed to decide whether and how to call it; the lack of an output schema is adequately compensated by the stated side effect.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds the cross-field rule that at least one location filter (code_postal, commune, code_departement) is required — a conditional constraint the schema only encodes piecemeal — and separates required from optional params.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb (create) plus resource (webhook alert) and the trigger condition ('new DVF transactions matching your criteria'). The name and description cleanly separate it from list_market_alerts, update_market_alert, and delete_market_alert without needing the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives real context for using this tool: Pro/Enterprise plan required, max 20 active alerts, and the required inputs. However, it never routes the agent to alternatives (e.g. use update_market_alert to modify an existing alert, list_market_alerts to view current ones), so the sibling comparison is left implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_market_alertDelete Market AlertADestructiveIdempotentInspect
Permanently delete a webhook alert. Requires Pro or Enterprise plan.
REQUIRED: id (alert ID)
Returns: { deleted: true } on success.
Cost: 0 credits (Pro/Enterprise plan required)
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Alert ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true and readOnlyHint=false, so the safety profile is covered; the description still adds value by stressing 'Permanently' (irreversibility), naming the plan requirement, and disclosing the exact return payload. It does not, however, cover any rate limits or downstream effects on webhook deliveries.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded, with required-param, return, and cost lines that are easy to scan. It is slightly redundant, repeating the Pro/Enterprise requirement twice and listing 'Cost: 0 credits' for a plan-gated delete, but nothing is truly wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter destructive tool this covers the essentials: scope, plan prerequisite, exact return value, and cost. With no output schema the description fills the return-value gap, though it omits what happens to already-fired webhooks or error behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With a single parameter and 100% schema description coverage, the schema already fully documents 'id'. The description only restates the requirement ('REQUIRED: id (alert ID)') without adding format, source, or constraint detail beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource ('Permanently delete a webhook alert'), and the notion of 'webhook alert' plus the 'delete' verb clearly separates it from create_market_alert, update_market_alert, and list_market_alerts. An agent can place it among its siblings without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states a gating prerequisite ('Requires Pro or Enterprise plan'), which is useful usage context, but it gives no explicit when-to-use vs when-not guidance and does not point to update_market_alert as the non-destructive alternative. Usage is implied by the verb rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_portfolio_propertyDelete Portfolio PropertyADestructiveIdempotentInspect
Permanently delete a property from your portfolio.
REQUIRED: id (property ID)
Returns: { deleted: true } on success.
Cost: 0 credits
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Property ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so the safety profile is covered. The description adds value beyond them by spelling out the permanence of the effect, the success return shape ('{ deleted: true }') despite no output schema, and zero credit cost.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short lines, front-loaded with the action and the permanence warning, then required param, return, and cost. No sentence is wasted and nothing important is buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter destructive tool with annotations covering the safety profile, the description supplies everything needed: the permanent nature of the deletion, the required input, the success response shape, and the cost. Nothing required to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter with 100% schema description coverage, so the schema already documents 'id' fully. The description's 'REQUIRED: id (property ID)' merely restates it without adding format, source, or lookup guidance, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Permanently delete a property from your portfolio') with the scope 'from your portfolio', which cleanly separates it from sibling delete_market_alert and from the non-destructive update_portfolio_property. An agent can select it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The adverb 'Permanently' implicitly warns the agent that this is not a reversible operation, which is useful context for when to choose it, but no alternative (e.g., update_portfolio_property for archiving) or precondition is named. Usage is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
detect_flipsDetect Property FlipsARead-onlyInspect
Detects short-hold resales ("flips") in one French commune.
REQUIRED:
code_insee: 5-digit INSEE commune code (e.g., "33063" for Bordeaux) code_commune is accepted as a compatibility alias.
OPTIONAL:
type_local: "Maison" (default). "Appartement" returns available: false and is not charged: DVF parcel/address matching can't tell flats in the same building apart, so apartment flips aren't published until matching on the copropriete lot is available.
A flip is a clean DVF sale followed by a resale of the same house 18 to 24 months later. Matching uses cadastral section + plan first, then a conservative normalized-address + surface fallback.
Returns aggregate-only indicators: flip rate, median gross margin, median margin percentage, median holding period, and matching-method counts. It never returns transaction addresses or owners. The 24-month window is anchored to the latest DVF mutation available in the requested commune.
Cost: 10 credits per call
| Name | Required | Description | Default |
|---|---|---|---|
| code_insee | No | 5-digit INSEE commune code (e.g., '33063' for Bordeaux) | |
| type_local | No | Property type. Houses are analyzed; "Appartement" returns available: false (apartment flips can't be matched reliably yet). Default: houses. | |
| code_commune | No | Legacy 5-digit INSEE-code alias for code_insee (not DVF's raw commune fragment) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only supply readOnlyHint and openWorldHint; the description adds substantial behavioral context on top: a 10-credit cost, a no-charge path for unsupported input, aggregate-only output that never exposes addresses or owners, the matching methodology (cadastral section + plan, then normalized-address fallback), and the anchoring of the 24-month window to the latest available DVF mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The structure is front-loaded and scannable (purpose, REQUIRED, OPTIONAL, definition, returns, cost), and nearly every sentence carries load-bearing information. It runs slightly long with the matching-method detail, but that detail is defensible for a statistical tool with methodology caveats.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by enumerating the returned aggregate indicators (flip rate, median gross margin, median margin percentage, median holding period, matching-method counts) and explicitly stating what is never returned. Combined with cost and the apartment edge case, an agent has everything needed to call and interpret this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuine meaning beyond the schema: the rationale for why apartments are unavailable ('DVF parcel/address matching can't tell flats in the same building apart') and confirmation that code_commune is a compatibility alias rather than a DVF raw commune fragment. It also clarifies the default (Maison) more explicitly than the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names a specific verb ('Detects') and a specific, non-obvious resource ('short-hold resales ("flips") in one French commune'), and the body defines exactly what counts as a flip. No sibling tool (search_property_transactions, analyze_price_trends, etc.) covers flip detection, so the agent can route here unambiguously.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a partial when-not case by explaining that type_local="Appartement" returns available:false and is not charged, which usefully steers the agent away from a wasted call. However, it never names alternative tools or states when an agent should prefer raw transaction search or market analysis over this aggregate detector, so usage is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
estimate_property_valueEstimate Property ValueARead-onlyInspect
Get an automated valuation (AVM) for a property — low / mid / high price range.
Use find_property_comparables instead if you want the raw comparable transactions with similarity scores. estimate_property_value returns only the AVM summary (low/mid/high range).
REQUIRED: latitude, longitude, surface
Optional:
type_local: "Maison" or "Appartement" (default: Appartement)
pieces: Number of rooms
code_postal, commune: Optional administrative fallback when GPS comparables are sparse
radius_m: Search radius (100–2000m, default: 500)
max_age_months: Max transaction age (1–24, default: 18)
Returns:
price_range: { low, mid, high } in euros
price_per_m2: { median, used_surface }
confidence: "high", "medium" or "low". It reflects comparable count and average similarity; it is not a calibrated probability of accuracy.
based_on_count: number of comparables used
interval: { method, coverage_label, basis, cohort, cohort_eligible_n, ratio_low, ratio_high, contract_version, calibration_generated_at } — how price_range was derived.
confidence_factors: { comparable_count, average_similarity, fallback_used, positive_factors[], limiting_factors[] } — traceable inputs to confidence.
Returns estimate: null with a message if fewer than 3 comparables are found. Tip: increase radius_m or max_age_months to get more data.
Note: the low/high range is a data-calibrated 50% interquartile interval (P25/P75 of observed-price / published-mid, backtest-measured on 2,000 masked DVF sales), not a fixed percentage. Its width is driven first by how much the retained comparables agree on price/m² — the dispersion cohort, (P75-P25) / median, e.g. interval.cohort = "dispersion=<15%" — then by comparable density, property type and surface band, and it widens to the global cohort when a segment lacks enough measured data (interval.basis). Agreeing or contradicting comparables also surface as confidence_factors comparables_agree / comparables_disagree. The mid value is unaffected by any of this. DVF data covers 2014–2025 (annual cadence). Use max_age_months ≥ 12 for reliable results.
Cost: 10 credits per call
| Name | Required | Description | Default |
|---|---|---|---|
| pieces | No | Number of rooms (±1 tolerance applied to comparables) | |
| commune | No | Commune fallback when GPS comparables are sparse | |
| surface | Yes | Surface area in m² | |
| latitude | Yes | GPS latitude of the target property | |
| radius_m | No | Search radius in meters (default: 500) | |
| longitude | Yes | GPS longitude of the target property | |
| type_local | No | Property type (default: Appartement) | |
| code_postal | No | Postal code fallback when GPS comparables are sparse | |
| max_age_months | No | Max age of comparable transactions in months (default: 18 — DVF updates semi-annually) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Far exceeds the annotations (readOnlyHint/openWorldHint). It discloses the cost (10 credits), the null-return threshold (<3 comparables), the confidence semantics ('not a calibrated probability'), the interval methodology (backtest on 2,000 masked DVF sales, P25/P75, cohort-based width), and DVF coverage 2014–2025. Nothing here contradicts annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded well (purpose first, then routing, then required params). However, the interval/cohort methodology paragraph is dense and lengthy, and largely restates what the return object would convey. It earns partial credit but is more verbose than an agent needs to choose and call the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only AVM tool with no output schema, the description covers inputs, outputs, failure mode, cost, and confidence caveats thoroughly. Left slightly incomplete on error semantics beyond the <3 comparables case and any rate-limit/permission context, but overall strongly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so baseline is 3. The description adds meaning beyond the schema: which params are REQUIRED, defaults (Appartement, 500m, 18mo), the fallback purpose of code_postal/commune, and the '±1 tolerance' context for pieces. It does not add syntax beyond the schema but does add decision-relevant context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get an automated valuation (AVM) for a property') and immediately distinguishes itself from the closest sibling, find_property_comparables, by contrasting outputs (AVM summary vs raw comparable transactions). An agent can route correctly without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the alternative tool and the condition that selects it (raw comparables with similarity scores). It also gives a recovery tip ('increase radius_m or max_age_months') and a data-recency condition ('use max_age_months ≥ 12'). It lacks a clear 'do not use when' for the many other analysis siblings, so it falls just short of 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_property_comparablesFind Property ComparablesARead-onlyInspect
Find comparable properties for valuation - the #1 tool for real estate agents.
REQUIRED parameters:
latitude, longitude: Target property coordinates
type_local: "Maison" or "Appartement"
surface_min, surface_max: Surface range in m² (typically ±20% of target)
Optional:
pieces: Number of rooms (±1 tolerance applied)
code_postal, commune: Optional administrative fallback when GPS comparables are sparse
radius_m: Search radius (default: 500m, max: 2000m)
max_age_months: Transaction age limit (default: 18, same as estimate_property_value; max: 36) When fewer than 3 comps match, the search first extends to 36 months at the same radius, then to 2 km.
limit: Max comparables (default: 10, max: 20)
Returns:
Comparable properties with similarity scores (0-1)
Distance from target, age of transaction
Adjustment suggestions (e.g., "+2% for 10m² larger")
Valuation estimate with confidence level, plus a data-calibrated 50% interval (interval.*) and traceable confidence_factors — see estimate_property_value's description for the full field reference
Example: Find comps for a 75m² apartment near Tour Eiffel: {latitude: 48.858, longitude: 2.294, type_local: "Appartement", surface_min: 60, surface_max: 90}
Cost: 10 credits per call
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum comparables to return (default: 10, max: 20) | |
| pieces | No | Number of rooms (optional, ±1 tolerance used) | |
| commune | No | Commune fallback when GPS comparables are sparse | |
| latitude | Yes | Latitude of the target property (required) | |
| radius_m | No | Search radius in meters (default: 500, max: 2000) | |
| longitude | Yes | Longitude of the target property (required) | |
| type_local | Yes | Property type (required for matching) | |
| code_postal | No | Postal code fallback when GPS comparables are sparse | |
| surface_max | Yes | Maximum surface in m² (typically target surface + 20%) | |
| surface_min | Yes | Minimum surface in m² (typically target surface - 20%) | |
| max_age_months | No | Maximum transaction age in months (default: 18, max: 36) | |
| exclude_bulk_sales | No | Exclude bulk sales (default: true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/openWorld annotations, the description discloses the sparse-result fallback (extend to 36 months, then 2 km), the ±1 pieces tolerance, the ±20% surface convention, the cost (10 credits per call), and the exact return payload. These are meaningful behavioral traits an agent cannot derive from annotations or schema alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded purpose followed by clear Required/Optional/Returns/Example sections makes it scannable for a 12-parameter tool. It is somewhat long and there is mild duplication with the schema (defaults, radius, limit) plus the throwaway '#1 tool' line, but the structure earns its length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly documents the return shape (similarity scores, distance/age, adjustment suggestions, estimate with confidence interval) and gives a concrete worked example. For a complex, high-parameter tool, nothing critical is left to guesswork.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3, but the description adds real semantic context: 'typically ±20% of target' framing for the surface bounds, the ±1 room tolerance, and the note that max_age_months matches estimate_property_value's default and drives the widening logic. A few items (radius default, limit cap) merely echo the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Find comparable properties for valuation'), which an agent can clearly separate from sibling tools like estimate_property_value or search_property_transactions. It does not explicitly contrast its role against those siblings, and the '#1 tool for real estate agents' tagline is marketing fluff, but the core purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description lays out required vs optional inputs and operational fallback behavior, so usage is implied. However, it never says when to reach for this tool over estimate_property_value (which is only referenced for a shared field definition) or when a plain property search suffices, leaving the when-to-use decision to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_building_characteristicsGet Building Characteristics (BDNB)ARead-onlyInspect
Get physical building characteristics for a DVF transaction from the BDNB national building database.
Returns: construction year, number of units, number of floors, wall material, roof material, primary usage, and median price/m² from BDNB's pre-2022 DVF aggregate stats.
REQUIRED: transaction_id (DVF transaction ID — get this from the "id" field in search_property_transactions results)
Match method: spatial proximity (nearest BDNB building within 200m). Returns null + refunds credits if no building found within 200m.
Workflow: call search_property_transactions first → use an "id" from the results as transaction_id here.
Example: transaction_id: "12345678" → { building: { annee_construction: 1967, nb_logements: 48, mat_mur: "beton", ... } }
Cost: 2 credits
| Name | Required | Description | Default |
|---|---|---|---|
| transaction_id | Yes | DVF transaction ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint/openWorldHint annotations, it discloses the match method (nearest BDNB building within 200m), the failure mode ('returns null + refunds credits if no building found within 200m'), and the exact cost (2 credits). This is exactly the behavioral context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then labeled sections (Returns, REQUIRED, Match method, Workflow, Example, Cost). The example and cost lines are compact and each sentence carries distinct information with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by enumerating the returned fields and showing a sample response shape, and it documents the null/refund edge case. An agent has everything needed to call and interpret the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: it names the upstream source of transaction_id and shows the expected string shape via an example call. That goes beyond the schema's bare 'DVF transaction ID' label.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Get physical building characteristics') and names the exact source database (BDNB) and the triggering entity (a DVF transaction). The listed return fields make it immediately distinguishable from siblings like score_renovation_potential or analyze_building_stock.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit workflow instruction: 'call search_property_transactions first → use an "id" from the results as transaction_id here.' It also tells the agent exactly where to source the required parameter, leaving no inference needed about ordering or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_market_overviewGet Market OverviewARead-onlyInspect
Get a complete market brief for a location in one call — stats + trend + health score.
Bundles three queries in parallel: market statistics (prices, volume), annual price trend (1-year change %), and health score (0–100).
Use this as the first tool for any "how is the market in X?" question. It replaces calling analyze_market_statistics + analyze_price_trends + score_market_health separately (saves 15–25 credits).
REQUIRED: At least one location filter:
code_postal (e.g., "75011")
commune (e.g., "PARIS 11" — uppercase; Paris uses "PARIS 01"–"PARIS 20")
code_departement (e.g., "69")
latitude + longitude for radius search
Optional:
type_local: "Maison", "Appartement", "Terrain", "Local commercial"
radius_m: search radius in meters (default: 500)
Returns:
stats: count, median/avg price, price/m², median surface
trend: direction (increasing/stable/decreasing), 1-year change %, overall change %
health: score (0–100), label (Calme/Modéré/Dynamique/Très actif), data quality Note: health score requires code_postal/commune/code_departement (not available for lat+lon only searches)
Score interpretation: 0–30 Calme · 31–60 Modéré · 61–80 Dynamique · 81–100 Très actif
Cost: 10 credits per call
| Name | Required | Description | Default |
|---|---|---|---|
| commune | No | Nom de commune en MAJUSCULES (ex. 'PARIS 11', 'LYON') | |
| latitude | No | Latitude GPS (nécessite longitude) | |
| radius_m | No | Rayon en mètres (défaut : 500) | |
| longitude | No | Longitude GPS (nécessite latitude) | |
| type_local | No | Type de bien | |
| code_postal | No | Code postal (ex. '75011') | |
| code_departement | No | Code département (ex. '75', '69') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint, so the description carries the rest and delivers: per-call cost (10 credits), the credit savings vs. alternatives, and a non-obvious behavioral constraint that the health score is unavailable for lat+lon-only searches. It also gives score interpretation bands (0–30 Calme … 81–100 Très actif), which meaningfully describe output behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the one-line purpose, then organized into required/optional/returns sections with clear headers. Slightly long with some restatement (the health requirement appears twice), but every block is scannable and useful given no output schema exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully documents the return shape (stats, trend, health components), the location-filter requirements, the health limitation, cost, and score interpretation. Nothing an agent needs to invoke or interpret the result is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3, but the description adds real semantics beyond the schema: it notes commune must be uppercase with the 'PARIS 01'–'PARIS 20' convention, gives concrete examples per filter, and crucially states that health requires code_postal/commune/code_departement (not lat+lon). That cross-parameter constraint is not derivable from the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb, resource, and scope: 'Get a complete market brief for a location in one call — stats + trend + health score.' It explicitly distinguishes itself from siblings by naming the three tools it consolidates (analyze_market_statistics, analyze_price_trends, score_market_health). An agent can route to it without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('first tool for any "how is the market in X?" question') plus named alternatives it replaces and the cost rationale (saves 15–25 credits). This is the strongest form of routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_portfolio_propertyGet Portfolio PropertyAIdempotentInspect
Get a single portfolio property by ID. If the estimate is older than 30 days and the property is a Maison or Appartement, the estimate is automatically refreshed (10 credits).
REQUIRED: id (property ID from list_portfolio_properties or add_property_to_portfolio)
Returns: property record + estimate_refreshed boolean.
Cost: 0 credits (10 if estimate is refreshed)
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Property ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses a hidden side effect beyond the annotations: the estimate is automatically refreshed (a write, consistent with readOnlyHint=false) when it is older than 30 days and the property is a Maison or Appartement, and specifies the 10-credit cost. This conditional mutation and cost detail would be impossible to infer from the structured fields alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then conditions, required param, return value, and cost in terse blocks. The credit cost is stated twice ('10 credits' and the Cost line), a minor redundancy, but overall efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description specifies the return payload (property record + estimate_refreshed boolean) and covers the refresh conditions and cost, so an agent has everything needed to invoke it correctly without surprises.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the sole parameter is already documented, but the description adds real meaning by stating the id's provenance (from list_portfolio_properties or add_property_to_portfolio) and marking it REQUIRED, which is beyond the bare 'Property ID' schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get a single portfolio property by ID') and the word 'single' implicitly contrasts with the sibling list_portfolio_properties. It does not explicitly name the alternative as a contrast, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description tells the agent where the required id comes from (list_portfolio_properties or add_property_to_portfolio), which is useful sourcing context, but gives no explicit when-to-use vs when-not guidance relative to siblings like list_portfolio_properties or update_portfolio_property.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_real_estate_business_detailsGet Real Estate Business Details (SIRENE)ARead-onlyInspect
Get full details for a French business by SIREN number via the INSEE open API.
Returns the main establishment (siège): legal name, NAF code, address, creation date, and administrative status.
REQUIRED: siren (9-digit SIREN number)
Example: siren: "123456789" → { denomination: "ORPI CENTRE", naf_code: "6831Z", commune: "PARIS", ... }
Note: Requires INSEE_API_TOKEN to be configured on the server.
Cost: 2 credits
| Name | Required | Description | Default |
|---|---|---|---|
| siren | Yes | SIREN number (9 digits) of the legal entity |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover read-only and open-world access, so the description carries extra weight and delivers: it discloses the server-side INSEE_API_TOKEN prerequisite, a 2-credit cost, and the important output-scoping fact that only the main establishment (siège) is returned, not all establishments. It omits error behavior for invalid SIRENs or rate limits, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the one-line purpose, then returned fields, requirement, example, caveat, and cost, each on its own line. The 'REQUIRED: siren (9-digit SIREN number)' line partially duplicates the schema, but the layout is scannable and nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by naming the returned fields (legal name, NAF code, address, creation date, administrative status). Combined with the auth prerequisite, cost, and siège-only scoping, an agent has everything needed to call and interpret this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already states '9 digits', so the baseline is 3. The description goes slightly beyond by restating the requirement and supplying a concrete example value with the expected response shape, which clarifies the expected format and output keys.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (get), resource (real estate business details), and the exact retrieval key (SIREN via INSEE API), plus enumerates the returned fields. It implicitly separates itself from search_real_estate_businesses by requiring an exact identifier, but never names or contrasts that sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: the description says details are fetched by SIREN, so an agent infers this is the follow-up to a lookup that already produced a SIREN. There is no explicit when-to-use statement, no when-not-to-use, and no pointer to search_real_estate_businesses for discovery, even though that sibling exists.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_zonal_price_distributionGet Zonal Price DistributionARead-onlyInspect
Get price statistics aggregated by postal code or commune zones — returns JSON data suitable as input for heatmap visualizations (not a rendered map or image). Hosts with MCP Apps support additionally render this as an interactive bubble map.
REQUIRED: At least one scope filter:
code_departement: Department code (e.g., "75" for Paris)
commune: Major city (e.g., "PARIS" - returns all arrondissements)
Optional:
type_local: "Maison" or "Appartement"
group_by: "code_postal" (default) or "commune"
min_transactions: Minimum transactions to include zone (default: 10)
date_debut/date_fin: Date range (default: last year)
Returns per zone:
Centroid coordinates (lat/lon) for map plotting
Median and average price/m²
Transaction count
Relative position: "expensive", "average", or "affordable"
Use this when you need to: compare price levels across an entire department, find the most/least expensive zones, or provide data to build a price heatmap. Do NOT call this expecting a rendered image — it returns structured JSON data only.
Example: Paris zones by postal code: {commune: "PARIS", type_local: "Appartement"}
Cost: 15 credits per call
| Name | Required | Description | Default |
|---|---|---|---|
| commune | No | Major city name (e.g., 'PARIS' - returns all arrondissements) | |
| date_fin | No | End date (default: today) | |
| group_by | No | Aggregation level (default: code_postal) | code_postal |
| date_debut | No | Start date (default: 1 year ago) | |
| type_local | No | Property type filter | |
| code_departement | No | Department code (e.g., '75') | |
| min_transactions | No | Minimum transactions to include a zone (default: 10) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, and the description adds substantial value beyond that: a 15-credit cost, the fact that it returns structured JSON rather than an image, and the conditional MCP-Apps interactive-map rendering behavior. It also discloses the scope-filter requirement and default date window.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then grouped bullets for required/optional/returns, then when-to-use, then an example. Well structured and mostly tight, though the 'not a rendered map or image' caveat is repeated in two places and could be stated once.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, but the description compensates fully by enumerating the per-zone return fields (centroids, median/avg price/m², transaction count, relative position label), and it covers cost, defaults, and the scope-filter constraint. An agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3, but the description adds real meaning the schema does not encode: the schema lists no required parameters, yet the description states at least one scope filter (code_departement or commune) is REQUIRED, plus the 'returns all arrondissements' behavior for commune. It adds little beyond the schema for group_by/type_local/min_transactions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Starts with a specific verb+resource ('Get price statistics aggregated by postal code or commune zones') and immediately disambiguates from a rendered-map tool. The sibling set contains several analysis tools, and the description's emphasis on zonal aggregation vs. whole-market statistics makes the boundary reasonably clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an explicit 'Use this when you need to' block with three concrete scenarios plus a 'Do NOT call this expecting a rendered image' exclusion. It stops short of naming a specific sibling alternative (e.g., compare_locations or analyze_market_statistics) for the cases where a non-zonal comparison is wanted.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_market_alertsList Market AlertsARead-onlyInspect
List all webhook alerts (active and inactive) for this API key. Requires Pro or Enterprise plan.
Cost: 0 credits (Pro/Enterprise plan required)
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint and openWorldHint already declaring the safety profile, the description adds genuine context beyond annotations: the plan gating (Pro/Enterprise), the zero-credit cost, and the fact that inactive alerts are included. The only gap is return format, which no output schema covers.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short, front-loaded sentences with no filler. The plan requirement is stated twice ('Requires Pro or Enterprise plan' and 'Pro/Enterprise plan required'), a minor redundancy that keeps it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-parameter, no-output-schema list tool, the description covers scope (active and inactive), access constraints (plan tiers), and cost. It does not describe the returned alert fields, a small gap given the absence of an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to document beyond what the (empty) schema already shows. Baseline 4 applies; no parameter detail is needed or omitted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'List all webhook alerts.' The scope qualifier 'active and inactive' and 'for this API key' further narrow it, so an agent can distinguish it from create/update/delete_market_alert without opening a schema. It stops short of naming an alternative, keeping it at 4 rather than 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The plan requirement ('Requires Pro or Enterprise plan') gives a precondition, but the description never states when to prefer this tool over siblings like create_market_alert or update_market_alert. Usage is implied by the list verb rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_portfolio_propertiesList Portfolio PropertiesARead-onlyInspect
List all properties in your portfolio with their cached estimates.
Returns an array of property records ordered by creation date (newest first). Estimates shown are cached — use get_portfolio_property for a specific property to trigger a refresh if stale.
Cost: 0 credits
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only and closed-world profile, but the description adds real value beyond them: the array is ordered by creation date newest-first, estimates are cached rather than live, and the call costs 0 credits. Only the absence of pagination/result-size behavior keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short, front-loaded blocks: what it returns, the ordering detail, then the routing hint and cost. No sentence is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully describes the return shape (array of property records, newest first) and the cache caveat. It stops short of mentioning pagination or list size limits, a minor gap for a list endpoint.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline of 4 applies; there is no parameter syntax or meaning the description could add.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List all properties in your portfolio') plus the scope qualifier 'with their cached estimates', which immediately differentiates it from the single-property sibling get_portfolio_property.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the alternative tool and the condition that selects it: 'use get_portfolio_property for a specific property to trigger a refresh if stale'. An agent can route correctly without inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lookup_property_historyLook Up Property HistoryARead-onlyInspect
Get transaction history for a specific address - essential for due diligence.
REQUIRED: One of these combinations:
address + code_postal: "49 cours Richard Vitton" → sales at that number (one building). Without a number ("cours Richard Vitton") → the 50 most recent sales on the whole street. Full street types (cours, avenue, boulevard…) and bis/ter are understood.
section + no_plan + code_commune: Cadastral parcel lookup
Returns:
Transactions, newest first (max 50), with scope = address | street | parcel
Each transaction includes an id field — pass it to get_building_characteristics for BDNB building data
Price, surface, type, rooms, buyer type for each
price_evolution: only for a repeat sale of the same property (same type, surface within 5%), otherwise null
No sale at the number: the numbers on that street that do have sales
Workflow: lookup_property_history → use transaction id → get_building_characteristics
Example by address: {address: "49 cours Richard Vitton", code_postal: "69003"}
Example by cadastral: {section: "AB", no_plan: "123", code_commune: "101"}
Cost: 20 credits per call, refunded when nothing is found
| Name | Required | Description | Default |
|---|---|---|---|
| address | No | Street address to search | |
| no_plan | No | Cadastral plan number | |
| section | No | Cadastral section | |
| code_postal | No | Postal code (required with address) | |
| code_commune | No | DVF commune code — NOT the full 5-digit INSEE code. Strip the 2-digit department prefix and any leading zeros. Examples: Paris 16e → '116', Paris 1er → '101', Lyon 6e → '386', Nice → '88', Bordeaux → '63'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnlyHint/openWorldHint annotations: discloses cost (20 credits, refunded when nothing found), result cap (max 50, newest first), ordering, the scope field, a chaining id, and precise price_evolution semantics (null unless a repeat sale of a comparable property).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose and the required combinations before returns and workflow, and uses headers/examples that scan well. It is somewhat long with a few overlapping return bullets (scope, id, fields) that could be tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully carries the burden: it enumerates returned fields, ordering, cap, scope values, price_evolution edge cases, and the downstream chaining pattern. Nothing essential to invoke or interpret the call is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so per-parameter docs already exist, but the description adds the critical combination semantics that the schema's zero-required-params leaves ambiguous (address+code_postal vs. section+no_plan+code_commune) plus concrete examples. Some overlap with the schema's code_commune note.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('transaction history for a specific address') and immediately clarifies scope modes (address vs. street vs. cadastral parcel). An agent can tell this is the address/parcel-level transaction lookup rather than the broader sibling search_property_transactions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit required parameter combinations, explains the fallback behavior when no sale exists at a number, and provides a workflow chain to get_building_characteristics. It does not name sibling tools like search_property_transactions to explicitly route between alternatives, which is the only gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolve_locationResolve LocationARead-onlyInspect
Resolve free-form French administrative locations to the canonical Normi filters.
Use this before another Normi tool when the location is informal, accented, abbreviated, or ambiguous. It accepts postal codes, communes and arrondissements such as "Paris 11e", "75011", "Saint-Étienne" or "st etienne".
It returns ranked canonical commune, postal-code, department and INSEE filters. "Paris" intentionally returns all 20 arrondissements rather than silently choosing one.
Cost: 1 credit per call
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Free-form administrative location, e.g. 'Paris 11e', '75011', 'Saint-Étienne', or 'st etienne'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnlyHint/openWorldHint annotations by disclosing the cost ('1 credit per call'), the ranked nature of results, and the deliberate no-silent-disambiguation behavior ('Paris' returns all 20 arrondissements). These are exactly the traits an agent needs before invoking it in a chain.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose, then usage, then behavior and cost in three tight paragraphs. The example strings are repeated from the parameter schema, a minor redundancy, but nothing else is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of describing returns and does so ('ranked canonical commune, postal-code, department and INSEE filters'). Combined with cost and disambiguation behavior, an agent has everything needed to call and chain it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter is fully documented, so the baseline is 3. The description adds meaning by enumerating accepted input forms (postal codes, communes, arrondissements) and accented/abbreviated variants like 'st etienne', which the enum-less schema cannot express.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (resolve), a precise input domain (free-form French administrative locations) and the output (canonical Normi filters). It is clearly distinguishable from all siblings, which are analysis/market tools rather than a geocoding normalizer.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to 'use this before another Normi tool when the location is informal, accented, abbreviated, or ambiguous', giving both the trigger condition and its role as a prerequisite step. No alternative tool competes for this job, so no exclusions are needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
score_market_healthScore Market HealthARead-onlyInspect
Instant 0–100 composite score for comparing markets or making go/no-go decisions.
WHEN TO USE THIS vs analyze_market_activity:
Use score_market_health when you need a single comparable number ("rank these markets", "is this worth investing in?")
Use analyze_market_activity when you need volume trends over time or seasonal patterns
REQUIRED: At least one of code_postal, commune, or code_departement. Note: latitude+longitude is NOT supported — use code_postal, commune, or code_departement only.
Optional:
type_local: "Maison", "Appartement", "Terrain", "Local commercial"
Score interpretation:
0–30: Low activity — weak volume, stagnant/declining prices
31–60: Moderate — decent activity, neutral trends
61–80: Active — good volume, slight price increase
81–100: Very dynamic — strong demand, fast-rising prices
Returns: score (0–100), label, components (volume, price_trend, dispersion), data_quality. Returns score: null if fewer than 10 transactions in the last 6 months.
Cost: 10 credits per call
| Name | Required | Description | Default |
|---|---|---|---|
| commune | No | Commune in uppercase (e.g., 'PARIS 11', 'LYON', 'BORDEAUX'). | |
| type_local | No | Filter by property type. | |
| code_postal | No | Postal code (e.g., '75011'). At least one location filter required. | |
| code_departement | No | Department code (e.g., '75', '69'). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, and the description layers on genuinely useful behavioral facts: the 10-credit cost, the null-return edge case when fewer than 10 transactions exist in 6 months, and the score-band interpretation. Cost and failure-mode disclosure are exactly the context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded one-line purpose, then clearly sectioned WHEN TO USE / REQUIRED / Optional / interpretation / Returns / Cost. Dense but every block carries distinct decision-relevant information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description compensates by naming the return fields (score, label, components, data_quality) and the null case. Combined with the location requirement and cost, an agent has everything needed to call and interpret the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3; the description earns above it by restating the at-least-one-location constraint (only partly present in the schema, on code_postal alone) and by explicitly excluding latitude+longitude, which the schema does not mention at all.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Instant 0–100 composite score for comparing markets') and immediately distinguishes itself from the sibling analyze_market_activity. An agent can identify the tool's output form (a single comparable number) without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the alternative (analyze_market_activity) and the deciding conditions: use this for a single comparable number/rank/go-no-go, use the sibling for volume trends over time or seasonality. This is textbook when/when-not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
score_renovation_potentialScore Renovation Potential (BDNB)ARead-onlyInspect
Identify renovation opportunities: pre-1975 buildings priced below the area median.
Returns a score 0-100 (higher = more potential: bigger discount + older stock), the count of such properties, median price/m² for old buildings vs. area median, average construction year, and dominant wall material.
REQUIRED: at least one location — code_postal, commune, or code_departement OPTIONAL: type_local (Maison|Appartement)
Example output: { score: 72, nb_opportunites: 145, decote_vs_zone_pct: 18, annee_construction_moy: 1958, materiaux_murs_principal: "brique" } → Old buildings trade 18% below market; renovation potential score 72/100
Note: Score is null if fewer than 10 pre-1975 transactions found (statistically unreliable).
Cost: 10 credits
| Name | Required | Description | Default |
|---|---|---|---|
| commune | No | Commune name (e.g., 'LYON') | |
| type_local | No | Property type filter: Maison or Appartement (default: all) | |
| code_postal | No | Postal code (e.g., '69001') | |
| code_departement | No | Department code (e.g., '69') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint=true, openWorldHint=false), and the description adds non-obvious behavior beyond them: the 10-credit cost, the null-on-insufficient-data rule, and what the score actually encodes. Return format is conveyed via an example rather than a schema, so remaining gaps are minor.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose and scoring logic, then required/optional params, then example, caveat, and cost. Every block earns its place, though the example output plus the duplicate 'Note' line adds some length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description supplies an example return object with all fields, their meaning, the score encoding, the insufficient-data edge case, and the cost. An agent has everything needed to invoke and interpret this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description does add one thing the schema cannot show: because required is empty in the schema, its 'REQUIRED: at least one location' and 'OPTIONAL: type_local' labeling supplies the real constraint. That is a modest but genuine addition on top of fully documented parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Identify renovation opportunities') and pins the cohort precisely: 'pre-1975 buildings priced below the area median.' The score range and its drivers (discount + older stock) make it distinguishable from siblings like analyze_building_age_price_impact or detect_flips without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Specifies the location requirement ('at least one of code_postal, commune, or code_departement') and the optional type_local filter, plus the reliability guard (<10 transactions → null). It does not name a competing sibling or state when this is preferred over analysis tools that also look at age/price, so it stops short of explicit routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_property_transactionsSearch Property TransactionsARead-onlyInspect
Search French property transactions (Demandes de Valeurs Foncières).
REQUIRED: You MUST provide at least one location filter:
code_postal (e.g., "75011" for Paris 11e)
commune (e.g., "PARIS 11", "LYON", "MARSEILLE" - uppercase; Paris uses arrondissements: "PARIS 01"–"PARIS 20")
code_departement (e.g., "75" for Paris, "69" for Rhône)
latitude + longitude for radius search (e.g., 48.8566, 2.3522 for Paris center)
address + code_postal for automatic geocoding (e.g., address: "12 rue de Rivoli", code_postal: "75001")
Common examples:
Paris 11e apartments: {commune: "PARIS 11", type_local: "Appartement"}
Near a location: {latitude: 48.8566, longitude: 2.3522, radius_m: 500}
By postal code: {code_postal: "69001", type_local: "Maison"}
By address: {address: "12 rue de Rivoli", code_postal: "75001", radius_m: 300}
Options:
summary_only=true: Get stats + 3 samples (~500 tokens vs ~3500 for full results) — use this for overviews. The stats cover every matching sale, identical to analyze_market_statistics (same date cap), unless prix_*/surface_*/pieces_min filters are set: then summary.basis = "sample" and they describe the returned page only.
limit: 1-100 results (default: 5)
type_local: "Appartement", "Maison", "Terrain", "Local commercial"
Note: radius_m > 1000m is automatically restricted to the last 12 months of data.
Cost: 5 credits per call
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results (default: 5) | |
| offset | No | Offset for pagination | |
| address | No | Street address for automatic geocoding — alternative to explicit lat/lon. Example: '12 rue de Rivoli'. Best used with code_postal for precision. Resolves via api-adresse.data.gouv.fr. | |
| commune | No | City/commune name (e.g., 'Paris', 'Lyon') | |
| date_fin | No | End date (YYYY-MM-DD) | |
| latitude | No | Latitude for radius search (requires longitude) | |
| prix_max | No | Maximum price in EUR | |
| prix_min | No | Minimum price in EUR | |
| radius_m | No | Radius in meters for location search (default: 500) | |
| longitude | No | Longitude for radius search (requires latitude) | |
| date_debut | No | Start date (YYYY-MM-DD) | |
| pieces_min | No | Minimum number of rooms | |
| type_local | No | Property type | |
| code_postal | No | Postal code (e.g., '75001') | |
| deduplicate | No | Group duplicate sales (same date, address, price) into single entries | |
| surface_max | No | Maximum surface area in m² | |
| surface_min | No | Minimum surface area in m² | |
| exclude_vefa | No | Exclude VEFA (new-build, vente en l'état futur d'achèvement) sales (default: true — keeps 'ancien' results from double-counting new-build activity) | |
| summary_only | No | Return only summary statistics with 3 sample transactions instead of full list (reduces context usage) | |
| code_departement | No | Department code (e.g., '73' for Savoie, '83' for Var) | |
| use_original_type | No | Use original type_local instead of smart computed_type_local (default: false) | |
| exclude_bulk_sales | No | Exclude bulk sales and aggregated transactions (default: true for clean market data) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint=true, openWorldHint=false), and the description adds real behavioral context beyond them: a 5-credit cost per call, the automatic 12-month restriction on radius searches over 1000m, and the summary.basis='sample' vs full-stats distinction. It does not describe the return record shape, but the cost and silent-restriction disclosures are substantive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the REQUIRED constraint, then examples, then options, then cost. Structure is excellent and each block is useful, though the examples section repeats filters already enumerated above it, adding some length for a 22-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 22-parameter, no-output-schema search tool, the description covers the critical calling constraints (location requirement, pagination defaults via schema, summary mode, cost). Return-value shape is only lightly sketched, but the summary_only/full-results contrast covers the main ambiguity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds constraints the schema cannot express: no parameter is marked required in the schema yet at least one location filter is mandatory, plus commune formatting quirks (uppercase, 'PARIS 01'–'PARIS 20') and worked filter examples. This meaningfully supplements the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Search French property transactions (Demandes de Valeurs Foncières)') with scope. The DVF reference and location-filter framing make it clearly distinguishable from analytical siblings like analyze_market_statistics or find_property_comparables.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the mandatory precondition (at least one location filter) and enumerates the five valid filter combinations. It routes to alternatives in-line, telling the agent when to use summary_only ('for overviews') and how its stats relate to analyze_market_statistics, plus noting the radius_m>1000m date restriction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_real_estate_businessesSearch Real Estate Businesses (SIRENE)ARead-onlyInspect
Find real estate businesses near a location using the INSEE SIRENE registry.
Returns businesses within the specified radius, sorted by distance. Optionally enriches results with DVF transaction volume for each business's area (last 24 months) — useful for competitive intelligence.
REQUIRED: latitude + longitude (search center) OPTIONAL:
radius_m: 100–5000m (default 1000)
type: filter by business type (default "all")
"agence" — real estate agency
"notaire" — notary
"promoteur" — property developer
"gestionnaire" — property manager
"marchand" — marchand de biens
"courtier" — mortgage broker
"bailleur" — landlord / rental operator
"all" — all types
limit: 1–50 (default 20)
include_dvf_stats: boolean
Tip: use get_real_estate_business_details with the siren field from results to get full company info.
Example: latitude: 48.8566, longitude: 2.3522, radius_m: 500, type: "agence" → Returns agencies within 500m of Paris centre, sorted by distance
Cost: 5 credits
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Filter by business type: agence, notaire, promoteur, gestionnaire, marchand, courtier, bailleur, all | all |
| limit | No | Maximum number of results (1–50, default 20) | |
| latitude | Yes | Latitude of the search center (required) | |
| radius_m | No | Search radius in metres (100–5000, default 1000) | |
| longitude | Yes | Longitude of the search center (required) | |
| include_dvf_stats | No | Enrich each result with DVF transaction volume for its commune (last 24 months) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true and openWorldHint=false, so the description carries the rest and delivers: results are sorted by distance, the optional DVF enrichment covers the last 24 months, and each call costs 5 credits. It does not mention pagination limits beyond 'limit' or failure behavior, keeping it below a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the one-line purpose, then organizes parameters, a chaining tip, an example, and cost under clear labels. It is longer than strictly necessary but nearly every line earns its place; the enum glosses and example are the only mildly verbose stretch.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by explaining the return shape (businesses within radius, distance-sorted, optionally DVF-enriched) and adds cost, chaining, and a worked example. An agent has everything needed to invoke it correctly and know what comes back.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds genuine meaning beyond the schema: it expands each enum value with a human-readable gloss (e.g. 'notaire' — notary, 'promoteur' — property developer) and explains why include_dvf_stats matters (competitive intelligence). This is real added value the raw enum list lacks.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Find) plus resource (real estate businesses) and scope (near a location, sourced from the INSEE SIRENE registry). It also names the sibling get_real_estate_business_details as the follow-up tool, so an agent can distinguish this search tool from the detail-lookup sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names an explicit alternative (get_real_estate_business_details with the siren field) and a use case (competitive intelligence via DVF enrichment), and discloses cost (5 credits). It stops short of stating when NOT to use this tool or how it compares to other search-orientated siblings like search_property_transactions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_market_alertUpdate Market AlertAIdempotentInspect
Update an existing webhook alert. Requires Pro or Enterprise plan.
REQUIRED: id (alert ID from list_market_alerts)
All other fields are optional. Use is_active: false to pause without deleting.
Cost: 0 credits (Pro/Enterprise plan required)
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Alert ID to update | |
| commune | No | ||
| prix_max | No | ||
| prix_min | No | ||
| is_active | No | Set false to pause without deleting. | |
| type_local | No | ||
| code_postal | No | ||
| surface_max | No | ||
| surface_min | No | ||
| webhook_url | No | New webhook URL | |
| code_departement | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false, so the mutation profile is covered. The description adds value beyond that: plan gating, cost (0 credits), and the non-destructive pause-via-is_active behavior. It doesn't cover reversibility of field changes or partial-update semantics for the 9 optional fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short, front-loaded, and scannable with a clear REQUIRED marker and a one-line cost note. Minor redundancy: the Pro/Enterprise requirement is stated twice, which costs a little space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The safety profile is covered by annotations and there is no output schema to explain, so the essentials are present. However, for an 11-parameter partial-update mutation with 27% schema coverage, the description is thin on how unspecified fields are treated and what the other nine parameters mean, leaving gaps an agent would want filled.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 27% across 11 parameters, so the description carries a heavy burden it largely does not meet. It documents the required id and repeats the is_active pause semantics already present in the schema, but says nothing about prix_min/prix_max, surface bounds, type_local, code_postal, code_departement, or webhook_url replacement behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Update) and resource (existing webhook alert), which cleanly separates it from create_market_alert, delete_market_alert, and list_market_alerts. It does not explicitly name a sibling, but the verb+resource pairing is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives real usage context: the Pro/Enterprise plan prerequisite, the required id sourced from list_market_alerts, and the tip to use is_active:false to pause instead of deleting. It stops short of explicit when-not-to-use-this-tool guidance or pointing at update_portfolio_property-style alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_portfolio_propertyUpdate Portfolio PropertyAIdempotentInspect
Update metadata for a portfolio property.
REQUIRED: id (property ID)
Optional: label, address, code_postal, commune, latitude, longitude, type_local, surface, pieces, purchase_price
Note: Changing latitude, longitude, surface, or type_local invalidates the cached estimate — it will be refreshed on the next get_portfolio_property call.
Cost: 0 credits
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Property ID to update | |
| label | No | New label | |
| pieces | No | New number of rooms | |
| address | No | New address | |
| commune | No | New commune | |
| surface | No | New surface in m² (invalidates cached estimate) | |
| latitude | No | New latitude (invalidates cached estimate) | |
| longitude | No | New longitude (invalidates cached estimate) | |
| type_local | No | New property type (invalidates cached estimate) | |
| code_postal | No | New postal code | |
| purchase_price | No | Updated purchase price |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false. The description adds valuable behavioral context: it specifies which fields invalidate the cached estimate, noting it will be refreshed on the next get_portfolio_property call, and states the credit cost. This exceeds what annotations alone convey, though it doesn't detail permission needs or partial-update semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with required information, uses clear headings, and efficiently lists optional parameters and the invalidation note without wasteful sentences. Every part serves a purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter update tool with annotations covering safety and idempotency, and no output schema, the description provides a complete picture: required vs. optional fields, side effects (cache invalidation), and cost. It could mention whether updates are partial or full-replace, but otherwise is sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds meaning by highlighting the required parameter and listing optional ones, and by calling out the invalidation effect for specific fields. However, it doesn't add syntax or format details beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb+resource ('Update metadata for a portfolio property') and lists the mutable fields. It doesn't explicitly differentiate from siblings like add_property_to_portfolio or delete_portfolio_property, but the verb 'update' combined with the field list makes the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by naming required and optional parameters, and the note about cache invalidation provides context for when the operation has side effects. However, it doesn't explicitly state when to use this tool versus alternatives (e.g., delete_portfolio_property or add_property_to_portfolio) or any prerequisites beyond the ID requirement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
- Changed
detect_flips1 field changed- changed
Input schema / properties / type_local / descriptionPrevious value: -"Property type filter (default: both houses and apartments)"New value: +"Property type. Houses are analyzed; \"Appartement\" returns available: false (apartment flips can't be matched reliably yet). Default: houses."
1 tool update
- Changed
find_property_comparables2 fields changed- removed
Input schema / properties / max_age_months / defaultRemoved value: -12 - changed
Input schema / properties / max_age_months / descriptionPrevious value: -"Maximum transaction age in months (default: 12, max: 36)"New value: +"Maximum transaction age in months (default: 18, max: 36)"
3 tool updates
- Changed
analyze_market_statistics1 field changed- removed
Input schema / properties / exclude_outliersRemoved value: -{ - "default": true, - "description": "Exclude price outliers (default: true for clean market data)", - "type": "boolean" -}
- Changed
analyze_price_trends1 field changed- removed
Input schema / properties / exclude_outliersRemoved value: -{ - "default": true, - "type": "boolean" -}
- Changed
search_property_transactions1 field changed- removed
Input schema / properties / exclude_outliersRemoved value: -{ - "default": true, - "description": "Exclude price outliers (default: true for clean market data)", - "type": "boolean" -}
33 tool updates
- First observed
add_property_to_portfolio - First observed
analyze_building_age_price_impact - First observed
analyze_building_stock - First observed
analyze_dpe_distribution - First observed
analyze_dpe_price_and_thermal_risk - First observed
analyze_dpe_price_premium - First observed
analyze_market_activity - First observed
analyze_market_statistics - First observed
analyze_price_trends - First observed
analyze_purchasing_power - First observed
analyze_rental_yield - First observed
compare_locations - First observed
create_market_alert - First observed
delete_market_alert - First observed
delete_portfolio_property - First observed
detect_flips - First observed
estimate_property_value - First observed
find_property_comparables - First observed
get_building_characteristics - First observed
get_market_overview - First observed
get_portfolio_property - First observed
get_real_estate_business_details - First observed
get_zonal_price_distribution - First observed
list_market_alerts - First observed
list_portfolio_properties - First observed
lookup_property_history - First observed
resolve_location - First observed
score_market_health - First observed
score_renovation_potential - First observed
search_property_transactions - First observed
search_real_estate_businesses - First observed
update_market_alert - First observed
update_portfolio_property
Related MCP Connectors
French real estate data: cadastre, DVF sales, DPE energy ratings, price estimates, parcel context
French address intelligence: 18.6M sold prices, energy, risk, crime and schools — each sourced.
Données immobilières DVF France : transactions, comparables GPS et statistiques de marché.
French open data: communes, parcels, risks, property sales, water, crime, planning.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceAccess 17M+ geocoded French property transactions (DVF), 22M+ DPE energy ratings, and 20M+ building records via MCP or REST API. Search transactions, market stats, comparables, price trends, rental yield, flip detection, and more.MIT
- AlicenseNot gradedqualityDmaintenanceAnalyzes French real-estate market using open data sources like DVF transactions, DPE certificates, and risk data.MIT
- FlicenseNot gradedqualityFmaintenanceFrench real estate data platform for AI agents. Identifies property owners likely to sell and tracks behavioral signals on active listings. Coverage: metropolitan France.-
- FlicenseAqualityBmaintenanceProvides AI agents with real-time access to French real estate transaction data, price per square meter, and property estimates using official open DVF data, with no API key required.4-
Glama MCP Gateway
Add one secure layer between your agents and this server.