Skip to main content
Glama

Server Details

French address quality, geocoding, routing, company lookup & catchment stats (BAN, INSEE, OSM).

If you are the author of this connector, you can claim ownership with GitHub, an HTTP challenge, or a DNS record. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Uptime
100.0% over 41 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
htristram/trustydata-mcp-server
GitHub Stars
3
Server Listing
TrustyData MCP Server

TDQS

A4.4/5.0

Scored across 11 tools

Disambiguation4/5

The tools are mostly distinct, but there is some overlap between search_address and verify_address, and between search_company and get_company_details. However, the descriptions clearly delineate their different purposes (search vs. verify, search vs. details).

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern: compute_route, get_address_details, get_company_details, route_matrix, search_address, search_company, search_locality, search_nearby, verify_address, zone_compare, zone_stats. No mixing of conventions.

Tool Count5/5

With 11 tools, the count is well-scoped for a domain covering addresses, companies, routing, and zone statistics. Each tool has a clear role and none feels redundant.

Completeness4/5

The surface covers core workflows: search and verify addresses, search and detail companies, routing and matrices, locality lookup, and zone statistics/comparison. Missing would be a distance-only tool for single pairs (but compute_route covers that) or batch company details, but those are minor gaps.

Available Tools

11 tools
compute_routeItinéraire routier completA
Read-onlyIdempotent
Inspect

Calcule un itinéraire complet entre une origine et une destination sur le réseau France (OpenStreetMap), au choix en voiture, à pied ou à vélo : distance, durée, étapes de navigation en français, boîte englobante et géométrie encodée (polyline6). Mode de déplacement : car (voiture, défaut), walking (à pied) ou cycling (à vélo). Les valeurs du contrat d'API (auto, pieton, velo) sont acceptées telles quelles. Les consignes suivent le mode — « Conduisez… », « Marchez… », « Pédalez… » — et la réponse renvoie le mode utilisé : une durée n'est interprétable qu'accompagnée du mode qui l'a produite. ⚠️ Chaque mode a sa distance maximale : 5 000 km en voiture, 500 km à vélo, 250 km à pied ; au-delà la réponse est un 422 explicite, pas une panne. Pour de simples distances en masse, préfère route_matrix. Plan minimum : Business. Mention OSM ODbL obligatoire.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoMode de déplacement : `car` (défaut), `walking` ou `cycling`.
originYesPoint de départ : adresse libre OU couple `lat`/`lon`.
destinationYesPoint d'arrivée : adresse libre OU couple `lat`/`lon`.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context: mode-specific maximum distances (5,000 km car, 500 km vélo, 250 km à pied) with a 422 error response, the fact that duration is only interpretable with the mode, and the OSM ODbL attribution requirement. It also explains that API contract values ('auto', 'pieton', 'velo') are accepted. This goes beyond the annotations without contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but well-organized: it front-loads the core function, then lists outputs, then mode details, then limits, then alternatives. Every sentence adds value. It's slightly long but each piece is necessary for correct invocation (mode limits, plan requirement, attribution). The warning emoji draws attention to the critical constraint.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (3 modes, nested origin/destination objects, output schema present), the description covers the essential operational details: mode values, distance limits, error behavior, plan requirement, attribution, and sibling routing. The output schema exists so return values don't need explanation. Minor gap: it doesn't mention whether the route is restricted to France-only or what happens with cross-border routes, but the 'réseau France' is stated upfront.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 all parameters thoroughly (origin/destination with lat/lon/address XOR logic, mode with default). The description adds the mode values ('car', 'walking', 'cycling') and the API contract aliases ('auto', 'pieton', 'velo'), which is useful but the schema already covers the core semantics. Baseline 3 is appropriate since the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Calcule') and resource ('itinéraire complet entre une origine et une destination sur le réseau France (OpenStreetMap)'), and lists the output components (distance, durée, étapes, boîte englobante, géométrie polyline6). It also distinguishes itself from route_matrix by explicitly saying 'Pour de simples distances en masse, préfère route_matrix.' This clearly differentiates it from siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says when to use this tool vs alternatives: 'Pour de simples distances en masse, préfère route_matrix.' It also provides mode-specific guidance (car/walking/cycling), maximum distances per mode, and the plan requirement ('Plan minimum : Business'). This is explicit when/when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_address_detailsDétail d'une adresseA
Read-onlyIdempotent
Inspect

Récupère le détail complet d'une adresse via son identifiant (id renvoyé par search_address ou verify_address). Outil de drill-down : les détails sont déjà inclus inline par les deux autres outils. Plan minimum : Discovery.

ParametersJSON Schema
NameRequiredDescriptionDefault
address_idYesIdentifiant d'adresse (champ `id`) renvoyé par verify_address ou search_address.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, and the description is consistent: 'Récupère' is a read operation. It adds useful context by noting the id provenance and that the details are inline in the other two tools, plus a plan constraint. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences; the main action is front-loaded, followed by drill-down context and the plan requirement. No filler or redundant restatement of the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given a single parameter, a full output schema, and rich annotations, the description covers the essential call context: what it returns, where the id comes from, how it relates to siblings, and a plan constraint. Nothing critical for invoking it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already describes address_id as the id returned by verify_address/search_address, and the description repeats that same provenance without adding new format, constraints, or examples. With 100% schema coverage, the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Récupère'), a resource ('le détail complet d'une adresse'), and a required identifier, immediately distinguishing it from search/verify tools. It explicitly frames itself as a drill-down tool and names the source tools, so an agent can tell it apart from siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It identifies the relevant siblings (search_address, verify_address) and states that this is a drill-down tool whose details are already inline in those tools, implying when the dedicated call is or isn't needed. It also mentions a minimum plan (Discovery), but does not give an explicit 'use this instead of X when...' rule.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_company_detailsFiche d'un établissement ou d'une entrepriseA
Read-onlyIdempotent
Inspect

Fiche détaillée d'une entreprise ou d'un établissement français (base SIRENE). Un seul identifiant, deux usages : un SIRET (14 chiffres) renvoie la fiche de CET établissement ; un SIREN (9 chiffres) renvoie celle du SIÈGE de l'entreprise. Structure de la réponse : la racine décrit l'ÉTABLISSEMENT (adresse, activité, effectif, état, conventions collectives applicables à CE site) et le bloc unite_legale décrit l'ENTREPRISE (identité, dirigeants, chiffre d'affaires, TVA). Le niveau de détail dépend du plan : géolocalisation et TVA en Starter, dirigeants et conventions collectives en Growth, finances et procédures collectives en Business. Un champ ABSENT n'est pas une donnée inexistante : il peut relever d'un palier supérieur — son absence ne prouve pas l'inexistence de la donnée. Les dirigeants sont des données personnelles issues du Registre National des Entreprises (INPI) ; chacun porte opposition_prospection — true = cette personne s'est opposée à l'usage de ses données à des fins de prospection commerciale, false = pas d'opposition enregistrée, null = non renseigné (à ne pas lire comme false). C'est le SEUL endroit où cette information est servie. Plan minimum : Discovery.

ParametersJSON Schema
NameRequiredDescriptionDefault
company_idYesSIRET (14 chiffres) de l'établissement, ou SIREN (9 chiffres) pour le siège de l'entreprise.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, and the description consistently aligns with these (no contradiction). The description adds significant behavioral context beyond annotations: the distinction between establishment and legal unit in the response structure, the dependency of detail level on plan, and the crucial warning that absent fields do not imply non-existence. It also explains the 'opposition_prospection' field semantics (true/false/null), which is critical for proper interpretation. This is valuable additional context that goes beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long and dense, covering many aspects, but every sentence delivers substantive information. The key usage logic (SIRET vs SIREN) is front-loaded, which is good, but the latter half introduces complex plan-level details and field-specific interpretation that could overwhelm an agent reading it for the first time. It is not overly verbose, but it could be better organized to prioritize the most actionable points first.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's moderate complexity (one parameter, rich response structure with an output schema) and the strong annotations (read-only, open-world, idempotent), the description is quite complete. It explains the response structure, plan-dependent detail levels, the open-world semantics, and the sensitive nature of personal data, which is essential for correct use. It could arguably include a note on rate limits or authorization, but overall it covers the critical context needed for an agent to interpret results correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already fully describes the only parameter (company_id) with its format and meaning, achieving 100% schema coverage. The description reiterates the SIRET/SIREN duality, which adds a bit of context but largely mirrors the schema. According to the rubric, with high schema coverage, a baseline of 3 is appropriate, and the description does not meaningfully augment the parameter semantics further.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: retrieving detailed records for French companies or establishments from the SIRENE database. It specifies the exact resource, the two accepted identifier types (SIRET/SIREN), and the corresponding response targets, making its intent unambiguous. It also distinguishes itself from siblings like search_company by focusing on fetching a single record by ID rather than searching.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear usage context: it explains the two identifier modes (SIRET for establishments, SIREN for the company's head office), which effectively tells the agent when to use each. It doesn't explicitly name alternatives or when not to use this tool, but the clear scope and single-parameter design make the usage context strong. The sibling tools are all search or address-related, so no further exclusion is needed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

route_matrixMatrice de temps et de distancesA
Read-onlyIdempotent
Inspect

Calcule une matrice de distances et durées entre N origines et M destinations (jusqu'à 25×25) sur le réseau France (OpenStreetMap), au choix en voiture, à pied ou à vélo. Sans géométrie ni consignes : pour un itinéraire détaillé, utilise compute_route. Mode de déplacement : car (voiture, défaut), walking (à pied) ou cycling (à vélo). Les valeurs du contrat d'API (auto, pieton, velo) sont acceptées telles quelles. ⚠️ La matrice plafonne à 1 500 km en voiture et à 200 km à pied comme à vélo — des limites plus basses que compute_route (5 000 / 250 / 500 km) : un trajet que compute_route accepte peut être refusé ici, en 422. Plan minimum : Growth. Mention OSM ODbL obligatoire.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoMode de déplacement : `car` (défaut), `walking` ou `cycling`.
originsYesPoints de départ (1 à 25), chacun une adresse libre OU un couple `lat`/`lon`.
destinationsYesPoints d'arrivée (1 à 25), même forme.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true, so safety is covered. The description adds substantial operational context: network (France OSM), matrix cap (25×25), per-mode distance ceilings, the 422 error case, plan requirement (Growth), and mandatory OSM ODbL attribution. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence earns its place: purpose, alternative, modes, limits, and attribution. It front-loads the core function and scopes before constraints. Slightly long but well-organized in a way that supports quick comprehension.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return details are handled elsewhere. The description covers everything an agent needs to call correctly: what it does, network, modes, legacy values, limits, error behavior, plan, and attribution. Nothing essential is missing for safe and correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds value by documenting legacy mode values (`auto`, `pieton`, `velo`) accepted as-is, which the schema does not mention. It also reinforces the XOR lat/lon vs address semantics already present in the schema. This extra semantic detail justifies moving above baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Calcule une matrice de distances et durées entre N origines et M destinations' and immediately scopes it to France/OSM with mode options. It also explicitly contrasts with the sibling compute_route ('Sans géométrie ni consignes'), making the distinction unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly tells the agent when to use this tool vs its sibling: 'pour un itinéraire détaillé, utilise compute_route'. It also warns that matrix distance limits (1500 km car, 200 km walk/bike) are lower than compute_route, so a route accepted there may be rejected here with a 422. This gives explicit when/when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_addressRechercher des adressesA
Read-onlyIdempotent
Inspect

Recherche des adresses françaises à partir d'un texte libre (même partiel) et renvoie des candidats classés par pertinence (score 0-1). Pour confirmer UNE adresse précise, préfère verify_address. Chaque candidat porte les trois lignes postales prêtes à écrire (ligne_voie, ligne_complement, ligne_commune). Enrichissements selon le plan (mêmes paliers que verify_address, dont statistical_grid Filosofi en Business). Plan minimum : Discovery.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoNombre maximal de résultats (défaut 10).
queryYesDébut d'adresse ou adresse partielle à compléter (numéro, voie, commune…).
detailsNoInclure les blocs détaillés (position GPS et Lambert 93, IRIS, grille statistique — selon le plan). Défaut vrai.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, openWorld, and idempotent hints, so the safety profile is covered. The description adds valuable behavioral details: ranking by relevance, the structure of returned candidates (three postal lines), and enrichment tiers tied to the plan. This goes beyond annotations without contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four concise sentences, each carrying essential information. The main purpose is first, then routing to the sibling, then output details, then plan requirements. No filler, well-front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema exists and annotations cover the safety profile, the description is complete. It explains the ranking, the candidate structure, and enrichment levels, and even notes the minimum plan. An agent has everything needed to call this tool correctly and understand its results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds context by explaining that the query accepts partial text and that candidates include postal lines, which enriches the meaning of the parameters. It doesn't rehash every schema field but adds enough to clarify usage beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action (search French addresses from free text), a clear scope (French addresses, partial text), and the output (ranked candidates with a relevance score). It also distinguishes itself from verify_address by naming the sibling explicitly, making it unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly recommends verify_address for confirming a single precise address, clearly routing the agent when to use this tool vs. the alternative. It also mentions the minimum plan required (Discovery), giving actionable selection criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_companyRechercher des entreprises et établissementsA
Read-onlyIdempotent
Inspect

Recherche des entreprises et des établissements français dans la base SIRENE (INSEE), par nom, SIREN, SIRET, ville, code postal, code NAF, ou par proximité géographique. IMPORTANT : un résultat est TOUJOURS un ÉTABLISSEMENT (un SIRET), jamais une entreprise — même groupé par entreprise, où le SIREN est représenté par son meilleur établissement (le siège de préférence). 3 établissements d'un même SIREN ne font donc pas « 3 entreprises trouvées ». Par défaut, un résultat par entreprise si query est fourni, un résultat par établissement en recherche par proximité ou par siren ; force ce comportement avec group_by_company. classement_pertinence se lit avant de présenter un « meilleur match » : à false (listing simple ou tri par distance), le premier résultat n'est PAS le plus probable. Un résultat diffusible: false a ses nom et adresse masqués par l'INSEE — c'est la loi, pas une donnée manquante, et rien ne s'y complète de mémoire. Une liste vide fait autorité : aucune entreprise ne correspond. La fiche complète s'obtient ensuite via get_company_details. Plan minimum : Discovery — la recherche par proximité (lat/lon/radius_m) nécessite le plan Growth.

ParametersJSON Schema
NameRequiredDescriptionDefault
latNoRecherche par proximité (plan Growth) : latitude WGS84 du centre, avec `lon` et `radius_m`.
lonNoLongitude WGS84 du centre de la recherche par proximité, avec `lat` et `radius_m`.
cityNoFiltre sur la commune (recherche floue) ; exige `query`.
pageNoNuméro de page, à partir de 1.
queryNoNom, dénomination, sigle ou enseigne ; un SIREN (9 chiffres) ou un SIRET (14 chiffres) donne une correspondance exacte.
sirenNoTous les établissements d'une unité légale (SIREN, 9 chiffres).
statusNoFiltre : `active` (établissement en activité) ou `closed` (fermé).
addressNoFiltre sur la voie (recherche floue) ; exige `query`.
naf_codeNoFiltre : code NAF/APE de l'activité, ex. `62.02A`.
per_pageNoRésultats par page (défaut 10, plafond 25).
radius_mNoRayon en mètres autour du centre (jusqu'à 50 km) ; plan Growth.
postal_codeNoFiltre : code postal exact.
group_by_companyNoVrai : un résultat par entreprise (son meilleur établissement, le siège de préférence) ; faux : un par établissement. Absent : défaut de l'API selon la recherche.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description is rich: it always returns an establishment, explains grouping, diffusible masking, and empty-result semantics. However, it asserts 'Une liste vide fait autorité : aucune entreprise ne correspond', which is a closed-world claim that contradicts the openWorldHint=true annotation. Per the rubric, a contradiction forces a score of 1.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but efficient: every sentence carries a distinct operational caveat or routing instruction, and the main purpose is front-loaded. There is no filler or repetition of schema text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 13-parameter, 0-required tool with an output schema, the description covers search modes, defaults, semantic interpretation of results, legal masking, empty results, plan requirements, and the next-step tool. Nothing needed 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.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds meaningful semantics beyond the schema: default result grouping for query vs siren/proximity, how to force it with group_by_company, and plan restrictions on proximity parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: searching French companies and establishments in the INSEE SIRENE base, and it lists concrete search criteria (name, SIREN, SIRET, city, postal code, NAF code, proximity). This clearly distinguishes it from sibling address/locality tools and from get_company_details.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear usage context: default grouping behavior for query vs proximity vs siren, the Growth plan requirement for proximity search, and the follow-up tool get_company_details for the full record. It does not explicitly state when to prefer sibling search tools such as search_address or search_nearby, 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.

search_localityRechercher des communesA
Read-onlyIdempotent
Inspect

Recherche ET liste des communes françaises. Deux usages : (1) retrouver une commune précise par nom, code postal ou code INSEE (renseigne query) ; (2) LISTER/FILTRER les communes d'un département ou d'une région, avec une fourchette de population optionnelle — query est alors inutile. Exemple : « communes du Pas-de-Calais de plus de 100 000 habitants » → department_code=["62"], population_min=100000. Préfère department_code (ex. "62") au nom ; les noms de département sont normalisés automatiquement ("Pas-de-Calais", "Val-d'Oise"… sont acceptés). Renvoie code INSEE, code postal, population et — selon le plan/details — altitude, densité, surface, département et région. Plan minimum : Discovery.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoNombre maximal de résultats (défaut 20).
queryNoNom de commune, code postal ou code INSEE, complet ou partiel. Optionnel si un filtre est donné.
detailsNoInclure les détails de chaque commune (codes, population, coordonnées). Défaut vrai.
postal_codeNoFiltre : codes postaux (liste).
region_codeNoFiltre : codes de région (liste).
region_nameNoFiltre : noms de région (liste).
population_maxNoFiltre : population maximale (habitants).
population_minNoFiltre : population minimale (habitants).
department_codeNoFiltre : codes de département (liste, ex. `62`, `2A`). À préférer au nom.
department_nameNoFiltre : noms de département (liste ; orthographe normalisée automatiquement).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false. The description adds further context: returned fields (code INSEE, code postal, population, and details depending on plan), automatic normalization of names, and the Discovery plan minimum requirement. This goes beyond what annotations alone provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but well organized: two numbered use cases, one illustrative example, a preference note, and a return-field summary. Every sentence earns its place, and the core purpose is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 0-required-parameter tool with a rich schema, an output schema, and clear annotations, the description covers all important invocation aspects: input modes, filtering options, output content, and the plan requirement. An agent has enough context to select and call the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds cross-parameter meaning: query is optional when a filter is present, department_code is preferred over department_name, and the population_min example clarifies combined usage. This is meaningful added value, though it does not enrich every parameter individually.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Recherche ET liste des communes françaises'. It also separates two distinct usages (precise lookup via query vs list/filter by department/region), which is especially useful for an agent distinguishing this from sibling address/company search tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly defines when to use query ('retrouver une commune précise') and when it is useless ('query est alors inutile' for listing/filtering). It gives a concrete worked example, advises preferring department_code over names, and notes automatic normalization of department names. Internal routing between the two modes is fully explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_nearbyAdresses à proximité d'un pointA
Read-onlyIdempotent
Inspect

Recherche les adresses du référentiel officiel (BAN) situées dans un rayon de radius_m mètres (1 à 50 000) autour d'un point central, triées par distance croissante. Le point central est SOIT une adresse libre (address), SOIT un couple lat+lon WGS84 — jamais les deux. Une adresse libre est résolue comme verify_address et renvoyée dans point_central.adresse_resolue. Chaque résultat porte distance_m (mètres, à vol d'oiseau) et les enrichissements du plan (mêmes paliers que verify_address, dont statistical_grid Filosofi en Business). Pagination : passer offset=pagination.next_offset pour charger la page suivante (null = fin de parcours) ; pagination.total_estime est une estimation ; si pagination.tronque vaut true, le cap de 5000 adresses est atteint — réduire le rayon pour l'exhaustivité. Plan minimum : Growth.

ParametersJSON Schema
NameRequiredDescriptionDefault
latNoLatitude WGS84 du centre, avec `lon` et sans `address`.
lonNoLongitude WGS84 du centre, avec `lat` et sans `address`.
limitNoNombre de résultats par page (défaut 10, plafond 50).
offsetNoDécalage de pagination : reprendre à `pagination.next_offset` de la réponse précédente.
addressNoCentre par adresse libre (un nom de commune suffit). Exclusif de `lat`/`lon`.
radius_mYesRayon de recherche en mètres autour du centre.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark the tool as read-only, idempotent, open-world, and non-destructive, but the description adds substantial behavioral detail: addresses are resolved like verify_address, results carry distance_m, enrichments follow plan tiers including statistical_grid Filosofi, pagination semantics are explained (next_offset, total_estime, tronque), and a 5000-result cap is disclosed. This goes well beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description opens with the core purpose in the first sentence, then efficiently covers center modes, result contents, pagination, truncation, and plan requirements. Every sentence contributes distinct information and none is redundant with the schema or annotations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 6-parameter spatial search with pagination, center-mode exclusivity, a 5000-address cap, and plan restrictions, the description is complete. An output schema exists, so the description does not need to enumerate return fields, but it still explains the crucial output concepts like distance ordering, resolved address, and truncated pagination.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and each parameter already has a meaningful schema description, so the baseline is 3. The description adds further value by explaining radius units and range (1–50,000 m), reinforcing address/lat+lon exclusivity, describing how address resolution appears in point_central.adresse_resolue, and clarifying the pagination contract for offset. This is more than the schema alone provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource: searching BAN addresses within a radius around a center point, sorted by distance. It clearly distinguishes the tool's spatial-search scope from siblings like search_address or verify_address by emphasizing the radial proximity and center-point modes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly explains when to use this tool: to find addresses within a radius of a center, with explicit constraints on center modes and pagination. It does not explicitly name alternative tools or state 'use X instead', but the context is unambiguous and includes practical guidance such as reducing the radius when truncation occurs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

verify_addressVérifier et normaliser une adresseA
Read-onlyIdempotent
Inspect

Vérifie et normalise une adresse française contre le référentiel géographique officiel (BAN). Renvoie un verdict (match_exact, match_probable, aucun_match) et l'adresse canonique, déjà découpée en trois lignes postales prêtes à écrire (ligne_voie, ligne_complement, ligne_commune) — à utiliser telles quelles plutôt que de recomposer l'adresse. Selon le plan : coordonnées GPS + Lambert 93 (Starter+), code IRIS (Growth+), statistiques INSEE Filosofi du carreau 200 m dans statistical_grid : population, répartition par tranches d'âge (0-3 à 80+), ménages, pauvreté, niveau de vie, époque de construction des logements (Business). Plan minimum : Discovery. Une adresse par appel.

ParametersJSON Schema
NameRequiredDescriptionDefault
addressYesAdresse postale française en texte libre, telle que saisie (fautes, abréviations et accents manquants tolérés).
detailsNoInclure les blocs détaillés (position GPS et Lambert 93, IRIS, grille statistique — selon le plan). Défaut vrai.
max_resultsNoNombre maximal de candidats renvoyés (défaut 5).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, and the description adds meaningful behavior: the verdict taxonomy, canonical line labels, plan-dependent enrichment (GPS/Lambert 93, IRIS, Filosofi statistical_grid), and the one-address-per-call constraint. No statement contradicts the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The main purpose is front-loaded in the first sentence, followed by output behavior, plan-tier extras, and the per-call limit. The plan-tier enumeration is somewhat long but earns its place by telling the agent exactly what to expect from `details`. The structure is logical, though not as tight as a two-sentence definition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given rich annotations, full schema coverage, and a present output schema, the description supplies the key missing context: BAN verification, verdict behavior, postal-line outputs, plan-based variance, and the single-address constraint. It does not explicitly contrast with overlapping siblings like get_address_details or search_address, but its distinctive vocabulary makes correct selection likely.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Parameter descriptions in the schema already cover 100% of the three parameters, so the baseline is 3. The description goes slightly beyond by imposing 'Une adresse par appel' and by tying the `details` parameter to plan-dependent blocks such as statistical_grid. It doesn't re-document parameters, but adds the operational constraints that matter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Vérifie et normalise une adresse française contre le référentiel géographique officiel (BAN)', a precise verb-resource-target statement. It distinguishes itself from siblings by naming verdict types (match_exact, match_probable, aucun_match) and a canonical three-line postal output. 'Une adresse par appel' further clarifies its single-item verification scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly describes the use case: verifying/normalizing one French address against the official BAN and returning ready-to-use postal lines. The instruction to use ligne_voie/ligne_complement/ligne_commune as-is rather than recomposing the address is practical guidance. It doesn't name alternatives or exclusions, but the context is sufficient to differentiate from search/detail siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

zone_compareComparer des zones de chalandiseA
Read-onlyIdempotent
Inspect

Compare de 2 à 10 zones de chalandise en un seul appel et mesure leur cannibalisation. Pour chaque zone, rend exactement ce que zone_stats rend (population, menages, niveau_de_vie_moyen, ages, sexe, menages_profil, logements, csp, potentiel_depense, immobilier, activites, carreaux, source, attribution — voir cet outil pour le sens de chaque bloc), plus id et exclusif : la population, les ménages et le potentiel que la zone est SEULE à couvrir, calculés comme « la zone moins l'union de toutes les autres » — jamais « total moins les paires », qui à trois zones et plus retrancherait deux fois un triple recouvrement ; exclusif.part_population en pour cent de la population de la zone. Entre zones : chevauchements, une entrée par paire qui se recouvre (population, ménages et potentiel comptés deux fois ; une paire disjointe n'apparaît pas), et classement, tous les identifiants triés sur rank_by décroissant : population (défaut), exclusive_population, theoretical_potential ou exclusive_potential — ces deux derniers exigent coefficient. Chaque élément de zones se décrit comme sur zone_stats : un centre (address, un nom de commune suffit, OU lat+lon WGS84, jamais les deux) et UNE portée, soit minutes (1 à 30) avec mode car (défaut), walking ou cycling et, en voiture, traffic free (défaut) ou peak (heure de pointe du matin, vitesses modélisées, pas de trafic temps réel — refusé à pied et à vélo, et pouvant répondre « indisponible » si la plateforme ne l'a pas encore ouvert), soit radius_km (1 à 50) à vol d'oiseau ; plus un id optionnel (1 à 40 caractères, lettres, chiffres, _, -, unique dans l'appel) repris dans la réponse, le classement et les erreurs — sans id, la position à partir de 1. reference : france (défaut) ou department — UN réglage pour DEUX blocs : l'indice de chaque poste CSP et celui de chaque poste d'activites sont alors rapportés au département qui pèse le plus dans la zone (csp.reference.code, activites.reference.code, et leurs libellés respectifs csp.reference.libelle / activites.reference.libelle, null en référence France). coefficient (0 exclu à 1) : la part du revenu disponible que le secteur capte, appliquée à toutes les zones, à leurs exclusifs et aux paires ; il déclenche potentiel_theorique = revenu disponible estimé × coefficient — une estimation, un potentiel théorique, pas une prévision de chiffre d'affaires ; sans coefficient il vaut null, une valeur qui ne s'invente pas. Le guide « Zone de chalandise » donne des repères par fonction de consommation (restauration ≈ 0,048). La CSP est elle aussi une estimation : aucun indice n'est exploitable sur une zone dont csp.fiabilite.indices_fiables est faux. Comme sur zone_stats, un poste dont la part est inférieure à csp.fiabilite.part_min (0,5 %) rend indice: null — un refus de servir, pas une donnée manquante ; effectif et part restent valides — ne jamais reconstituer l'indice à partir de leur rapport avec reference_part non plus. reference_part donne la part du même poste sur la référence : citer les deux parts côte à côte plutôt qu'un écart — un indice de 82 est un écart de 18 %, pas de 18 points. Le bloc activites est rendu pour chaque zone, identique à celui de zone_stats : c'est un PLANCHER d'établissements actifs et géolocalisés — ne jamais le présenter comme exhaustif, ni appeler ces établissements des concurrents ; d'une zone à l'autre, comparer les indice plutôt que les effectifs, le sous-compte s'y annulant en grande partie. exclusif et chevauchements ne portent PAS d'établissements : population, ménages et potentiel seulement. Une zone inatteignable (isochrone sans contour) rend des zéros, n'entre dans aucune paire et se classe dernière ; plafond de surface 10 000 km² par zone. Plan minimum : Growth ; un appel compté quel que soit le nombre de zones ; dix isochrones prennent une à deux secondes. attribution accompagne tout chiffre cité (INSEE Filosofi et Recensement de la population ; IGN Contours IRIS ; SIRENE (INSEE) pour les établissements du bloc activites ; DGFiP DVF pour les prix immobiliers ; OpenStreetMap ODbL dès qu'une zone est une isochrone).

ParametersJSON Schema
NameRequiredDescriptionDefault
zonesYesDe 2 à 10 zones, chacune avec les arguments de zone_stats (centre + `minutes` ou `radius_km`) et un `id` optionnel.
rank_byNoCritère du classement : `population` (défaut), `exclusive_population`, `theoretical_potential` ou `exclusive_potential` — ces deux derniers exigent `coefficient`.
referenceNoRéférentiel des indices de chaque zone — UN réglage pour DEUX blocs, `csp` et `activites` : `france` (défaut) ou `department`.
coefficientNoPart du revenu disponible que le secteur capte (0 exclu à 1), appliquée à toutes les zones, exclusifs et paires ; requis par les critères de potentiel.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes far beyond the readOnly/idempotent/non-destructive annotations, disclosing subtle calculation rules such as `exclusif` being 'zone minus the union of all others' rather than 'total minus pairs'. It also exposes edge cases: unreachable zones return zeros and rank last, traffic peak may answer 'indisponible', and attribution must accompany every cited figure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every sentence adds density and non-obvious semantics; there is no filler. It front-loads the core purpose and the distinctive outputs (`exclusif`, `chevauchements`, `classement`) before drilling into per-zone arguments and caveats.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers output structure, parameter semantics, edge cases, reference behavior, attribution, billing, plan requirement, and performance — enough for an agent to invoke the tool correctly without external documentation. The presence of an output schema lets the description focus on interpretation and fallback rules rather than raw return fields.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite 100% schema coverage, the description adds substantial meaning: `coefficient` triggers `potentiel_theorique`, `reference` is a single setting affecting both `csp` and `activites` indices, and `rank_by` values are enumerated with `coefficient` prerequisites. It also clarifies the address/lat-lon and minutes/radius_km exclusions and the `id` fallback behavior.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Compare de 2 à 10 zones de chalandise en un seul appel et mesure leur cannibalisation'. It clearly differentiates itself from the sibling `zone_stats` by positioning the multi-zone comparison and overlap analysis as its unique job.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly references `zone_stats` as the tool whose output shape and block semantics are reused, which orients the agent to the single-zone alternative. It also gives operational guidance: plan minimum Growth, one call billed regardless of zone count, and expected runtime for ten isochrones.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

zone_statsStatistiques d'une zone de chalandiseA
Read-onlyIdempotent
Inspect

Rend ce que l'INSEE sait de ceux qui habitent une zone de chalandise : population, menages, menages_pauvres (sous le seuil de pauvreté), niveau_de_vie_moyen (euros par personne et par an — une moyenne, jamais une médiane), iris_couverts (quartiers IRIS touchés), surface_km2, et carreaux {total, estimes}. Les chiffres sont des sommes des carreaux INSEE Filosofi de 200 m pondérées par la part de chaque carreau dans la zone ; carreaux.estimes compte ceux que l'INSEE a imputés au titre du secret statistique — c'est la norme du fichier (souvent la majorité hors des villes denses), pas un défaut de la zone. Depuis la plateforme 1.11, la réponse porte aussi le PROFIL de la zone, en trois blocs de {effectif, part} : ages (onze tranches INSEE 0_3 … 80_plus et inconnu, parts rapportées à population), menages_profil (personnes seules, 5 personnes et plus, propriétaires, monoparentaux, en collectif, en maison, parts rapportées à menages, plus surface_moyenne_m2) et logements (total, cinq périodes de construction et sociaux, parts rapportées à logements.total). Les parts sont en pourcentage au dixième, calculées avant arrondi ; les effectifs sont arrondis séparément, leur somme peut différer du total de quelques unités. Depuis la plateforme 1.16, le bloc sexe donne hommes et femmes en {effectif, part} plus population_recensement — les parts sont rapportées à population_recensement (hommes + femmes, la population du recensement répartie sur la zone), pas à population : les deux diffèrent de quelques pour cent, c'est normal (ménages ordinaires 2021 contre population totale 2022). C'est une estimation : le sexe n'est diffusé qu'à l'IRIS et réparti sur les carreaux au prorata de leur population ; les limites sont celles de csp.fiabilite. Depuis la plateforme 1.12, le bloc csp donne les huit catégories socioprofessionnelles des 15 ans et plus (agriculteurs, artisans_commercants, cadres, professions_intermediaires, employes, ouvriers, retraites, autres_inactifs), chacune en {effectif, part, indice, reference_part} : l'indice vaut 100 × part de la zone / part de la France (100 = la moyenne nationale, 150 = une fois et demie) — ou du département qui pèse le plus dans la zone si reference vaut department (défaut france), son code étant rendu dans csp.reference.code et son nom dans csp.reference.libelle (null en référence France). C'est une estimation, pas une mesure : les CSP ne sont diffusées qu'à l'IRIS et sont réparties sur les carreaux au prorata de leur population — un indice est donc un ordre de grandeur estimé, et il n'y en a aucun d'exploitable quand csp.fiabilite.indices_fiables est faux (moins de 1 000 personnes de 15 ans et plus : la zone recopie le profil d'un ou deux IRIS). Un poste dont la part est inférieure à csp.fiabilite.part_min (0,5 %) n'a PAS d'indice : indice y vaut null, et ce n'est pas une donnée manquante — les CSP étant réparties de l'IRIS vers les carreaux, un poste rare porte une erreur relative trop grande pour être rapportée à une référence. Son effectif et sa part restent servis et se citent normalement ; ne jamais reconstituer l'indice à partir d'eux, ni à partir de leur rapport avec reference_part — ce rapport reconstituerait l'indice tout autant, et reste interdit. reference_part donne la part du même poste sur la référence : citer les deux parts côte à côte plutôt qu'un écart — un indice de 82 est un écart de 18 %, pas de 18 points. Le bloc potentiel_depense donne les unités de consommation reconstituées, le revenu disponible estimé des habitants (revenu_disponible_estime, en euros par an) et revenu_disponible_par_menage — le chiffre à citer de préférence, en disant « estimation » (niveau de vie écrêté, revenus 2021, unités de consommation reconstituées). potentiel_theorique = revenu disponible estimé × coefficient n'est calculé que si coefficient est passé (0 exclu à 1 : la part du revenu disponible que le secteur capte — le guide « Zone de chalandise » donne des repères par fonction de consommation, restauration ≈ 0,048) ; sinon il vaut null, une valeur qui ne s'invente pas. C'est un potentiel théorique, pas une prévision de chiffre d'affaires. Depuis septembre 2026, le bloc immobilier donne les PRIX DE VENTE immobiliers de la zone (DVF, DGFiP) : trois séries maisons, appartements et locaux_activite, chacune avec annees[] (par année sur cinq ans : ventes, prix_m2_median en euros par m² de surface réelle bâtie, reference_prix_m2_median sur le département), evolution_pct (première → dernière année fiable, non annualisée) et indice (100 = le département de reference, nommé par libelle). Ce sont des prix de vente déclarés dans les actes, pas des loyers — ne jamais en déduire un loyer ; les locaux d'activité mêlent boutiques, entrepôts et bureaux, un ordre de grandeur. Sous 20 ventes dans l'année, le prix médian vaut null (fiabilite.annees_fiables liste les années retenues) ; hors_couverture vrai signale une zone hors du jeu DVF (Alsace-Moselle et Mayotte ; les DROM 971-974 sont couverts), pas une zone sans vente. Depuis septembre 2026, le bloc activites compte les ÉTABLISSEMENTS de la zone par famille et sous-famille d'activité (boulangeries, tabac, comptabilité…), avec une densité pour 10 000 habitants et un indice contre la FRANCE par défaut — ou contre le département dominant de la zone si reference vaut department, activites.reference disant lequel des deux a servi. C'est un PLANCHER : seuls les établissements actifs et géolocalisés y figurent — fiabilite.taux_localisation dit quelle part cela représente. Ne jamais présenter ces comptes comme exhaustifs, ni les appeler des concurrents. familles[] porte les 14 familles, toutes, même à zéro ; chacune ses sous_familles[], dont celles à zéro sont omises. Chaque poste donne cle, libelle, etablissements, part (de total), densite (pour 10 000 habitants), reference_densite et indice (100 = la référence, que reference.libelle nomme). L'indice est moins biaisé que l'effectif : calculé de la même façon des deux côtés, le sous-compte s'y annule en grande partie — préférer l'indice pour comparer, l'effectif pour dénombrer. indice vaut null sous fiabilite.etablissements_min (5) établissements dans le poste, sur une zone sans habitant, et quand la référence n'a rien à comparer — soit qu'elle n'ait aucun établissement dans ce poste (reference_densite à 0.0 sur une sous-famille, null sur une famille), soit qu'aucune population de référence ne soit connue (reference_densite à null). densite est servie dès que la zone a des habitants, et vaut null sur une zone qui n'en a aucun (mer, étranger) — ne jamais l'annoncer comme toujours présente ; etablissements et part, eux, le sont. fiabilite.indices_fiables est faux sous 1 000 habitants. Deux limites de la nomenclature NAF à répercuter telles quelles : le tabac est sous-compté (un bar-tabac est codé en débit de boissons et reste donc dans « Cafés, hôtels, restaurants »), et la sous-famille « Rééducation, appareillage et pédicures-podologues » réunit ces trois métiers sans permettre d'en isoler un seul. Le détail des codes NAF de chaque sous-famille est dans le guide « Zone de chalandise », section Activités, avec ses hypothèses et limites. La zone se décrit d'UNE seule façon : soit minutes (1 à 30) de trajet depuis le centre, avec mode car (voiture, défaut), walking ou cycling ; soit radius_km (1 à 50) à vol d'oiseau. Avec minutes et mode car, traffic choisit les conditions : free (défaut, circulation libre) ou peak (heure de pointe du matin, un jour ouvré vers 08:30 — vitesses typiques modélisées par classe de voie et densité, pas de trafic temps réel). peak est refusé à pied et à vélo, et peut répondre « indisponible » si la plateforme ne l'a pas encore ouvert. Le centre est SOIT une adresse libre (address, un nom de commune suffit), SOIT un couple lat+lon WGS84 — jamais les deux ; point_central.precision dit comment il a été résolu. Plafond de surface : 10 000 km². Une zone sans habitant (mer, étranger) rend des zéros, pas une erreur. Plan minimum : Growth ; un appel compté quelle que soit la portée. attribution accompagne tout chiffre cité (INSEE Filosofi, IGN Contours IRIS ; SIRENE (INSEE) pour les établissements du bloc activites ; DGFiP DVF pour les prix immobiliers ; OpenStreetMap ODbL quand la portée est une durée).

ParametersJSON Schema
NameRequiredDescriptionDefault
latNoLatitude WGS84 du centre, avec `lon` et sans `address`.
lonNoLongitude WGS84 du centre, avec `lat` et sans `address`.
modeNoMode de déplacement de l'isochrone : `car` (défaut), `walking` ou `cycling` — avec `minutes` seulement.
addressNoCentre par adresse libre — un nom de commune suffit. Exclusif de `lat`/`lon`.
minutesNoPortée isochrone : minutes de trajet depuis le centre (1 à 30). Exclusif de `radius_km`.
trafficNoConditions de circulation de l'isochrone : `free` (défaut) ou `peak` (heure de pointe modélisée) — avec `minutes` et `mode: car` seulement.
radius_kmNoPortée rayon à vol d'oiseau, en km (1 à 50). Exclusif de `minutes`.
referenceNoRéférentiel des indices — UN réglage pour DEUX blocs, `csp` et `activites` : `france` (défaut) ou `department` (département dominant de la zone).
coefficientNoPart du revenu disponible que le secteur capte (0 exclu à 1) ; déclenche `potentiel_theorique`.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, destructiveHint=false. The description adds extensive behavioral context: estimates vs measures, rounding behavior, null semantics, fiabilite fields, secret statistique imputation, DVF coverage gaps, NAF limitations, and the fact that zero inhabitants returns zeros not errors. It also warns against misinterpreting indices and reconstructing them. This far exceeds what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely long and dense, covering many blocks and edge cases. It is well-structured with clear block names and version markers, but it is far from concise. Every sentence adds value, but the sheer volume makes it hard to parse quickly. It is front-loaded with the core purpose, but the later blocks (immobilier, activites) are lengthy. A 3 reflects that it earns its length but is not concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (9 optional parameters, many output blocks, multiple version-dependent fields, estimation caveats), the description is remarkably complete. It covers return values, null semantics, fiabilite fields, reference handling, and usage constraints. The output schema exists, so return values are documented, but the description adds the interpretation guidance that an agent needs to use the data correctly. Nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 all 9 parameters. The description adds meaningful context beyond the schema: the exclusivity rules (address vs lat/lon, minutes vs radius_km), the traffic=peak modeling details, the coefficient semantics with a concrete example (restauration ≈ 0.048), and the reference parameter affecting both csp and activites blocks. It doesn't repeat the schema verbatim but enriches it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a clear statement of what the tool returns: INSEE statistics about people living in a catchment zone, listing the main fields. It distinguishes itself from siblings by focusing on zone statistics rather than routing or address/company search. The title and description align well.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly explains how to define the zone (minutes+mode+traffic vs radius_km, address vs lat/lon), when to use which parameter, and what happens with edge cases (no inhabitants, peak unavailable). It also mentions the plan minimum and that one call counts regardless of scope. It doesn't explicitly name sibling alternatives, but the parameter guidance is thorough and the tool's scope is clear.

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. 2 tool updates
    • Changedzone_compare1 field changed
      • changedInput schema / properties / reference / description
        Previous value: -"Référentiel de l'indice d'affinité CSP de chaque zone : `france` (défaut) ou `department`."New value: +"Référentiel des indices de chaque zone — UN réglage pour DEUX blocs, `csp` et `activites` : `france` (défaut) ou `department`."
    • Changedzone_stats1 field changed
      • changedInput schema / properties / reference / description
        Previous value: -"Référentiel de l'indice d'affinité CSP : `france` (défaut) ou `department` (département dominant de la zone)."New value: +"Référentiel des indices — UN réglage pour DEUX blocs, `csp` et `activites` : `france` (défaut) ou `department` (département dominant de la zone)."
  2. 11 tool updates
    • Changedcompute_route8 fields changed
      • changedInput schema / properties / destination / description
        Previous value: -"A ``RoutePoint`` is EITHER a free-text ``address`` OR a ``lat``/``lon`` couple\n(mutually exclusive), mirroring trusty-service's ``RouteEndpointInput``."New value: +"Point d'arrivée : adresse libre OU couple `lat`/`lon`."
      • addedInput schema / properties / destination / properties / lat / description
        Added value: +"Latitude WGS84, avec `lon` (XOR address)."
      • addedInput schema / properties / destination / properties / lon / description
        Added value: +"Longitude WGS84, avec `lat` (XOR address)."
      • addedInput schema / properties / mode / description
        Added value: +"Mode de déplacement : `car` (défaut), `walking` ou `cycling`."
      • changedInput schema / properties / origin / description
        Previous value: -"A ``RoutePoint`` is EITHER a free-text ``address`` OR a ``lat``/``lon`` couple\n(mutually exclusive), mirroring trusty-service's ``RouteEndpointInput``."New value: +"Point de départ : adresse libre OU couple `lat`/`lon`."
      • addedInput schema / properties / origin / properties / lat / description
        Added value: +"Latitude WGS84, avec `lon` (XOR address)."
      • addedInput schema / properties / origin / properties / lon / description
        Added value: +"Longitude WGS84, avec `lat` (XOR address)."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "type": "object"
        +}
    • Changedget_address_details2 fields changed
      • addedInput schema / properties / address_id / description
        Added value: +"Identifiant d'adresse (champ `id`) renvoyé par verify_address ou search_address."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "type": "object"
        +}
    • Changedget_company_details2 fields changed
      • addedInput schema / properties / company_id / description
        Added value: +"SIRET (14 chiffres) de l'établissement, ou SIREN (9 chiffres) pour le siège de l'entreprise."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "type": "object"
        +}
    • Changedroute_matrix8 fields changed
      • addedInput schema / properties / destinations / description
        Added value: +"Points d'arrivée (1 à 25), même forme."
      • addedInput schema / properties / destinations / items / properties / lat / description
        Added value: +"Latitude WGS84, avec `lon` (XOR address)."
      • addedInput schema / properties / destinations / items / properties / lon / description
        Added value: +"Longitude WGS84, avec `lat` (XOR address)."
      • addedInput schema / properties / mode / description
        Added value: +"Mode de déplacement : `car` (défaut), `walking` ou `cycling`."
      • addedInput schema / properties / origins / description
        Added value: +"Points de départ (1 à 25), chacun une adresse libre OU un couple `lat`/`lon`."
      • addedInput schema / properties / origins / items / properties / lat / description
        Added value: +"Latitude WGS84, avec `lon` (XOR address)."
      • addedInput schema / properties / origins / items / properties / lon / description
        Added value: +"Longitude WGS84, avec `lat` (XOR address)."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "type": "object"
        +}
    • Changedsearch_address4 fields changed
      • addedInput schema / properties / details / description
        Added value: +"Inclure les blocs détaillés (position GPS et Lambert 93, IRIS, grille statistique — selon le plan). Défaut vrai."
      • addedInput schema / properties / limit / description
        Added value: +"Nombre maximal de résultats (défaut 10)."
      • addedInput schema / properties / query / description
        Added value: +"Début d'adresse ou adresse partielle à compléter (numéro, voie, commune…)."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "type": "object"
        +}
    • Changedsearch_company14 fields changed
      • addedInput schema / properties / address / description
        Added value: +"Filtre sur la voie (recherche floue) ; exige `query`."
      • addedInput schema / properties / city / description
        Added value: +"Filtre sur la commune (recherche floue) ; exige `query`."
      • addedInput schema / properties / group_by_company / description
        Added value: +"Vrai : un résultat par entreprise (son meilleur établissement, le siège de préférence) ; faux : un par établissement. Absent : défaut de l'API selon la recherche."
      • addedInput schema / properties / lat / description
        Added value: +"Recherche par proximité (plan Growth) : latitude WGS84 du centre, avec `lon` et `radius_m`."
      • addedInput schema / properties / lon / description
        Added value: +"Longitude WGS84 du centre de la recherche par proximité, avec `lat` et `radius_m`."
      • addedInput schema / properties / naf_code / description
        Added value: +"Filtre : code NAF/APE de l'activité, ex. `62.02A`."
      • addedInput schema / properties / page / description
        Added value: +"Numéro de page, à partir de 1."
      • addedInput schema / properties / per_page / description
        Added value: +"Résultats par page (défaut 10, plafond 25)."
      • addedInput schema / properties / postal_code / description
        Added value: +"Filtre : code postal exact."
      • addedInput schema / properties / query / description
        Added value: +"Nom, dénomination, sigle ou enseigne ; un SIREN (9 chiffres) ou un SIRET (14 chiffres) donne une correspondance exacte."
      • addedInput schema / properties / radius_m / description
        Added value: +"Rayon en mètres autour du centre (jusqu'à 50 km) ; plan Growth."
      • addedInput schema / properties / siren / description
        Added value: +"Tous les établissements d'une unité légale (SIREN, 9 chiffres)."
      • addedInput schema / properties / status / description
        Added value: +"Filtre : `active` (établissement en activité) ou `closed` (fermé)."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "type": "object"
        +}
    • Changedsearch_locality11 fields changed
      • addedInput schema / properties / department_code / description
        Added value: +"Filtre : codes de département (liste, ex. `62`, `2A`). À préférer au nom."
      • addedInput schema / properties / department_name / description
        Added value: +"Filtre : noms de département (liste ; orthographe normalisée automatiquement)."
      • addedInput schema / properties / details / description
        Added value: +"Inclure les détails de chaque commune (codes, population, coordonnées). Défaut vrai."
      • addedInput schema / properties / limit / description
        Added value: +"Nombre maximal de résultats (défaut 20)."
      • addedInput schema / properties / population_max / description
        Added value: +"Filtre : population maximale (habitants)."
      • addedInput schema / properties / population_min / description
        Added value: +"Filtre : population minimale (habitants)."
      • addedInput schema / properties / postal_code / description
        Added value: +"Filtre : codes postaux (liste)."
      • addedInput schema / properties / query / description
        Added value: +"Nom de commune, code postal ou code INSEE, complet ou partiel. Optionnel si un filtre est donné."
      • addedInput schema / properties / region_code / description
        Added value: +"Filtre : codes de région (liste)."
      • addedInput schema / properties / region_name / description
        Added value: +"Filtre : noms de région (liste)."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "type": "object"
        +}
    • Changedsearch_nearby7 fields changed
      • addedInput schema / properties / address / description
        Added value: +"Centre par adresse libre (un nom de commune suffit). Exclusif de `lat`/`lon`."
      • addedInput schema / properties / lat / description
        Added value: +"Latitude WGS84 du centre, avec `lon` et sans `address`."
      • addedInput schema / properties / limit / description
        Added value: +"Nombre de résultats par page (défaut 10, plafond 50)."
      • addedInput schema / properties / lon / description
        Added value: +"Longitude WGS84 du centre, avec `lat` et sans `address`."
      • addedInput schema / properties / offset / description
        Added value: +"Décalage de pagination : reprendre à `pagination.next_offset` de la réponse précédente."
      • addedInput schema / properties / radius_m / description
        Added value: +"Rayon de recherche en mètres autour du centre."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "type": "object"
        +}
    • Changedverify_address4 fields changed
      • addedInput schema / properties / address / description
        Added value: +"Adresse postale française en texte libre, telle que saisie (fautes, abréviations et accents manquants tolérés)."
      • addedInput schema / properties / details / description
        Added value: +"Inclure les blocs détaillés (position GPS et Lambert 93, IRIS, grille statistique — selon le plan). Défaut vrai."
      • addedInput schema / properties / max_results / description
        Added value: +"Nombre maximal de candidats renvoyés (défaut 5)."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "type": "object"
        +}
    • Changedzone_compare7 fields changed
      • addedInput schema / properties / coefficient / description
        Added value: +"Part du revenu disponible que le secteur capte (0 exclu à 1), appliquée à toutes les zones, exclusifs et paires ; requis par les critères de potentiel."
      • addedInput schema / properties / rank_by / description
        Added value: +"Critère du classement : `population` (défaut), `exclusive_population`, `theoretical_potential` ou `exclusive_potential` — ces deux derniers exigent `coefficient`."
      • addedInput schema / properties / reference / description
        Added value: +"Référentiel de l'indice d'affinité CSP de chaque zone : `france` (défaut) ou `department`."
      • addedInput schema / properties / zones / description
        Added value: +"De 2 à 10 zones, chacune avec les arguments de zone_stats (centre + `minutes` ou `radius_km`) et un `id` optionnel."
      • addedInput schema / properties / zones / items / properties / lat / description
        Added value: +"Latitude WGS84 du centre, avec `lon` et sans `address`."
      • addedInput schema / properties / zones / items / properties / lon / description
        Added value: +"Longitude WGS84 du centre, avec `lat` et sans `address`."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "type": "object"
        +}
    • Changedzone_stats10 fields changed
      • addedInput schema / properties / address / description
        Added value: +"Centre par adresse libre — un nom de commune suffit. Exclusif de `lat`/`lon`."
      • addedInput schema / properties / coefficient / description
        Added value: +"Part du revenu disponible que le secteur capte (0 exclu à 1) ; déclenche `potentiel_theorique`."
      • addedInput schema / properties / lat / description
        Added value: +"Latitude WGS84 du centre, avec `lon` et sans `address`."
      • addedInput schema / properties / lon / description
        Added value: +"Longitude WGS84 du centre, avec `lat` et sans `address`."
      • addedInput schema / properties / minutes / description
        Added value: +"Portée isochrone : minutes de trajet depuis le centre (1 à 30). Exclusif de `radius_km`."
      • addedInput schema / properties / mode / description
        Added value: +"Mode de déplacement de l'isochrone : `car` (défaut), `walking` ou `cycling` — avec `minutes` seulement."
      • addedInput schema / properties / radius_km / description
        Added value: +"Portée rayon à vol d'oiseau, en km (1 à 50). Exclusif de `minutes`."
      • addedInput schema / properties / reference / description
        Added value: +"Référentiel de l'indice d'affinité CSP : `france` (défaut) ou `department` (département dominant de la zone)."
      • addedInput schema / properties / traffic / description
        Added value: +"Conditions de circulation de l'isochrone : `free` (défaut) ou `peak` (heure de pointe modélisée) — avec `minutes` et `mode: car` seulement."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "type": "object"
        +}
  3. 4 tool updates
    • Changedcompute_route2 fields changed
      • addedInput schema / properties / destination / description
        Added value: +"A ``RoutePoint`` is EITHER a free-text ``address`` OR a ``lat``/``lon`` couple\n(mutually exclusive), mirroring trusty-service's ``RouteEndpointInput``."
      • addedInput schema / properties / origin / description
        Added value: +"A ``RoutePoint`` is EITHER a free-text ``address`` OR a ``lat``/``lon`` couple\n(mutually exclusive), mirroring trusty-service's ``RouteEndpointInput``."
    • Changedroute_matrix2 fields changed
      • addedInput schema / properties / destinations / items / description
        Added value: +"A ``RoutePoint`` is EITHER a free-text ``address`` OR a ``lat``/``lon`` couple\n(mutually exclusive), mirroring trusty-service's ``RouteEndpointInput``."
      • addedInput schema / properties / origins / items / description
        Added value: +"A ``RoutePoint`` is EITHER a free-text ``address`` OR a ``lat``/``lon`` couple\n(mutually exclusive), mirroring trusty-service's ``RouteEndpointInput``."
    • Addedzone_compare
    • Changedzone_stats2 fields changed
      • addedInput schema / properties / coefficient
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedInput schema / properties / reference
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
  4. 1 tool update
    • Changedzone_stats1 field changed
      • addedInput schema / properties / traffic
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
  5. 1 tool update
    • Addedzone_stats
  6. 2 tool updates
    • Changedcompute_route1 field changed
      • addedInput schema / properties / mode
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
    • Changedroute_matrix1 field changed
      • addedInput schema / properties / mode
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
  7. 2 tool updates
    • Addedget_company_details
    • Addedsearch_company
  8. 7 tool updates
    • First observedcompute_route
    • First observedget_address_details
    • First observedroute_matrix
    • First observedsearch_address
    • First observedsearch_locality
    • First observedsearch_nearby
    • First observedverify_address

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Provides access to France's official keyless geocoding API (Base Adresse Nationale) for address lookup and reverse geocoding.
    135 npm
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Access 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
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.