Skip to main content
Glama

Server Details

French public-data MCP: cross-ref health, health centers, INSEE demographics, business & geo.

Status
Healthy
Last Tested
Transport
Streamable HTTP
URL
Repository
cturkieh/france-data-mcp
GitHub Stars
1
Server Listing
France Data MCP

Glama MCP Gateway

Connect through Glama MCP Gateway for full control over tool access and complete visibility into every call.

MCP client
Glama
MCP server

Full call logging

Every tool call is logged with complete inputs and outputs, so you can debug issues and audit what your agents are doing.

Tool access control

Enable or disable individual tools per connector, so you decide what your agents can and cannot do.

Managed credentials

Glama handles OAuth flows, token storage, and automatic rotation, so credentials never expire on your clients.

Usage analytics

See which tools your agents call, how often, and when, so you can understand usage patterns and catch anomalies.

100% free. Your data is private.
Tool DescriptionsA

Average 4.5/5 across 31 of 31 tools scored. Lowest: 3.7/5.

Server CoherenceA
Disambiguation5/5

Each tool has a clearly distinct purpose, with detailed descriptions and caveats to avoid confusion. Overlapping tools are explicitly differentiated (e.g., Ameli vs RPPS based professional tools, or centres_sante vs etablissement).

Naming Consistency3/5

Tool names are a mix of French and English, and follow varying patterns (verb_noun, noun_by_noun, etc.). Some names are long and inconsistent (e.g., 'compare_adresse_cnam_vs_finess' vs 'autocomplete_commune'), making them less predictable.

Tool Count2/5

With 31 tools, the surface is large. While the domain is broad, many tools could be consolidated via parameters or better structured. The count exceeds the typical well-scoped MCP server range (3-15).

Completeness4/5

The tool set covers a wide range of French health data needs: communes, establishments, professionals, companies, geocoding, health indicators, and data freshness. Minor gaps exist (e.g., no direct pharmacy tool, but covered by family filter), but overall it is comprehensive.

Available Tools

34 tools
autocomplete_communeA
Read-onlyIdempotent
Inspect

Recherche de communes françaises par nom, code postal ou code INSEE. Idéal pour autocomplétion. Source : geo.api.gouv.fr (DINUM/Etalab).

Un (au moins) parmi nom, codePostal, code est requis. Alias acceptés : q/query/searchnom, codepostal/postal_codecodePostal, code_insee/inseecode.

ParametersJSON Schema
NameRequiredDescriptionDefault
nomNoRecherche par nom (autocomplétion). Ex: "Villeneuve d'Ascq", "Lyon".
codeNoCode INSEE exact (5 caractères). Ex: "59009".
limitNoNombre max de résultats (1-30, défaut 10).
codePostalNoCode postal exact (5 chiffres). Ex: "59650".
boostPopulationNoTrier par population décroissante. Recommandé pour les noms ambigus (ex: 'Charleville').
Behavior3/5

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

Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false, fully covering behavioral expectations. The description adds the data source (geo.api.gouv.fr) but no additional behavioral traits.

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 two short sentences, front-loaded with the core purpose, and contains no superfluous information. Every word earns its place.

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?

For a simple search tool with no output schema, the description covers the search dimensions and data source. It does not specify what fields are returned, but the schema provides some hints. Minor gap for a fully self-contained description.

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 coverage is 100%, each parameter is described. The description adds no extra meaning beyond summarizing search criteria (nom, code postal, code INSEE). Baseline 3 applies as 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 clearly states it searches French communes by name, postal code, or INSEE code, and explicitly says it's ideal for autocompletion. This distinguishes it from sibling tools like get_commune_by_code (exact lookup) or health-professional tools.

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 says 'Idéal pour autocomplétion' and mentions the boostPopulation parameter for ambiguous names, providing context for use. However, it does not explicitly state when not to use it or compare to alternatives.

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

centres_sante_by_finessA
Read-onlyIdempotent
Inspect

Récupère le détail d'un Centre de Santé (CDS) par son numéro FINESS. Différenciateur métier vs etablissement_by_finess : expose carte_vitale, APCV, et spécialités exercées sur place (Annexe A CNAM). Retourne un LookupResult discriminé par found.

found: true → payload CDS complet (raison sociale, accepte_carte_vitale/apcv, specialites.codes/libelles alignés, type_etab 124/125, adresse, coords centroïde commune, telephone). found: false{found: false, key, lookupStatus: 'not_found', message} quand le numéro FINESS pointe vers une structure non-CDS (hôpital, EHPAD, labo) ou un CDS très récent (CNAM latence ~1 sem).

Source : Annuaire santé Ameli, Assurance Maladie (sync hebdomadaire CNAM, mention obligatoire L.1461-2 CSP). Pour les structures non-CDS, utiliser etablissement_by_finess.

Alias acceptés : numFiness/finess/etab_finessnum_finess.

ParametersJSON Schema
NameRequiredDescriptionDefault
num_finessYesNuméro FINESS exact 9 chiffres. Ex: '750000123'.
include_freshnessNoSi true, ajoute un champ `data_freshness` au payload (dans `query_metadata` si présent, sinon à la racine) listant la dernière ingestion réussie par source (FINESS, Ameli, RPPS, CDS) avec `staleness_days`. Opt-in pour ne pas alourdir les payloads par défaut. Cache 5min côté serveur — coût négligeable.

Output Schema

ParametersJSON Schema
NameRequiredDescription
keyNoClé recherchée (SIREN, num_finess, code INSEE, …).
foundYes
messageNoExplication actionnable quand `found=false` (cause probable + remédiation).
lookupStatusYes
Behavior5/5

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

The description adds significant behavioral context beyond annotations: the discriminated `LookupResult` response, explicit failure modes, cache behavior (5min server-side), data freshness opt-in, and legal source attribution. Annotations already indicate read-only and idempotent, but the description enriches this.

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 well-structured and contains all essential information, but is slightly verbose with repeated explanations of the `found` states. Minor trimming could improve conciseness without losing clarity.

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, the description adequately covers the behavior: payload overview for found cases, failure messages, source and sync details, cache, alias, and data freshness options. No gaps for a fetch-by-ID tool.

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?

100% schema parameter coverage is already present, but the description adds value by specifying the exact 9-digit format for `num_finess`, listing accepted aliases, and explaining the opt-in nature and behavior of `include_freshness`.

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 retrieves details of a health center (CDS) by FINESS number. It distinguishes itself from the sibling `etablissement_by_finess` by highlighting the specific CDS-related fields it exposes (carte_vitale, APCV, specialites).

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?

Explicit guidance is provided on when to use this tool vs. `etablissement_by_finess` for non-CDS structures. It also explains the `found: false` scenario for non-CDS or very recent CDS, and mentions the data source and sync frequency.

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

centres_sante_in_radiusA
Read-onlyIdempotent
Inspect

Recherche des Centres de Santé (CDS) dans un rayon géographique (PostGIS ST_DWithin). Source : Annuaire santé Ameli, Assurance Maladie (mention obligatoire L.1461-2 CSP — sync hebdomadaire CNAM). Différenciateur métier vs etablissements_finess_in_radius filtré famille=124 : expose carte_vitale, APCV, spécialités exercées sur place (Annexe A nomenclature CNAM, ~70 codes).

CDS = structures de soins ambulatoires non lucratives encadrées L.6323-1 CSP (associations, mutuelles, communes, hôpitaux). Volume ~3K en France. Filtres :

  • specialite_codes : array Annexe A (ex: ['01'] médecine générale, ['53'] dentaire). Match any-of — retourne les CDS qui exercent AU MOINS UNE des spécialités demandées.

  • accepte_carte_vitale : true / false / omis. Quasi-totalité accepte CV en pratique → filtre surtout utile en false pour audits.

  • type_etab_codes : ['124'] CDS standard, ['125'] CDS dentaire (deprecated CNAM, en voie d'extinction).

Coords = centroïde commune (~3 km moyenne) — pour précision adresse, pivoter via etab_finess retourné avec etablissement_by_finess. PAS d'horaires/tarifs/secteur 1/2 (retirés du nouvel annuaire CNAM post-2025).

Alias acceptés : radius/radius_metersradius_km, latitude/longitudelat/lon.

ParametersJSON Schema
NameRequiredDescriptionDefault
latYesLatitude du centre (WGS84). Ex: 48.872 (Paris).
lonYesLongitude du centre (WGS84). Ex: 2.317 (Paris).
limitNoNombre max de résultats (1-500, défaut 100).
radius_kmNoRayon en km (0.1-50, défaut 5).
type_etab_codesNoCodes type établissement Annexe B : ['124'] CDS standard (défaut implicite), ['125'] CDS dentaire deprecated. Vide = tous types.
specialite_codesNoCodes spécialité CNAM Annexe A (ex: ['01'] médecine générale, ['53'] chirurgien-dentiste). Match any-of. Vide = pas de filtre spécialité.
include_freshnessNoSi true, ajoute un champ `data_freshness` au payload (dans `query_metadata` si présent, sinon à la racine) listant la dernière ingestion réussie par source (FINESS, Ameli, RPPS, CDS) avec `staleness_days`. Opt-in pour ne pas alourdir les payloads par défaut. Cache 5min côté serveur — coût négligeable.
accepte_carte_vitaleNoFiltre par acceptation carte Vitale. true = uniquement CDS qui acceptent CV, false = uniquement ceux qui ne l'acceptent pas. Omis = pas de filtre.

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYesNombre d'entrées retournées dans `results` (post-troncature).
totalNoEffectif réel avant troncature. Présent sur les tools de nomenclature paginés (lister_*) : `count` = échantillon, `total` = total réel, re-appeler avec un `limit` supérieur si `truncated`.
resultsYesEntrées métier (shape spécifique au tool, cf. description du tool).
freshnessNoFraîcheur des sources (présent si `include_freshness: true`).
perimetreNoLentille de la source : ce que le comptage inclut/exclut. Lire `completeness_note` et la restituer au lecteur final.
truncatedNotrue si le total réel dépasse `limit` (re-paginer via `offset` si supporté, ou augmenter `limit` sur les lister_*). Optional sur les tools de listing exhaustif (lister_*).
query_metadataNoMetadata de la query (radius_km, departement, filtres appliqués, …).
activite_hebergeeNoCompte juxtaposé des sites hébergeant l'activité correspondant à la famille filtrée, sous une autre catégorie FINESS. Distinct du `count` principal — lire `note` pour comprendre la sémantique et ne JAMAIS additionner les deux comptes sans préciser leur nature.
Behavior5/5

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

Annotations already indicate read-only, idempotent, non-destructive. Description adds source (Ameli), sync frequency, coordinate centroid approximation (~3km), and absence of hours/tariffs/secteur. 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.

Conciseness4/5

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

Description is well-structured with clear sections (purpose, source, differentiation, filter details), though slightly dense. Every sentence adds value; could be slightly tighter but still excellent.

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?

With output schema present, description covers all necessary context: data source, filter behavior, coordinate precision, cache, and relationship to sibling tools. Comprehensive for a complex parameter set.

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?

Schema coverage is 100%, but description adds significant value: explains any-of logic for `specialite_codes`, practical note on `accepte_carte_vitale`, `type_etab_codes` deprecation, `include_freshness` cost, and aliases for coordinates and radius.

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?

Description clearly states 'Recherche des Centres de Santé (CDS) dans un rayon géographique' and distinguishes from sibling `etablissements_finess_in_radius` by listing specific fields (carte_vitale, APCV, spécialités).

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 differentiates from `etablissements_finess_in_radius` and advises pivoting to `etablissement_by_finess` for precise address. Also notes filter semantics and deprecated codes.

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

compare_adresse_cnam_vs_finessA
Read-onlyIdempotent
Inspect

Compare l'adresse d'un centre de santé côté CNAM (Annuaire santé Ameli) vs FINESS DREES pour un même num_finess. Primitive brute SANS interprétation métier — retourne les deux adresses, un score_dice (0..1, informatif ; null si non comparable car finess_absent) et un statut. Le caller décide quoi faire de la divergence.

Utilité : signaler un déménagement propagé par une source mais pas (encore) par l'autre (ex: CNAM '5 RUE DE L'ARQUEBUSE AUTUN' vs FINESS '15 BD BERNARD GIBERSTEIN AUTUN' pour le même FINESS). Équivalent côté centre de santé de compare_raison_sociale_finess_vs_rpps.

Statut (présent uniquement sur found: true) :

  • match : adresses strictement égales après normalisation

  • match_after_abbreviation_normalization : égales après expansion des abréviations de voie FR (R/RUE, BD/BOULEVARD, AV/AVENUE…) — MÊME adresse, simple abréviation DREES vs CNAM, PAS un déménagement

  • divergent_after_normalization : adresses réellement différentes (déménagement non synchronisé entre sources)

  • finess_absent : le CDS existe côté CNAM mais le num_finess est absent de FINESS DREES (latence sync bimensuelle)

Format : objet LookupResult discriminé par found. Si le num_finess n'est PAS un centre de santé CNAM, le tool retourne {found: false, lookupStatus: 'not_found', message} (utiliser etablissement_by_finess pour un établissement non-CDS).

ParametersJSON Schema
NameRequiredDescriptionDefault
num_finessYesNuméro FINESS exact (9 chiffres).

Output Schema

ParametersJSON Schema
NameRequiredDescription
keyNoClé recherchée (SIREN, num_finess, code INSEE, …).
foundYes
messageNoExplication actionnable quand `found=false` (cause probable + remédiation).
lookupStatusYes
Behavior5/5

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

Annotations already declare readOnly, idempotent, openWorld, and not destructive. The description adds significant context: it is a raw primitive without business interpretation, explains the statut values (match, divergent_after_normalization, finess_absent), score_dice range, and the discriminated result object. 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 well-structured with a clear first sentence stating the main purpose, followed by usage example and statut explanations. It is slightly lengthy but every sentence adds value. Could be marginally trimmed without loss.

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 presence of an output schema (LookupResult), the description fully covers return semantics, error cases, and ties to sibling tools. No gaps remain for an agent to understand selection and 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?

The single parameter `num_finess` is fully described in the schema with '9 chiffres'. The description adds context about usage (e.g., if not a CDS, result is not found) but does not add new parameter-level details beyond that. Given 100% schema coverage, the additional context justifies a 4.

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 compares addresses of a health center from two sources (CNAM vs FINESS) for the same num_finess. It uses specific verbs and resources, and distinguishes itself from the sibling tool 'compare_raison_sociale_finess_vs_rpps'.

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 provides explicit when-to-use (signaling unsynchronized moves) and when-not-to-use (if num_finess not a CNAM center, use `etablissement_by_finess`). It also explains the return format and how to interpret results.

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

compare_raison_sociale_finess_vs_rppsA
Read-onlyIdempotent
Inspect

Compare la raison sociale FINESS DREES vs RPPS / Annuaire Santé ANS pour un même num_finess. Primitive brute SANS interprétation métier — retourne juste les deux libellés + un statut de comparaison. Le caller décide quoi faire de la divergence.

Utilité : RPPS reflète souvent plus rapidement les rebrandings post-M&A que FINESS DREES (ex: un site racheté reste 'DIAGNOVIE' chez DREES alors qu'il est déjà 'BIOGROUP NORD' chez l'ANS). Ce tool expose la divergence factuelle ; il NE DIT PAS qui a racheté qui (ça repose sur de la connaissance d'enseignes commerciales non publique).

Statut renvoyé (champ statut présent uniquement sur la branche found: true) :

  • exact_match : FINESS et ≥1 RPPS sont strictement égaux après normalisation

  • divergent_after_normalization : aucune RPPS ne matche FINESS — vraie divergence

  • rpps_absent : aucune RPPS n'a déclaré ce FINESS (pivot impossible)

Format : objet LookupResult discriminé par found. Quand num_finess est absent de FINESS DREES, le tool retourne {found: false, lookupStatus: 'not_found', message, ...} — il n'y a PAS de champ statut dans ce cas.

ParametersJSON Schema
NameRequiredDescriptionDefault
num_finessYesNuméro FINESS exact (9 chiffres).

Output Schema

ParametersJSON Schema
NameRequiredDescription
keyNoClé recherchée (SIREN, num_finess, code INSEE, …).
foundYes
messageNoExplication actionnable quand `found=false` (cause probable + remédiation).
lookupStatusYes
Behavior5/5

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

Annotations already indicate read-only, idempotent, non-destructive behavior. The description adds substantial value by detailing the return format (discriminated union with 'found' and conditional 'statut'), explaining status values ('exact_match', 'divergent_after_normalization', 'rpps_absent'), and stating the behavior when num_finess is absent from FINESS DREES. This 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.

Conciseness4/5

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

The description is well-structured with a clear purpose, usage hint, and bulletized status explanations. It front-loads the main purpose and adds necessary detail without fluff. Slightly verbose but every sentence contributes value.

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 (comparing two data sources, multiple status conditions, discriminated output), the description covers all essential aspects: what it does, when it's useful, what it returns in each case, and what it avoids. The presence of an output schema (not shown) further complements completeness.

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 coverage is 100% (parameter 'num_finess' described as 9-digit exact number). The description does not add new semantic information about the parameter beyond what the schema already provides. Baseline score of 3 is appropriate.

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 compares 'raison sociale' from FINESS DREES and RPPS for a given FINESS number. It distinguishes itself from sibling tools like 'etablissement_by_finess' and 'professionnel_by_rpps' by focusing on cross-reference comparison. The verb 'compare' and the specific data sources are explicit.

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 context for usage: it explains that RPPS reflects rebrandings faster than FINESS DREES, and explicitly states that the tool does not interpret the divergence (leaves decision to caller). It also clarifies what the tool does NOT do (e.g., not saying who bought whom). However, it does not mention alternative tools or 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.

data_freshnessA
Read-only
Inspect

Retourne la fraîcheur des dumps de données ingérés côté serveur : FINESS DREES (bimestriel), Annuaire Santé Ameli (hebdomadaire), RPPS / Annuaire Santé ANS (mensuel), Centres de Santé CNAM (hebdomadaire). Pour chaque source : last_success_at ISO timestamp, last_success_row_count, last_attempt_at, last_attempt_status, staleness_days (jours depuis la dernière ingestion réussie), cadence_hint (cadence attendue côté éditeur).

Usage typique : avant un audit territorial ou une analyse temporelle, le caller appelle ce tool pour savoir si les données sont à jour. Une staleness_days > 90 côté FINESS = alerte (dernier sync DREES manqué), > 14 côté Ameli = alerte (job hebdo cassé), > 45 côté RPPS = alerte (job mensuel cassé), > 14 côté CDS = alerte (job hebdo cassé).

Les sources LIVE (DINUM Recherche Entreprises, INSEE SIRENE V3.11, ANS FHIR live) ne sont PAS listées ici puisqu'elles n'ont pas de cycle d'ingestion — leur fraîcheur est celle des API amont (live, ~secondes).

Cache serveur : 5 minutes. Coût : 1 SELECT sur ingest_log au pire (sinon hit cache).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
sourcesYes
Behavior5/5

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

Beyond annotations (readOnlyHint, openWorldHint), the description adds cache behavior (5-minute cache), cost (1 SELECT or cache hit), and notes that live sources are excluded. No contradictions 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 concise but slightly verbose. It lists fields and usage in a single paragraph, which is informative but could be structured more clearly with bullet points. Still efficient.

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 tool with no parameters and no output schema provided, the description fully covers the return fields, usage context, and alert thresholds. It compensates for missing output schema details and is complete for an agent to use 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?

No parameters exist (schema coverage 100%). The description does not need to explain parameters, and the baseline score of 4 applies due to zero 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 clearly states the tool returns the freshness of ingested data dumps for specific sources (FINESS DREES, Annuaire Santé Ameli, RPPS/ANS). It lists the returned fields and explicitly excludes live sources, making its purpose distinct from sibling tools.

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?

Provides typical use cases (before territorial audit or temporal analysis) and gives alert thresholds for staleness per source. However, it does not explicitly contrast with sibling tools or state when not to use it, though the exclusion of live sources implies a boundary.

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

densite_santeA
Read-onlyIdempotent
Inspect

Densité de santé pour 100 000 habitants — cible: professionnels (RPPS) OU cible: etablissements (FINESS). Niveau département (code_dept) OU commune (code_insee / nom_commune). Exactement un scope des trois requis. Croise le count (RPPS ou FINESS) et INSEE Melodi (population municipale PMUN, recensement 2023).

cible='professionnels' (RPPS) — méthodo DREES par défaut : médecins (profession_code='10') en activité régulière (mode_exercice L, S, M), hors étudiants. Filtres : profession_code (60 infirmier, 21 pharmacien, 50 sage-femme…), savoir_faire_code (ex 'SM04' Cardiologie — 'SM02' = Anesthésie-réanimation ; voir lister_nomenclature referentiel rpps_savoir_faire), mode_exercice_codes (['L'] = libéraux seuls).

cible='etablissements' (FINESS) — famille OBLIGATOIRE : labo, pharmacie, ehpad, mco, ssr, psychiatrie, dialyse, imagerie, had, msp_cpts, handicap_enfants, handicap_adultes, addictologie, pmi, prevention_sante, etc. Sans famille le ratio mélangerait labos/hôpitaux/EHPAD → non-sens.

Sémantique conditionnelle de code_dept : seul = scope de calcul (dept entier) ; combiné avec nom_commune = hint de résolution UNIQUEMENT (filtre les homonymes), le calcul reste sur la commune résolue.

Paris/Marseille/Lyon : densité par code_insee INDISPONIBLE (RPPS/FINESS rattachés aux arrondissements, INSEE n'expose la population qu'à la commune entière) → RangeError ; utiliser code_dept (75, 13, 69).

compare_national: true ajoute la densité France entière (DOM inclus) + écart en % (positif = sur-doté, négatif = sous-doté).

Alias : dept/departementcode_dept, codeInsee/inseecode_insee. Ne renvoie AUCUNE interprétation métier (pas de seuil "désert médical" auto). Catégorie par défaut : Civil (C, ~97 % — libéraux, salariés privés, hospitaliers contractuels). Opt-in : include_agents_publics: true ajoute Agents publics (M, ~0,3 % — PH titulaires, ARS, CNAM, Éducation nationale, PMI, militaires SSA) ; include_etudiants: true ajoute Étudiants (E, ~2,5 % — internes, externes, élèves IDE/SF). Réf : https://mos.esante.gouv.fr/NOS/TRE_R09-CategorieProfessionnelle/. ATTENTION nomenclatures : les codes ANS (profession_code, savoir_faire_code) sont une nomenclature DISTINCTE des codes Ameli (specialite_code, type_ps_code) — un même nombre désigne des choses différentes (ex: '10' = Médecin côté ANS, Neurochirurgien côté Ameli). Ne JAMAIS passer un code Ameli à un paramètre ANS : le filtre renverrait vide sans erreur. Découvrir les codes ANS via lister_nomenclature(referentiel:'rpps_savoir_faire'). Source : Annuaire Santé, Agence du Numérique en Santé (ANS) — Licence Ouverte v2.0

ParametersJSON Schema
NameRequiredDescriptionDefault
cibleYes`professionnels` = densité de PS (RPPS, filtres profession_code/savoir_faire_code/mode_exercice_codes) ; `etablissements` = densité d'établissements (FINESS, `famille` obligatoire).
familleNocible='etablissements' UNIQUEMENT (obligatoire) : famille FINESS à compter (labo, pharmacie, ehpad, mco, ssr, psychiatrie, dialyse, imagerie, had, msp_cpts, handicap_enfants, handicap_adultes, addictologie, pmi, prevention_sante, etc.).
code_deptNoCode INSEE du département 2-3 caractères. Ex: "75" Paris, "59" Nord, "2A" Corse-du-Sud, "971" Guadeloupe. Sémantique conditionnelle : seul = scope dept entier ; combiné avec `nom_commune` = hint resolver pour désambiguer les homonymes. XOR avec `code_insee`.
code_inseeNoCode INSEE de la commune 5 caractères. Ex: "59009" Villeneuve-d'Ascq, "33063" Bordeaux, "2A004" Ajaccio. Paris/Lyon/Marseille NON supporté au niveau commune (densité indisponible — voir description) : utiliser code_dept. XOR avec `code_dept` et `nom_commune`.
nom_communeNoNom officiel de commune (alternative à `code_insee`). Ex: "Lille", "Villeneuve-d'Ascq". Le serveur résout en interne via geo.api.gouv.fr. Combinable avec `code_dept` comme hint de désambiguïsation pour homonymes (ex "Saint-Martin" + dept "65"). XOR avec `code_insee`.
profession_codeNocible='professionnels' UNIQUEMENT : code profession ANS (TRE_R94). Default '10' (Médecin). Ex : '60' Infirmier, '21' Pharmacien, '50' Sage-femme, '40' Chirurgien-dentiste, '70' Masseur-kinésithérapeute.
compare_nationalNoAjoute le calcul France entière + écart relatif en % (recommandé pour qualifier 'sous-doté'/'sur-doté').
include_etudiantsNo
savoir_faire_codeNocible='professionnels' UNIQUEMENT : code spécialité (savoir_faire). Pertinent surtout pour profession_code=10 (médecin). Ex : 'SM04' Cardiologie, 'SM15' Dermatologie et vénéréologie, 'SM02' Anesthésie-réanimation, 'SM26' Médecine générale. Voir lister_nomenclature(referentiel:'rpps_savoir_faire') pour la liste exhaustive.
mode_exercice_codesNocible='professionnels' UNIQUEMENT : codes mode_exercice ANS à inclure. Default ['L','S','M'] (libéral + salarié + mixte = activité régulière DREES). Passer ['L'] pour libéraux seuls. Codes mode_exercice ANS : L libéral, S salarié, M mixte, R remplaçant, B bénévole, A autre.
include_agents_publicsNo
Behavior5/5

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

Beyond the readOnlyHint, openWorldHint, idempotentHint, and destructiveHint annotations, the description adds critical behavioral context: it warns of RangeError for Paris/Marseille/Lyon, silent empty results with wrong codes, default category (Civil), opt-in for agents publics/etudiants, and that no interpretation (e.g., 'desert medical') is returned.

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 detailed but well-structured with sections, bold key terms, and examples. It could be more concise without losing clarity, but the structure aids parsing.

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 (11 parameters, no output schema), the description covers all aspects: methodology, parameter constraints, limitations, defaults, warnings, and references to complementary tools (lister_nomenclature). No gaps detected.

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 82% (high), but the description adds significant semantics beyond the schema: conditional semantics of code_dept, default for mode_exercice_codes, semantics of include_etudiants/include_agents_publics, and warnings about Paris/Marseille/Lyon. It does not fully compensate for the remaining 18% but adds clear value.

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 it computes health density per 100,000 inhabitants for professionals or establishments at department or commune level, with explicit differentiation between the two cible targets and reference to siblings via methodology details.

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 provides explicit when-to-use guidance, including mandatory famille for etablissements, warnings against mixing code systems, a note that Paris/Marseille/Lyon commune-level is unsupported, and recommendation to use compare_national. It also implies distinctions from sibling tools that list counts rather than compute density.

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

enrichir_concurrentsA
Read-onlyIdempotent
Inspect

Enquête approfondie sur le top concurrents (V0.23). Pour chaque FINESS : statut actif + taille d'équipe + historique récent (inspect_site), signal M&A — rebranding en cours — (compare raison sociale FINESS vs RPPS), groupe parent (entreprise_by_siren : Biogroup/Cerballiance/… + est_grand_groupe).

Cap dur max=3 (inspect_site ~7 K tokens/appel — JAMAIS 10+). Drapeau couverture PAR concurrent ("ok" | "partiel:<raison>") : un concurrent qui échoue n'annule pas les autres.

Typiquement appelé sur concurrents.top[0..2].finess renvoyés par panorama_implantation_complet.

Sources : FINESS/ANS, RPPS/ANS, SIRENE/DINUM.

ParametersJSON Schema
NameRequiredDescriptionDefault
maxNoCap dur du nombre de concurrents enquêtés. Défaut 3.
finessYesNuméros FINESS à enquêter (typiquement le top 3 concurrents par distance).
Behavior5/5

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

Annotations indicate read-only, idempotent, non-destructive. Description adds critical behavioral details: hard cap at 3, token cost warning, and that a failing competitor does not cancel others. 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 structured in three paragraphs covering purpose, constraints, and usage. It is somewhat lengthy but every sentence provides valuable information given the tool's complexity.

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 no output schema, the description thoroughly explains what each FINESS returns (status, team size, history, M&A signals, parent group, coverage flag) and lists data sources. It is complete for an agent to understand inputs, outputs, and behavior.

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?

Schema coverage is 100%, but description adds meaning: finess array is typically top 3 competitors from a previous step, and max is a hard cap defaulting to 3. This contextualization aids correct invocation beyond raw 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 clearly states it performs an in-depth investigation of top competitors, detailing specific data points (status, team size, history, M&A, parent group). It distinguishes itself from sibling tools by being a composite tool that uses multiple sources like inspect_site and entreprise_by_siren for enrichment.

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 states typical use case: called on FINESS numbers from 'concurrents.top[0..2]' returned by 'panorama_implantation_complet'. Also provides constraints (max=3, expensive inspect_site calls) and behavior on failure, giving clear guidance on when and how to use.

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

entreprise_by_sirenA
Read-onlyIdempotent
Inspect

Récupère le détail d'une entreprise française par son SIREN (9 chiffres) : raison sociale, NAF, finances historiques, dirigeants, établissements. Source : DINUM Recherche Entreprises.

Format de retour : objet LookupResult discriminé par found.

  • found: true → l'entreprise est retournée à plat (champs siren, nomComplet, etablissements, enrichmentStatus, …)

  • found: false{ found: false, key, lookupStatus: 'not_found' | 'ambiguous', message }. not_found : SIREN non indexé par DINUM (souvent diffusion partielle INSEE — l'entreprise peut quand même exister dans SIRENE). ambiguous : régression API à signaler.

⚠️ Quand found: true, la liste etablissements peut être tronquée. Le champ nombreEtablissements (compté SIRENE) reflète le total réel. Lire enrichmentStatus pour savoir si la liste est complète :

  • success : etablissements contient tous les sites

  • partial : sites manquants (multi-département ou NAF différent du siège) — voir enrichmentWarning

  • failed : l'enrichissement a échoué (rate limit, panne API) — seul le siège est listé

  • not_attempted : entreprise monosite ou data SIRENE manquante

Pour énumération exhaustive multi-département, utiliser entreprises_in_radius par zone géographique. Coût : 1 ou 2 appels API DINUM par invocation (rate limit ~1 req/s effectif).

ParametersJSON Schema
NameRequiredDescriptionDefault
sirenYesSIREN exact, 9 chiffres.

Output Schema

ParametersJSON Schema
NameRequiredDescription
keyNoClé recherchée (SIREN, num_finess, code INSEE, …).
foundYes
messageNoExplication actionnable quand `found=false` (cause probable + remédiation).
lookupStatusYes
Behavior5/5

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

Annotations indicate readOnlyHint, idempotentHint, and no destruction. The description adds rich behavioral details: enrichment status meanings (success, partial, failed, not_attempted), potential truncation of etablissements, cost of 1-2 API calls, and rate limit of ~1 req/s. 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 well-structured and front-loaded with the core purpose. It includes necessary details (return format, enrichment logic, alternatives) but is slightly verbose; however, every sentence adds value, earning a 4.

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 (discriminated union output, enrichment status, edge cases), the description covers all necessary context: return format, possible lookupStatus values, enrichment behavior, alternative tool, and API constraints. The output schema exists but the description adds the discriminated union details, making it complete.

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% with a clear 'SIREN exact, 9 chiffres.' The description repeats the format but adds no new meaning beyond the schema, so baseline 3 is appropriate.

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 'Récupère le détail d'une entreprise française par son SIREN', specifying the verb and resource. It distinguishes from siblings by explicitly recommending 'entreprises_in_radius' for exhaustive multi-département enumeration.

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 provides explicit when-to-use (valid SIREN for company details) and when-not-to-use (exhaustive multi-département, use alternative). It also explains edge cases like not_found due to INSEE diffusion and notes rate limits, giving clear context for decision making.

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

entreprises_in_radiusA
Read-onlyIdempotent
Inspect

Recherche d'entreprises françaises avec filtres NAF, code postal, département ou rayon géographique. Couvre tous secteurs (santé via NAF 8690B, 4773Z, 8710A, 8621Z, etc.). Source : DINUM Recherche Entreprises (SIRENE + RNE). Renvoie CA, dirigeants, tranches d'effectif et dates de création.

Deux modes EXCLUSIFs (endpoints DINUM distincts) : (1) proximité — lat+lon+radiusKm (optionnellement + naf), résolu nativement via /near_point ; (2) administratif — q (texte libre) et/ou naf + codePostal/departement, via /search. La recherche de proximité ne supporte PAS q ni codePostal/departement (combinaison rejetée avec une erreur explicite : choisir un seul mode). radiusKm borné à 50 km.

Réduction de payload (V0.13) : includeDirigeants: false strip la liste des dirigeants RNE de chaque entreprise du résultat — utile en énumération volume (Geo Intel) où les dirigeants ne sont pas exploités et où les groupes type Biogroup peuvent en lister 20+ par entité (gonflement inutile du payload). Défaut true pour préserver le contrat V0.12 (backward-compat strict).

ParametersJSON Schema
NameRequiredDescriptionDefault
qNoRecherche textuelle libre (raison sociale, dirigeant…).
latNoLatitude du centre du cercle de recherche.
lonNoLongitude du centre du cercle de recherche.
nafNoCode NAF principal (ex: '8690B' = labos, '4773Z' = pharmacies, '8710A' = EHPAD, '8621Z' = MG).
pageNoPage (1-indexed).
perPageNoRésultats par page (1-25, défaut 10).
radiusKmNoRayon en km (1-50).
codePostalNoFiltre alternatif : code postal exact.
departementNoFiltre alternatif : code département.
includeDirigeantsNoInclure la liste des dirigeants RNE dans chaque entreprise (défaut true). `false` strip `dirigeants: []` côté handler — utile en énumération volume où les dirigeants ne sont pas exploités (économie de tokens, groupes type Biogroup peuvent lister 20+ dirigeants par entité).

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageYes
totalYesTotal d'entreprises matchant la query côté DINUM.
perPageYes
totalPagesYes
entreprisesYesEntreprises retournées (SIREN, nomComplet, NAF, finances, etablissements).
Behavior4/5

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

Annotations already mark the tool as read-only, idempotent, and non-destructive. The description adds valuable behavioral context: the API fallback behavior and result limits (25 per NAF in department). No contradictions 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.

Conciseness5/5

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

The description is concise and well-structured: first sentence states purpose, second adds coverage and source, third explains the critical limitation. Every sentence earns its place; no fluff.

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 (9 parameters, output schema exists), the description covers the main purpose, data source, and a key limitation. Pagination details are implicit (page/perPage), but the output schema provides return structure. Adequately complete.

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 baseline is 3. The description adds no additional parameter-level details beyond what the schema provides, but it does give context on NAF codes (e.g., health sectors). This is acceptable but not 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 clearly states the tool searches for French companies with filters (NAF, postal code, department, radius), covering all sectors. It is distinct from sibling tools like professionnels_in_radius or etablissements_finess_in_radius which target health professionals or facilities.

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 explicit usage guidance by detailing a limitation: the combination naf+lat/lon/radiusKm is not supported natively and triggers a fallback with results limited to 25 companies. This informs when to use the tool and its constraints, though no explicit when-to-use or alternatives are stated.

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

etablissement_by_finessA
Read-onlyIdempotent
Inspect

Récupère le détail complet d'un établissement de santé par son numéro FINESS (9 chiffres) : raison sociale, catégorie + famille, adresse complète (voie + CP + ville + code INSEE + département), coordonnées GPS, téléphone. Retourne un objet LookupResult discriminé par found. found: true → champs FINESS à plat. found: false{ found: false, key, lookupStatus: 'not_found', message }. Le référentiel DREES a 1-2 mois de retard sur le terrain : pour des structures émergentes (CPTS récentes, MSP en agrément), cross-check ARS / Service Public. Source : FINESS / DREES. Note : champ email toujours null (non exposé par FINESS public). Note : raison_sociale provient du dump DREES qui abrège les libellés longs (~38 car. max, ex 'CERBALLIANCE HA' pour 'CERBALLIANCE HAZEBROUCK'). Pour le nom légal complet, cross-check via SIREN/SIRET (entreprise_by_siren / etablissement_by_siret).

ParametersJSON Schema
NameRequiredDescriptionDefault
num_finessYesNuméro FINESS exact (9 chiffres).
include_freshnessNoSi true, ajoute un champ `data_freshness` au payload (dans `query_metadata` si présent, sinon à la racine) listant la dernière ingestion réussie par source (FINESS, Ameli, RPPS, CDS) avec `staleness_days`. Opt-in pour ne pas alourdir les payloads par défaut. Cache 5min côté serveur — coût négligeable.

Output Schema

ParametersJSON Schema
NameRequiredDescription
keyNoClé recherchée (SIREN, num_finess, code INSEE, …).
foundYes
messageNoExplication actionnable quand `found=false` (cause probable + remédiation).
lookupStatusYes
Behavior5/5

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

Annotations already indicate readOnlyHint=true, destructiveHint=false, idempotentHint=true. The description adds behavioral details: returns a LookupResult discriminated by found, explains both found=true and false responses, mentions data freshness opt-in, cache behavior, and the email always null. No contradiction.

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 comprehensive but slightly verbose (e.g., listing all fields). It is well front-loaded with the main action, but could be trimmed slightly without losing clarity. Still, it is well-structured and informative.

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 complexity of a lookup with discriminated result, data freshness opt-in, and data latency considerations, the description covers all necessary aspects. The output schema exists, so return values are not over-explained. It provides complete context for an agent to use the tool correctly.

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?

Schema coverage is 100%, but the description adds meaning beyond schema: num_finess is specified as exactly 9 digits, and include_freshness explains payload adjustment and cache behavior. This enriches understanding beyond the schema descriptions.

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 it retrieves the complete details of a healthcare establishment by its FINESS number, listing specific fields (social reason, category, address, GPS, phone). It distinguishes from siblings by focusing on a single FINESS number, while sibling tools handle categories or radius searches.

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 implies use when you have a specific FINESS number, but does not explicitly state when to use this tool versus alternatives. It provides caveats about data latency and recommends cross-checking, but lacks direct guidance on when not to use it or comparison with sibling tools.

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

etablissement_by_siretA
Read-onlyIdempotent
Inspect

Récupère le détail d'un établissement par son SIRET (14 chiffres) via l'API SIRENE INSEE V3.11 : raison sociale de l'unité légale, enseigne commerciale, NAF de l'établissement, dates de création/fermeture, statut administratif actif/fermé, adresse complète, tranche d'effectif. Source : SIRENE INSEE V3.11 (api.insee.fr).

Format de retour : objet LookupResult discriminé par found.

  • found: true → établissement à plat (siret, siren, actif, dateFermeture, enseigne, adresse, …)

  • found: false{ found: false, key, lookupStatus: 'not_found', message }. Cas typiques : clé INSEE_SIRENE_API_KEY non configurée côté serveur (message explicite), SIRET inexistant SIRENE, diffusion partielle INSEE.

⚠️ Différence avec entreprise_by_siren : ce tool renvoie UN établissement précis (un site), alors que entreprise_by_siren renvoie l'unité légale + sa liste d'établissements. Pour détecter un SIRET fermé encore listé actif côté FINESS, lire actif: false + dateFermeture.

Pas de coords : l'endpoint INSEE /siret/<siret> ne renvoie pas les coordonnées GPS. Pour géolocaliser, croiser avec geocode_adresse côté caller ou utiliser entreprises_in_radius.

Rate limit INSEE : 30 req/min (retry-after géré côté serveur).

ParametersJSON Schema
NameRequiredDescriptionDefault
siretYesSIRET exact, 14 chiffres.

Output Schema

ParametersJSON Schema
NameRequiredDescription
keyNoClé recherchée (SIREN, num_finess, code INSEE, …).
foundYes
messageNoExplication actionnable quand `found=false` (cause probable + remédiation).
lookupStatusYes
Behavior5/5

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

Description goes beyond annotations (readOnlyHint, etc.) by detailing return format (LookupResult with found true/false cases), error messages (missing API key, not found, diffusion partielle), and behavioral constraints (no GPS coordinates, rate limit).

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?

Description is well-structured with clear sections, emoji warnings, and bullet-like formatting. Though lengthy, every sentence adds value; front-loaded with main purpose.

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 output schema exists, description explains both cases (found/not found). Covers edge cases (API key missing, diffusion partielle) and provides cross-tool comparison. Fully adequate for context.

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?

The single parameter 'siret' is fully covered by schema (100% description), and the description adds value by restating '14 chiffres' and reinforcing that it's used for lookup. No additional parameter documentation needed.

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 specifies the verb 'Récupère' and resource 'établissement par son SIRET', lists data fields (raison sociale, NAF, dates, etc.), and distinguishes from sibling 'entreprise_by_siren' by clarifying it returns a single site vs legal unit with list.

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 states when to use this tool vs 'entreprise_by_siren' and 'geocode_adresse' for coordinates. Provides guidance on interpreting 'actif: false' for FINESS cases. Also notes rate limit (30 req/min) and server-side handling.

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

etablissements_finess_by_categorieA
Read-onlyIdempotent
Inspect

Liste des établissements FINESS par famille, avec filtre département ou commune optionnel. Pas de rayon — pour énumération exhaustive d'une zone administrative. 24 familles disponibles : mco, ssr, sld, had, psychiatrie, dialyse, ambulatoire, labo, imagerie, pharmacie, msp_cpts, ehpad, residence_autonomie, senior_accompagnement, ssiad, aide_domicile, handicap_enfants, handicap_adultes, addictologie, enfance_protection, pmi, hebergement_social, prevention_sante, groupement.

V0.19.0 : accepte nom_commune (string) comme alternative à code_insee (résolu via geo.api.gouv.fr). XOR strict — passer SOIT departement SOIT code_insee SOIT nom_commune (combinable avec departement qui agit alors comme hint de désambiguïsation pour homonymes type "Saint-Martin"). Aucun param zone = France entière (acceptée).

Source : FINESS / DREES. Note : champ email toujours null (non exposé par FINESS public). Note : raison_sociale provient du dump DREES qui abrège les libellés longs (~38 car. max, ex 'CERBALLIANCE HA' pour 'CERBALLIANCE HAZEBROUCK'). Pour le nom légal complet, cross-check via SIREN/SIRET (entreprise_by_siren / etablissement_by_siret). Lentille : un filtre familles compte les établissements par leur catégorie FINESS principale. Les activités hébergées dans un site d'une autre catégorie (ex. plateau de biologie d'un hôpital sous famille=labo) ne sont pas comptées — voir le champ perimetre de la réponse. La famille imagerie renvoie le plus souvent 0 résultat (FINESS ne répertorie pas les cabinets d'imagerie).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoNombre max de résultats (1-500, défaut 100).
categorieYesFamille FINESS recherchée (24 valeurs disponibles, voir enum).
code_inseeNoCode INSEE de commune (5 caractères). Optionnel. XOR strict avec `departement` et `nom_commune`.
departementNoCode département INSEE (ex: '75', '2A', '2B', '971'). Métropole 2 caractères (Corse '2A'/'2B', pas '20'), DOM/TOM 3 caractères. Optionnel. Combinable avec `nom_commune` comme hint resolver (filtre les homonymes), sinon XOR strict avec `code_insee` et `nom_commune`.
nom_communeNoNom officiel de commune (alternative à `code_insee`, V0.19). Ex: "Lille", "Saint-Étienne". Le serveur résout en interne via geo.api.gouv.fr. Si ambigu (ex "Saint-Martin" → 5 villes), retourne une erreur structurée avec candidates. Combinable avec `departement` comme hint de désambiguïsation. Abréviations type "St-Martin" non reconnues — utiliser le nom officiel complet.
include_freshnessNoSi true, ajoute un champ `data_freshness` au payload (dans `query_metadata` si présent, sinon à la racine) listant la dernière ingestion réussie par source (FINESS, Ameli, RPPS, CDS) avec `staleness_days`. Opt-in pour ne pas alourdir les payloads par défaut. Cache 5min côté serveur — coût négligeable.

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYesNombre d'entrées retournées dans `results` (post-troncature).
totalNoEffectif réel avant troncature. Présent sur les tools de nomenclature paginés (lister_*) : `count` = échantillon, `total` = total réel, re-appeler avec un `limit` supérieur si `truncated`.
resultsYesEntrées métier (shape spécifique au tool, cf. description du tool).
freshnessNoFraîcheur des sources (présent si `include_freshness: true`).
perimetreNoLentille de la source : ce que le comptage inclut/exclut. Lire `completeness_note` et la restituer au lecteur final.
truncatedNotrue si le total réel dépasse `limit` (re-paginer via `offset` si supporté, ou augmenter `limit` sur les lister_*). Optional sur les tools de listing exhaustif (lister_*).
query_metadataNoMetadata de la query (radius_km, departement, filtres appliqués, …).
activite_hebergeeNoCompte juxtaposé des sites hébergeant l'activité correspondant à la famille filtrée, sous une autre catégorie FINESS. Distinct du `count` principal — lire `note` pour comprendre la sémantique et ne JAMAIS additionner les deux comptes sans préciser leur nature.
Behavior4/5

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

Annotations indicate readOnly, openWorld, idempotent, and non-destructive. The description adds value by noting the 'email' field is always null due to FINESS public limitations and explaining the 'include_freshness' option's caching and overhead. This provides behavioral context beyond 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 two sentences plus a list of categories and notes. Key information is front-loaded (what the tool does and when to use it). The list is necessary but slightly verbose. Overall efficient and well-structured.

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 5 parameters, 24-value enum, optional filters, and a data freshness option, the description covers main usage, limitations, and optional behavior. An output schema exists, so return-value details are not needed. A minor gap: no mention of default ordering or pagination behavior.

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?

All 5 parameters have schema descriptions (100% coverage). The description adds minimal extra meaning, such as listing all enum values (redundant) and explaining the 'include_freshness' parameter's caching behavior. Baseline 3 is appropriate since schema already documents 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 clearly states the tool lists FINESS establishments by category, with optional department/municipality filters. It distinguishes from radius-based tools by explicitly saying 'Pas de rayon — pour énumération exhaustive d'une zone administrative.' This makes the purpose specific and unambiguous.

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 a clear use case: exhaustive enumeration of an administrative area, contrasting with radius-based tools. It lists 24 available categories. However, it does not explicitly mention when to use sibling tools like 'etablissements_finess_in_radius' or 'professionnels_in_radius' as alternatives.

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

etablissements_finess_in_radiusA
Read-onlyIdempotent
Inspect

Recherche d'établissements de santé FINESS dans un rayon géographique (PostGIS ST_DWithin). Filtrable par familles. 24 valeurs disponibles : mco, ssr, sld, had, psychiatrie, dialyse, ambulatoire, labo, imagerie, pharmacie, msp_cpts, ehpad, residence_autonomie, senior_accompagnement, ssiad, aide_domicile, handicap_enfants, handicap_adultes, addictologie, enfance_protection, pmi, hebergement_social, prevention_sante, groupement. Source : FINESS / DREES (dump CSV ingéré localement). Note : champ email toujours null (non exposé par FINESS public). Note : raison_sociale provient du dump DREES qui abrège les libellés longs (~38 car. max, ex 'CERBALLIANCE HA' pour 'CERBALLIANCE HAZEBROUCK'). Pour le nom légal complet, cross-check via SIREN/SIRET (entreprise_by_siren / etablissement_by_siret). Lentille : un filtre familles compte les établissements par leur catégorie FINESS principale. Les activités hébergées dans un site d'une autre catégorie (ex. plateau de biologie d'un hôpital sous famille=labo) ne sont pas comptées — voir le champ perimetre de la réponse. La famille imagerie renvoie le plus souvent 0 résultat (FINESS ne répertorie pas les cabinets d'imagerie).

ParametersJSON Schema
NameRequiredDescriptionDefault
latYesLatitude du centre (WGS84).
lonYesLongitude du centre (WGS84).
limitNoNombre max de résultats (1-500, défaut 100).
famillesNoFamilles FINESS à inclure (24 valeurs disponibles, voir enum). Si omis, toutes catégories.
radius_kmNoRayon en km (0.1-50, défaut 5).
include_freshnessNoSi true, ajoute un champ `data_freshness` au payload (dans `query_metadata` si présent, sinon à la racine) listant la dernière ingestion réussie par source (FINESS, Ameli, RPPS, CDS) avec `staleness_days`. Opt-in pour ne pas alourdir les payloads par défaut. Cache 5min côté serveur — coût négligeable.

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYesNombre d'entrées retournées dans `results` (post-troncature).
totalNoEffectif réel avant troncature. Présent sur les tools de nomenclature paginés (lister_*) : `count` = échantillon, `total` = total réel, re-appeler avec un `limit` supérieur si `truncated`.
resultsYesEntrées métier (shape spécifique au tool, cf. description du tool).
freshnessNoFraîcheur des sources (présent si `include_freshness: true`).
perimetreNoLentille de la source : ce que le comptage inclut/exclut. Lire `completeness_note` et la restituer au lecteur final.
truncatedNotrue si le total réel dépasse `limit` (re-paginer via `offset` si supporté, ou augmenter `limit` sur les lister_*). Optional sur les tools de listing exhaustif (lister_*).
query_metadataNoMetadata de la query (radius_km, departement, filtres appliqués, …).
activite_hebergeeNoCompte juxtaposé des sites hébergeant l'activité correspondant à la famille filtrée, sous une autre catégorie FINESS. Distinct du `count` principal — lire `note` pour comprendre la sémantique et ne JAMAIS additionner les deux comptes sans préciser leur nature.
Behavior4/5

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

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint false. The description adds useful context: the data source (FINESS/DREES), the use of PostGIS ST_DWithin, and the fact that the email field is always null. This goes beyond the annotations, though it does not describe rate limits or cost.

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 concise and front-loaded with the core action. It includes a list of 24 family values, which is necessary for usability but could be slightly trimmed. Overall, every sentence serves a purpose without redundancy.

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 (6 parameters, required output schema) and rich schema descriptions, the description adds meaningful context: data source, null email behavior, and a hint about caching. The output schema exists, so not explaining return values is acceptable. Minor omission: no mention of performance or typical use cases.

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%, with each parameter well-documented in the schema. The main description lists the 24 family values (also in the schema enum) but does not add new semantics beyond what the schema provides. Baseline 3 is appropriate.

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: searching for FINESS healthcare establishments within a geographic radius using PostGIS. It specifies the resource (établissements FINESS), the action (recherche dans un rayon), and differentiates from sibling tools like etablissement_by_finess (exact ID) and etablissements_finess_by_categorie (category-only).

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

Usage Guidelines3/5

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

The description implies usage for radius-based searches but does not explicitly state when to use this tool vs alternatives or when not to use it. It lists families and mentions the null email field but lacks exclusion criteria or comparative guidance. Sibling tools exist but are not referenced.

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

finess_sirene_coverage_in_radiusA
Read-onlyIdempotent
Inspect

Compare la couverture du référentiel FINESS DREES (sites physiques agréés LBM/pharmacie/etc.) au référentiel SIRENE DINUM (SIRET physiques actifs au NAF cible) dans un rayon géographique. Métrique : ratio sites FINESS / SIRET SIRENE. Utile pour détecter une sur-déclaration FINESS (sites encore listés mais SIRET fermés) ou une sous-déclaration DREES (sites SIRENE non agréés FINESS). Inclut une méthodologie explicite + caveats. V0.13.2 : si familles n'est pas passé, le scope FINESS est auto-dérivé du NAF cible (garantit un ratio cohérent — sinon finess_sites mélangerait toutes les familles co-localisées dans le rayon). Le matching FINESS↔SIRET est gaté par activité NAF↔famille (cas Hôpital Franco-Britannique : IFSI et labo au 4 rue Kléber ne sont plus confondus). Source : FINESS DREES + DINUM Recherche Entreprises + SIRENE INSEE.

ParametersJSON Schema
NameRequiredDescriptionDefault
latYesLatitude WGS84 du centre de la zone.
lonYesLongitude WGS84 du centre de la zone.
nafYesCode NAF SIRENE à comparer (ex: '8690B' labos d'analyses médicales, '4773Z' pharmacies, '8621Z' médecine générale).
famillesNoFamilles FINESS à inclure côté DREES. V0.13.2 : si omis, auto-dérivé du NAF cible via la table naf-finess-mapping (ex: naf=8690B → familles=[labo] ; naf=8610Z → multi-familles hospitalières). Passer explicitement si vous voulez restreindre davantage le scope. Valeurs : mco, ssr, sld, had, psychiatrie, dialyse, ambulatoire, labo, imagerie, pharmacie, msp_cpts, ehpad, residence_autonomie, senior_accompagnement, ssiad, aide_domicile, handicap_enfants, handicap_adultes, addictologie, enfance_protection, pmi, hebergement_social, prevention_sante, groupement.
radius_kmNoRayon de la zone en km (0.1-50, défaut 5).
max_unites_legalesNoNombre maximum d'unités légales DINUM à déplier (1-25, défaut 10). Au-delà : truncated_unites_legales=true.

Output Schema

ParametersJSON Schema
NameRequiredDescription
caveatsNoLimitations méthodologiques explicites (discipline zéro overclaim).
perimetreNoLentille de la source : ce que le comptage inclut/exclut. Lire `completeness_note` et la restituer au lecteur final.
methodologyYesDescription LLM-friendly de l'algorithme appliqué.
finess_sitesYesNombre de sites FINESS dans le rayon (référentiel DREES).
matched_countNoNombre de matchs greedy Dice ≥ 0.7.
sirene_siretsYesNombre de SIRET physiques actifs au NAF cible dans le rayon (DINUM/SIRENE).
coverage_ratioYesmatched / finess_sites ∈ [0, 1]. null si `sirene_sirets === 0` (zone rurale + NAF rare → ratio non calculable).
coverage_statusYesStatut typé du calcul (toujours présent). `computed` = calcul nominal (finess_sites peut être 0 sur rayon vide). `scope_empty_unknown_naf` = NAF non mappé, court-circuit (corriger le NAF ou compléter naf-finess-mapping). `scope_empty_familles_incompatible` = `familles` toutes incompatibles avec le NAF (réviser le couple ou omettre `familles` pour auto-derive). Le `caveats[]` reste exposé en parallèle pour lecture humaine — ce champ fait foi pour le routage.
matched_samplesNo
finess_only_countNo
sirene_only_countNo
finess_only_samplesNo
sirene_only_samplesNo
familles_excluees_nafNoFamilles passées en input mais incompatibles avec le `naf` cible, exclues du périmètre FINESS (V0.13.2 couche 2). Absent si tout est cohérent ou si `familles` n'a pas été passé.
familles_auto_deriveesYesFamilles FINESS auto-dérivées du `naf` cible quand `familles` n'est pas passé (V0.13.2 couche 1 — garantit un ratio cohérent). `null` si le caller a passé `familles` explicitement.
truncated_unites_legalesNotrue si le cap `maxUnitesLegales` a été atteint avant énumération complète.
Behavior4/5

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

Les annotations indiquent readOnlyHint=true, idempotentHint=true, openWorldHint=true, et destructiveHint=false. La description ajoute des comportements importants : la méthodologie de calcul, l'inclusion de caveats, et la mention des sources (FINESS DREES + DINUM + SIRENE INSEE). Cependant, elle ne précise pas la gestion des limites (comme le tri des unités légales au-delà du max_unites_legales) ni le format de la réponse. Avec des annotations riches, la description complète bien mais pourrait être plus explicite sur le comportement en cas de limite atteinte.

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?

La description est relativement concise (environ 80 mots) et bien structurée : elle commence par l'action principale, puis définit la métrique, les cas d'usage, et mentionne les sources et caveats. Chaque phrase apporte une information utile. Elle pourrait être légèrement raccourcie sans perte d'information, mais elle reste efficace. Pas de répétition ni de contenu superflu.

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?

Le contexte est très complet : la description couvre l'objectif, la métrique, les cas d'usage, la méthodologie, les sources, et les caveats. Un schéma de sortie existe probablement pour documenter la structure de réponse, ce qui allège la description. Compte tenu de la complexité de l'outil (comparaison de deux référentiels), la description fournit toutes les informations nécessaires à un agent pour décider de l'utiliser.

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?

La couverture du schéma est de 100% : chaque paramètre a une description. La description de l'outil n'ajoute pas d'informations spécifiques aux paramètres au-delà de ce qui est déjà dans le schéma. Elle mentionne des exemples de codes NAF et les familles, mais cela reste général. Conformément à la règle, avec une couverture >80%, la baseline est 3. La description n'apporte pas de valeur ajoutée significative sur la sémantique des paramètres.

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?

La description indique clairement l'action : comparer la couverture des référentiels FINESS et SIRENE dans un rayon géographique, avec une métrique précise (ratio sites FINESS/SIRET SIRENE) et les cas d'usage (détection de sur ou sous-déclaration). Elle se distingue efficacement des outils frères comme 'etablissements_finess_in_radius' ou 'entreprises_in_radius' en spécifiant la comparaison inter-référentiel.

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?

La description donne un contexte d'utilisation clair ('détecter une sur-déclaration FINESS ou une sous-déclaration DREES'), mais ne mentionne pas explicitement quand ne pas utiliser cet outil ni les alternatives parmi les siblings (par ex. 'reconcilier_finess_sirene' qui pourrait être plus adapté pour une réconciliation point par point). Le contexte est suffisant pour un agent, mais une exclusion explicite renforcerait la note.

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

geocode_adresseA
Read-onlyIdempotent
Inspect

Géocode une adresse française en coordonnées GPS. Source : IGN Géoplateforme (data.geopf.fr). Précision au numéro de rue.

Le champ score (0-1) qualifie la fiabilité du match : >= 0.8 fiable, < 0.5 = match douteux (souvent un fallback rue/commune sans rapport avec l'adresse demandée). Le champ booléen confidence_low vaut true dans ce cas : ne PAS utiliser point pour une décision quand confidence_low: true. Le champ type indique aussi la granularité (housenumber > street > locality > municipality).

ParametersJSON Schema
NameRequiredDescriptionDefault
adresseYesAdresse complète à géocoder.
codePostalNoOptionnel — limiter le résultat à un code postal pour désambiguïser.
codeCommuneNoOptionnel — limiter au code INSEE de commune.
Behavior4/5

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

Annotations already indicate safety, readOnly, idempotent. Description adds context about source data and precision, 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?

Two sentences, no wasted words. Purpose is front-loaded, source and precision follow efficiently.

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?

Adequate for a simple geocoding tool with 3 params and no output schema. Could mention return format but not critical.

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 coverage is 100% and descriptions are clear. The description adds only minor context about precision beyond schema; baseline 3 is appropriate.

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?

Clearly states it geocodes a French address to GPS coordinates, with source and precision level. Distinguishes from sibling 'reverse_geocode'.

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

Usage Guidelines3/5

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

Describes what it does and source, but does not explicitly state when to use it over alternatives like reverse_geocode or commune tools.

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

get_commune_by_codeA
Read-onlyIdempotent
Inspect

Récupère une commune par son code INSEE. Retourne un objet LookupResult discriminé par found. found: true → champs commune à plat (nom, codesPostaux, centre…). found: false{ found: false, key, lookupStatus: 'not_found', message } orientant vers autocomplete_commune pour disambiguer.

Alias acceptés : code_insee/codeInsee/inseecode.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYesCode INSEE 5 caractères. Ex: "75056" Paris, "59009" Villeneuve-d'Ascq, "2A004" Ajaccio.

Output Schema

ParametersJSON Schema
NameRequiredDescription
keyNoClé recherchée (SIREN, num_finess, code INSEE, …).
foundYes
messageNoExplication actionnable quand `found=false` (cause probable + remédiation).
lookupStatusYes
Behavior4/5

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

Annotations already provide safety and idempotency hints. The description adds significant behavioral detail about the discriminated return type (found vs not_found) and the fields in each case, which goes beyond 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?

Two sentences with no waste. First sentence states purpose, second explains return shape. Front-loaded and efficient.

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 simple lookup tool with one parameter, the description covers purpose, input, and return behavior (including error case). It is complete given the presence of an output schema and good annotations.

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 coverage is 100% with a clear description of the 'code' parameter as 'Code INSEE (5 caractères).' The description adds no extra meaning beyond that, so baseline 3 is appropriate.

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 it retrieves a commune by INSEE code with a specific verb and resource. It distinguishes from sibling 'autocomplete_commune' by directing disambiguation there on not_found.

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?

Explicitly states to use this tool when you have an INSEE code, and on not_found it suggests using autocomplete_commune for disambiguation. This provides clear when-to-use and an alternative.

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

historique_etablissementA
Read-onlyIdempotent
Inspect

Reconstitue la timeline complète d'un établissement de santé (ouvertures, fermetures, changements de NAF/enseigne) en croisant FINESS DREES ↔ resolver SIRET (RPPS + DINUM) ↔ SIRENE INSEE V3.11. Lit les periodesEtablissement complètes pour chaque SIRET candidat.

V0.7.0 : SIRET candidats élargis via le resolver — inclut désormais les SIRET fermés du SIREN parent qui matchent l'adresse FINESS (invisibles côté RPPS seul). Permet de tracer la fermeture exacte d'un site même quand FINESS le liste encore actif.

Usage typique :

  • Tracer l'historique d'un site après une fusion-acquisition

  • Identifier la date de fermeture exacte d'un SIRET encore listé actif côté FINESS

  • Comprendre une cascade de rebrandings via les changements de enseigne1Etablissement au fil des périodes

Format : objet LookupResult. Quand found: true, retourne finess (vue DREES synthétique) + siret_timelines (1 entrée par SIRET candidat avec periodes chronologiques).

Coût : 1 RPC FINESS + 1 SELECT rpps + N appels DINUM + N appels INSEE en parallèle (N ≤ 5 typiquement). Pas de cache.

ParametersJSON Schema
NameRequiredDescriptionDefault
num_finessYesNuméro FINESS exact (9 chiffres).

Output Schema

ParametersJSON Schema
NameRequiredDescription
keyNoClé recherchée (SIREN, num_finess, code INSEE, …).
foundYes
messageNoExplication actionnable quand `found=false` (cause probable + remédiation).
lookupStatusYes
Behavior4/5

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

Beyond the annotations (readOnly, idempotent, etc.), the description discloses detailed behavioral traits: the specific data sources used (FINESS, RPPS, DINUM, INSEE), the cost in terms of API calls, the fact that it includes closed SIRETs, and that there is no cache. This adds significant transparency about what happens during execution.

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 well-structured with a clear first sentence stating the main purpose, followed by a version note, typical usage, output format, and cost. Although it is somewhat lengthy, every section adds valuable information and there is no redundancy. The information density is high.

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 and the presence of an output schema, the description covers the input, output format, behavior, typical uses, and cost. It does not explicitly address error conditions or edge cases, but the provided information is sufficient for an AI agent to correctly invoke the tool in typical scenarios.

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 describes the single parameter 'num_finess' as a 9-digit exact number with 100% coverage. The description does not add any additional semantics or constraints beyond what the schema provides, so it meets the baseline but does not exceed 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 explicitly states that the tool reconstructs the complete timeline of a healthcare establishment by cross-referencing multiple data sources. It distinguishes itself from siblings like 'etablissement_by_finess' by focusing on historical changes rather than current state, and includes typical use cases that clarify its specific role.

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 three typical usage scenarios (post-merger history, exact closure date, rebranding cascade) that serve as clear guidance on when to use this tool. While it does not explicitly list alternatives or state when not to use it, the scenarios implicitly differentiate it from current-state tools. This is strong contextual guidance.

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

inspect_siteA
Read-onlyIdempotent
Inspect

Vue 360 d'un établissement de santé en 1 appel (V0.10). Pendant naturel de panorama_sante_territoire côté site : agrège en parallèle (a) identification FINESS DREES (raison sociale, adresse, téléphone), (b) statut administratif SIRENE via le resolver SIRET (verdicts site + groupe, best_match, SIREN explorés, dinum_errors, explication LLM-friendly), (c) professionnels rattachés via num_finess (sample borné + flag truncated si le site a plus de PS — PAS un count total), (d) historique INSEE (timeline périodes administratives par SIRET candidat).

Remplace 3 appels MCP individuels (verifier_site_actif + rpps_dans_etablissement + historique_etablissement) par 1 seul. Utile pour : prospection (qualifier un site avant outreach), audit territorial (cross-check rapide d'un FINESS suspect), enrichissement CRM en batch.

Format de retour : objet LookupResult. Quand found: true, payload avec 4 sections (finess, statut_site, professionnels, historique). La section historique peut être available: false quand le FINESS existe mais qu'aucun SIRET candidat n'a été identifié (RPPS vide + DINUM 0 match) — dans ce cas le message reprend celui de historique_etablissement. Quand num_finess est absent de FINESS DREES, retourne {found: false, lookupStatus: 'not_found', message}.

Coût : 3 sous-appels parallèles. Cache PostgreSQL absorbe la duplication FINESS-RPC ; le pivot RPPS→DINUM est exécuté en double (verifier + historique partagent la cascade), surcoût p95 ≤ 600 ms — acceptable pour un agrégateur. Pour les besoins ciblés (juste le verdict, juste l'historique), préférer les tools individuels. Payload lourd (~7K tokens) : passer historique_detail: false pour un retour allégé (résumé au lieu des timelines SIRENE complètes) en usage batch.

Alias acceptés : numFiness/finess/idnum_finess.

ParametersJSON Schema
NameRequiredDescriptionDefault
num_finessYesNuméro FINESS exact 9 chiffres. Ex: '590048997'.
rpps_limitNoNombre max de PS dans `professionnels.sample`. `professionnels.count` = taille du sample (≤ cette borne), pas le total du site ; `truncated: true` signale qu'il y a davantage de PS. Borné [1, 50]. Défaut 10.
historique_detailNoInclure les timelines SIRENE détaillées dans `historique.siret_timelines` (défaut true). `false` = payload allégé (~7K tokens en moins) : `historique` ne porte qu'un `resume` (counts) + un pointeur vers `historique_etablissement`.

Output Schema

ParametersJSON Schema
NameRequiredDescription
keyNoClé recherchée (SIREN, num_finess, code INSEE, …).
foundYes
messageNoExplication actionnable quand `found=false` (cause probable + remédiation).
lookupStatusYes
Behavior5/5

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

The description adds substantial behavioral details beyond the annotations: it explains that it makes three parallel sub-calls, has caching, a p95 overhead ≤600ms, and edge cases (e.g., when historique is unavailable). It also describes the return format (LookupResult with found flag) and truncation behavior. Annotations already indicate read-only and idempotent, and the description complements this with concrete behavioral context.

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 relatively long but well-structured with clear sections (purpose, when to use, return format, cost, aliases). Every sentence serves a purpose, though it could be slightly more concise without losing clarity. Front-loading the purpose is effective.

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 (four sub-calls, multiple edge cases, sibling tools, output schema exists), the description covers all needed information: input format, output structure, performance cost, truncation behavior, and use-case guidance. There are no gaps.

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?

Schema coverage is 100%, and the description enhances parameter understanding: it explains `rpps_limit` default (10), range ([1,50]), and the meaning of the `truncated` flag. It also documents aliases for `num_finess` (numFiness, finess, id). This adds significant value beyond the 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 clearly states it provides a '360 view of a health establishment' by aggregating four specific sub-calls (identification, statut, professionnels, historique). It distinguishes from sibling tools like `verifier_site_actif`, `rpps_dans_etablissement`, and `historique_etablissement`, making its purpose explicit and unique.

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 specifies when to use the tool (e.g., prospecting, territorial audit, CRM enrichment) and when not to ('for targeted needs like just the verdict or just the history, prefer the individual tools'). It names alternative sibling tools, providing clear usage guidance.

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

lister_nomenclatureA
Read-onlyIdempotent
Inspect

Découverte des nomenclatures de codes du serveur (tool unique paramétré par referentiel) — à appeler avant de filtrer un autre tool plutôt que deviner les codes. ⚠️ Les 3 nomenclatures sont DISTINCTES : un même nombre y désigne des choses différentes (ex '10' = Médecin côté ANS, Neurochirurgien côté Ameli). Ne JAMAIS passer un code d'un référentiel à un paramètre d'un autre — le filtre renverrait vide sans erreur.

referentiel :

  • ameli_specialites — codes specialite_code Ameli (libéraux conventionnés Assurance Maladie / CNAM) : libellé natif, type_ps_code de rattachement, count, libelle_clarifie (désambigüise les libellés partagés, ex "Médecin généraliste" = 01/22/23 ; "Psychiatre" = 33/75), is_libelle_partage. Pour filtrer professionnels_in_radius / professionnels_par_specialite_dept (param specialite_code(s)).

  • ameli_types_ps — codes type_ps Ameli : libelle_source, libelle_clarifie (résout l'ambiguïté du code "2" fourre-tout), count, et specialites_presentes (spécialités regroupées). Payload léger via include_specialites: false (→ nb_specialites).

  • rpps_savoir_faire — spécialités médicales savoir_faire_code RPPS / Annuaire Santé ANS (ex 'SM04' Cardiologie). Pour filtrer densite_sante (cible professionnels) / professionnels_rpps_*. Filtre par profession_code (défaut '10' Médecin ; string vide ou 'null' = tous savoir_faire).

Paginé : limit (défaut 50), réponse expose total et truncated. PÉRIMÈTRE : libéraux conventionnés UNIQUEMENT. HORS PÉRIMÈTRE : médecins exclusivement hospitaliers/salariés, biologistes médicaux salariés en LBM, anatomopathologistes hospitaliers, médecins du travail, médecine légale. Pour effectifs tous statuts, voir Annuaire Santé ANS (RPPS, esante.gouv.fr) — non couvert par ce serveur. Source : Annuaire santé Ameli (Assurance Maladie), MAJ hebdomadaire. Réutilisation soumise à l'art. L.1461-2 CSP — citer la source et la date de sync.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoNombre max de résultats (défaut 50, max 1000). Triés par fréquence décroissante. La réponse expose `total` (effectif réel) et `truncated` — re-appeler avec un `limit` supérieur pour la liste complète.
referentielYesNomenclature à lister. `ameli_specialites` / `ameli_types_ps` = Ameli (libéraux conventionnés) ; `rpps_savoir_faire` = spécialités médicales ANS/RPPS (nomenclature DISTINCTE).
profession_codeNoRéférentiel `rpps_savoir_faire` UNIQUEMENT : code profession ANS (TRE_R94). Défaut '10' (Médecin). String vide ou 'null' = tous savoir_faire, toutes professions.
include_freshnessNoSi true, ajoute un champ `data_freshness` au payload (dans `query_metadata` si présent, sinon à la racine) listant la dernière ingestion réussie par source (FINESS, Ameli, RPPS, CDS) avec `staleness_days`. Opt-in pour ne pas alourdir les payloads par défaut. Cache 5min côté serveur — coût négligeable.
include_specialitesNoRéférentiel `ameli_types_ps` UNIQUEMENT : inclure le sous-tableau `specialites_presentes` détaillé (défaut true). `false` → remplacé par `nb_specialites` (compteur), ~6K tokens économisés.

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYesNombre d'entrées retournées dans `results` (post-troncature).
totalNoEffectif réel avant troncature. Présent sur les tools de nomenclature paginés (lister_*) : `count` = échantillon, `total` = total réel, re-appeler avec un `limit` supérieur si `truncated`.
resultsYesEntrées métier (shape spécifique au tool, cf. description du tool).
freshnessNoFraîcheur des sources (présent si `include_freshness: true`).
perimetreNoLentille de la source : ce que le comptage inclut/exclut. Lire `completeness_note` et la restituer au lecteur final.
truncatedNotrue si le total réel dépasse `limit` (re-paginer via `offset` si supporté, ou augmenter `limit` sur les lister_*). Optional sur les tools de listing exhaustif (lister_*).
query_metadataNoMetadata de la query (radius_km, departement, filtres appliqués, …).
activite_hebergeeNoCompte juxtaposé des sites hébergeant l'activité correspondant à la famille filtrée, sous une autre catégorie FINESS. Distinct du `count` principal — lire `note` pour comprendre la sémantique et ne JAMAIS additionner les deux comptes sans préciser leur nature.
Behavior5/5

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

Adds substantial behavioral context beyond annotations: pagination details, scope (libéraux conventionnés only), exclusions, source and update frequency, and consequence of mixing codes (empty response).

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?

Well-structured with clear sections: purpose, warnings, referentiel details, pagination, scope. Every sentence adds value; slightly long but not verbose for the complexity.

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?

Highly complete given tool complexity: explains all parameters, pitfalls, scope, exclusions, source, and update frequency. No gaps identified.

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% with descriptions for all 5 parameters. The description adds value by explaining referentiel-specific contexts (e.g., profession_code only for rpps_savoir_faire) and pagination behavior, justifying above-baseline score.

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?

Clearly states the tool lists nomenclature codes from the server, with specific verb 'Découverte des nomenclatures' and resource. Distinguishes from siblings by being a prerequisite for filtering 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?

Explicitly instructs to call before filtering rather than guessing codes, warns about distinct nomenclatures and not mixing codes. Provides precise usage for each référentiel and which sibling tools they apply to.

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

panorama_implantation_completA
Read-onlyIdempotent
Inspect

Étude d'implantation labo en 1 appel (V0.23). Géocode l'adresse cible puis agrège EN PARALLÈLE 7 sections : territoire (densités PS commune vs national + établissements), demande (profil démographique du BASSIN — rayon — via profil_iris : âge, CSP, revenu pondéré), concurrents (labos FINESS), pourvoyeurs (MCO/EHPAD/SSR/dialyse — drivers écosystémiques), prescripteurs (médecins RPPS + IDEL Ameli), cds (centres de santé), referentiels (qualité couverture FINESS↔SIRENE).

Remplace ~15 appels MCP individuels par 1. Renvoie des RÉSUMÉS (count / top-N / moyenne), JAMAIS de listes brutes. AUCUNE interprétation métier (pas de 'désert médical' ni de verdict GO/NO-GO) — le caller LLM applique sa grille.

DÉGRADATION (lis couverture — 1 drapeau par section) : "ok" | "partiel:<raison>" | "indisponible:<raison>". Si une source est down, SA section est flaggée et le RESTE est renvoyé — comble alors le trou via l'outil unitaire correspondant (etablissements_finess_in_radius, professionnels_rpps_in_radius, densite_sante, centres_sante_in_radius…). Échec d'ANCRAGE (géocodage KO / adresse douteuse / code INSEE indérivable) = rejet total (RangeError).

Pièges internalisés : Paris/Lyon/Marseille basculés sur le département (meta.plm_mode=true) ; prescripteurs expose precis_count (PS géolocalisés à l'adresse, pas au centroïde commune) ; cds sans distance individuelle (centroïde commune).

WORKFLOW : appelle CET outil pour DÉMARRER une étude, puis creuse les sections partiel/indisponible via les unitaires, puis enrichir_concurrents sur le top 3 de concurrents.top.

Sources : IGN (géocodage), FINESS DREES, RPPS/ANS, Ameli/CNAM, INSEE/FILOSOFI, SIRENE/DINUM.

ParametersJSON Schema
NameRequiredDescriptionDefault
pointNoCoordonnées { lat, lon } si déjà connues (skip géocodage). Fournir `code_insee` avec.
adresseNoAdresse cible, géocodée en interne via IGN. Ex: "12 rue Nationale, Lille". XOR avec `point`.
rayon_kmNoRayon du bassin de l'étude (km). Défaut 5.
code_inseeNoCode INSEE commune (avec `point`, quand le géocodage est déjà fait).
Behavior5/5

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

The description goes well beyond annotations by detailing degradation mechanism with couverture flags, return format (summaries only), special handling for Paris/Lyon/Marseille (plm_mode=true), precision of prescripteurs counts, and the total rejection on geocoding failure (RangeError). Annotations already indicate readOnly, idempotent, non-destructive; description adds crucial behavioral context.

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 is informative. It is front-loaded with the core purpose, then details each section, degradation, pitfalls, and workflow. No fluff; each word earns its place. Structure is logical and easy to parse.

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 (7 sections, degradation, fallback), the description is remarkably complete. It explains what each section contains, how to interpret couverture flags, when to use fallbacks, and the workflow for post-processing. The output format is adequately described as summaries only. No gaps that would leave an agent guessing.

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?

The input schema already has detailed descriptions (100% coverage). The main description adds value by explaining the XOR relationship between point and adresse, the default rayon_km of 5, and that geocoding uses IGN. It also clarifies that code_insee is needed with point. This complements the schema without being redundant.

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: a comprehensive lab implantation study that aggregates 7 sections in parallel, replacing ~15 individual MCP calls. It specifies the verb ('Étude d'implantation labo'), the resource (address, geocoding, and data sections), and distinguishes it from siblings by being the composite entry point.

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 tells when to use this tool: as the first call to start a study, then follow up with individual tools for partial/indisponible sections and 'enrichir_concurrents' for the top 3 competitors. It also states that this replaces ~15 individual calls, guiding the agent to prefer this over many siblings.

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

panorama_sante_territoireA
Read-onlyIdempotent
Inspect

Panorama santé d'une commune française en 1 appel (V0.9). Agrège en parallèle : population (INSEE Melodi), densités médecins + infirmiers + pharmaciens avec comparaison nationale (méthodo DREES), nombre d'établissements FINESS par famille (default ["labo","pharmacie","ehpad","mco","msp_cpts"]), et un bloc DEMANDE (V0.22.0 — profil démographique de la commune agrégé depuis ses IRIS : âge, CSP, familles, revenu pondéré, à CROISER avec l'OFFRE ci-dessus pour l'aide à l'implantation ; demande: null si commune hors couverture IRIS (DOM non ingéré) — pour le détail au quartier ou un bassin par rayon, utiliser profil_iris).

Remplace 7-10 appels MCP individuels par 1 seul. Ne renvoie AUCUNE interprétation métier (pas de qualification automatique 'désert médical') — le caller LLM applique sa grille.

V0.19.0 : accepte nom_commune (string) comme alternative à code_insee. departement (V0.19) = hint resolver UNIQUEMENT (panorama ne calcule pas par dept ; un departement seul lève une erreur explicite).

Granularité mixte : les densités professionnels et la population sont calculées au niveau commune ; le décompte FINESS est agrégé au niveau département dérivé du code INSEE (limitation V0.9 — pas de RPC count_finess_by_commune encore). Le champ niveauEtablissements du résultat indique "departement" (succès), "indisponible" (dept indérivable, ex code DOM tronqué) — utiliser cette information pour ne pas confondre ratios commune et dept.

Paris/Marseille/Lyon NON supporté : le panorama par commune dépend de la densité par commune, indisponible pour ces villes (INSEE n'expose la population qu'à la commune entière, les praticiens RPPS aux arrondissements). Un code PLM (commune-mère 75056 ou arrondissement) lève une RangeError. Pour ces villes, interroger les tools individuels au niveau code_dept (75/69/13).

Alias acceptés : codeInsee/insee/codecode_insee.

Sources : RPPS / Annuaire Santé ANS (mensuel), FINESS DREES (bimensuel), INSEE Melodi (PMUN 2023).

ParametersJSON Schema
NameRequiredDescriptionDefault
code_inseeNoCode INSEE de la commune 5 caractères. Ex: "59009" Villeneuve-d'Ascq, "33063" Bordeaux, "2A004" Ajaccio. Paris/Lyon/Marseille NON supporté (voir description). XOR avec `nom_commune`.
departementNoCode département INSEE (V0.19, hint resolver UNIQUEMENT). À utiliser EN COMBINAISON avec `nom_commune` pour désambiguer les homonymes. Seul, lève une erreur (panorama = calcul commune uniquement, utiliser `code_insee` ou `nom_commune`).
nom_communeNoNom officiel de commune (alternative à `code_insee`, V0.19). Ex: "Lille", "Saint-Étienne". Combinable avec `departement` comme hint de désambiguïsation pour homonymes (ex "Saint-Martin" + dept "65"). Abréviations type "St-Martin" non reconnues.
finess_famillesNoFamilles FINESS à inclure dans le décompte établissements. Default ["labo","pharmacie","ehpad","mco","msp_cpts"]. Passer [] pour omettre le décompte FINESS (renvoie uniquement population + densités PS).
Behavior5/5

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

Discloses that no business interpretation is returned (no 'désert médical'), explains mixed granularity (commune vs department), limitations for Paris/Marseille/Lyon, and alias handling. Annotations confirm read-only, open world, idempotent, non-destructive. Description adds significant context beyond 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?

Well-structured with clear sections and bullet points, but slightly lengthy. However, every sentence provides value, and the structure aids readability.

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 (multiple data sources, mixed granularity, limitations, no output schema), the description covers all necessary context: sources, update frequency, limitations, fallback behavior, and return field interpretation.

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?

Schema description coverage is 100% for both parameters. Description adds default values for finess_familles, explains how to omit FINESS, and documents alias variants for code_insee. This adds meaning beyond 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 clearly states it aggregates health data for a French commune in one call, specifies data sources (INSEE, FINESS, DREES), and claims to replace 7-10 individual MCP calls, distinguishing it from sibling 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?

Explicitly says when to use (for commune panorama), when not (Paris/Marseille/Lyon: use densite_professionnels_sante), and provides guidance on interpreting the niveauEtablissements field to avoid confusion between commune and department ratios.

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

populationA
Read-onlyIdempotent
Inspect

Population d'une COMMUNE (code INSEE 5 car.), d'un DÉPARTEMENT (2-3 car.) OU d'un IRIS infracommunal (9 car.) — granularité auto-détectée par la longueur du code. Retourne un LookupResult discriminé par found.

  • IRIS (9 car., ex 751103701 = commune 75110 + IRIS 3701) : population totale du quartier au Recensement 2022 (champ population, comptes bruts), + libelle, code_commune, type_iris (H/A/D/Z). Source : INSEE RP 2022 (table ingérée, géo 01/01/2024). Maille la plus fine (quartier) pour les villes ; en zone peu dense la commune = 1 IRIS (type_iris Z, code COM+0000). Pour le profil démographique détaillé d'un îlot ou d'un bassin (âge, CSP, familles, revenu), utiliser profil_iris.

  • Commune (5 car., ex 75056 Paris, 13055 Marseille, 2A004 Ajaccio) : PMUN/PCAP/PTOT. Source INSEE Melodi (DS_POPULATIONS_REFERENCE). PMUN = base légale DREES. Commune fusionnée → found: false + orientation autocomplete_commune. INSEE n'expose PAS les arrondissements PLM (75101-75120, 13201-13216, 69381-69389) → passer la commune-mère ou le département.

  • Département (2-3 car., ex 75, 59, 2A, 971) : Mayotte (976) ABSENTE de Melodi → lookupNotFound.

Alias acceptés : code_insee/codeInsee/insee, code_dept/dept/departement/code_departement, code_iris/iriscode.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYesCode INSEE — 5 caractères = commune (ex "75056"), 2-3 caractères = département (ex "75", "971", "2A"). Granularité auto-détectée par la longueur.

Output Schema

ParametersJSON Schema
NameRequiredDescription
keyNoClé recherchée (SIREN, num_finess, code INSEE, …).
foundYes
messageNoExplication actionnable quand `found=false` (cause probable + remédiation).
lookupStatusYes
Behavior5/5

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

Annotations declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false. The description adds behavioral context: it explains the auto-detection of granularity, the return type (LookupResult discriminated by found), and specific cases like lookupNotFound for Mayotte. No contradictions 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 well-structured with a clear main sentence followed by bullet points for details. It front-loads the purpose but includes some redundant phrasing (e.g., repeated code length explanations). Could be slightly tighter, but overall very effective.

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 required parameter, existing output schema, and comprehensive annotations, the description still adds substantial context: edge cases (arrondissements, Mayotte), alternative tool references, data source, and legal usage of PMUN. It leaves no ambiguity about what the tool does and when to use alternatives.

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% for the 'code' parameter, providing a baseline of 3. The description adds value by listing accepted aliases (code_insee, codeInsee, insee, etc.) and explaining the auto-detection logic based on code length, which is useful for agents. Thus, score 4.

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 returns population data for a commune or department based on INSEE code, specifying the three population metrics (PMUN, PCAP, PTOT). It distinguishes itself from siblings by being a specialized population lookup, not a general geographic or health facility tool.

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 tells when to use this tool (population lookup) and provides guidance on what to do when a commune has merged (use autocomplete_commune) or when data is absent (Mayotte). It also notes that arrondissements are not supported, guiding the agent to use the mother commune or department code.

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

professionnel_by_rppsA
Read-onlyIdempotent
Inspect

Récupère la fiche complète d'un PS par identifiant national (rpps_id / IDNPS, 11 ou 12 chiffres — IDs émis depuis 2020 ont un préfixe "81" = 12 chars ; anciens IDs = 11 chars). Renvoie N entrées quand le PS exerce sur plusieurs sites (1 par site, chacun avec sa propre geo_precision — un même PS peut donc cumuler un site précis FINESS et un site au centroïde commune).

Chaque résultat géolocalisé porte geo_precision ∈ {"adresse", "etablissement_finess", "centroide_commune"} — lire ce champ pour évaluer la fiabilité des coords (précise BAN/FINESS au m près vs centroïde commune ~3 km, non discriminant intra-commune).

Fallback automatique sur l'API FHIR ANS live (gateway.api.esante.gouv.fr/fhir/v2) si non trouvé en base locale (snapshot mensuel J-30 max). Le champ source distingue db (base locale) de ans_fhir (live). include_freshness n'affecte que source: "db". Source : Annuaire Santé, Agence du Numérique en Santé (ANS) — Licence Ouverte v2.0

ParametersJSON Schema
NameRequiredDescriptionDefault
rpps_idYes
include_freshnessNoSi true, ajoute un champ `data_freshness` au payload (dans `query_metadata` si présent, sinon à la racine) listant la dernière ingestion réussie par source (FINESS, Ameli, RPPS, CDS) avec `staleness_days`. Opt-in pour ne pas alourdir les payloads par défaut. Cache 5min côté serveur — coût négligeable.

Output Schema

ParametersJSON Schema
NameRequiredDescription
keyNoClé recherchée (SIREN, num_finess, code INSEE, …).
foundYes
messageNoExplication actionnable quand `found=false` (cause probable + remédiation).
lookupStatusYes
Behavior5/5

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

The description adds significant behavioral context beyond the annotations (readOnlyHint, idempotentHint, etc.). It details fallback logic to the FHIR ANS API with freshness specifications (monthly ingestion for db, daily for ans_fhir), the 'source' field behavior, and the 'include_freshness' parameter effects. 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 comprehensive but not overly verbose. It front-loads the core purpose and ID format, then provides details on multiplicity, fallback, and parameters. Each sentence adds value, though it could be slightly more concise by grouping related technical details.

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 (multi-site, fallback, freshness parameter) and the presence of an output schema, the description covers all necessary aspects: ID format, behavior when multiple sites, fallback mechanism, source field, freshness parameter effect, API key requirement, and data license. It is complete and well-rounded.

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?

The description adds meaning beyond the schema for the 'rpps_id' parameter by explaining the 11/12 character format and the '81' prefix for modern IDs. For 'include_freshness', it clarifies that it only affects 'source: db' results. Since schema description coverage is 50% (include_freshness has a schema description, rpps_id does not), the description compensates well.

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 retrieves a healthcare professional's profile by national ID (rpps_id/IDNPS). It specifies the ID format (11-12 digits, with prefix '81' for modern IDs) and notes it returns multiple rows if the professional practices at multiple sites. This distinguishes it from sibling tools like 'rpps_search_by_name' (name-based search) and 'professionnels_rpps_in_radius' (geographic search).

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 implies when to use: when you have an exact rpps_id and need the professional's details. It explains fallback behavior (local DB then FHIR ANS) and the source distinction. However, it does not explicitly state when not to use it (e.g., for name-based lookups use 'rpps_search_by_name') or provide alternative tools; but the context makes it clear enough.

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

professionnels_in_radiusA
Read-onlyIdempotent
Inspect

Recherche de professionnels de santé libéraux conventionnés dans un rayon géographique. Précision géo HYBRIDE depuis le géocodage BAN (Chantier C) : ~77 % des PS sont géolocalisés à l'adresse précise (rue/bâtiment, distance_km exacte au m près), ~23 % restent au centroïde commune (~3 km, repli pour adresses non géocodables — DROM, Monaco, CEDEX, lieux-dits). Lire geo_precision PAR résultat — ne pas présumer une précision uniforme. Codes type_ps Ameli présents en base (3) : '1' médecins, '2' auxiliaires médicaux (fourre-tout : IDE, kinés, sages-femmes, podologues, orthophonistes, orthoptistes, IPA), '5' chirurgiens-dentistes. Pour cibler une profession précise (ex: IDE seuls, kinés seuls, podologues seuls), passer par specialite_codes plutôt que type_ps_codes qui ratisse plus large. Liste exhaustive des codes spécialité disponibles via le tool lister_nomenclature(referentiel:'ameli_specialites'). Multi-sites : par défaut un PS exerçant sur N adresses apparaît N fois — utiliser dedupe_by_ps=true pour regrouper par praticien et lister les sites en sous-objet. Distance retournée en km vol d'oiseau (haversine PostGIS) — pour distance routière, croiser avec un service externe (OSRM, ORS). Chaque PS géolocalisé porte geo_precision ∈ {"adresse", "centroide_commune"} : "adresse" = coords BAN précises, distance_km exacte, classement individuel fiable ; "centroide_commune" = ~3 km, distance_km IDENTIQUE pour tous les PS d'une même commune (non discriminante intra-commune — filtre de zone uniquement, pas de classement/choix d'un PS individuel). Param precise_only (défaut false) : à true, exclut les PS au centroïde commune et ne renvoie que les ~77 % géocodés à l'adresse BAN (distance_km exacte) — recommandé pour les rayons courts (<3 km) et le classement intra-commune. PÉRIMÈTRE : libéraux conventionnés UNIQUEMENT. HORS PÉRIMÈTRE : médecins exclusivement hospitaliers/salariés, biologistes médicaux salariés en LBM, anatomopathologistes hospitaliers, médecins du travail, médecine légale. Pour effectifs tous statuts, voir Annuaire Santé ANS (RPPS, esante.gouv.fr) — non couvert par ce serveur. Source : Annuaire santé Ameli (Assurance Maladie), MAJ hebdomadaire. Réutilisation soumise à l'art. L.1461-2 CSP — citer la source et la date de sync.

ParametersJSON Schema
NameRequiredDescriptionDefault
latYesLatitude du centre (WGS84).
lonYesLongitude du centre (WGS84).
limitNoNombre max de résultats (1-500, défaut 100). Appliqué AVANT déduplication.
radius_kmNoRayon en km (0.1-50, défaut 5).
dedupe_by_psNoRegrouper les entrées par praticien (nom + prénom + code spécialité) et lister chaque adresse d'exercice dans `sites[]`. Défaut false (comportement V0.4 historique : un PS multi-sites = N entrées).
precise_onlyNoSi true, exclut les PS au centroïde commune et ne renvoie que ceux géocodés à l'adresse BAN, à `distance_km` exacte (cf. description du tool pour la sémantique complète). Défaut false.
type_ps_codesNoListe de codes type PS Ameli (3 valeurs présentes en base : '1' médecins, '2' auxiliaires médicaux fourre-tout — IDE/kinés/sages-femmes/podologues/orthophonistes/orthoptistes/IPA, '5' chirurgiens-dentistes). Pour cibler une seule profession, préférer `specialite_codes`. Si omis, tous types.
specialite_codesNoListe de codes spécialité Ameli (ex: ['01'] MG, ['03'] cardio). Si omis, toutes spécialités.
include_freshnessNoSi true, ajoute un champ `data_freshness` au payload (dans `query_metadata` si présent, sinon à la racine) listant la dernière ingestion réussie par source (FINESS, Ameli, RPPS, CDS) avec `staleness_days`. Opt-in pour ne pas alourdir les payloads par défaut. Cache 5min côté serveur — coût négligeable.

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYesNombre d'entrées retournées dans `results` (post-troncature).
totalNoEffectif réel avant troncature. Présent sur les tools de nomenclature paginés (lister_*) : `count` = échantillon, `total` = total réel, re-appeler avec un `limit` supérieur si `truncated`.
resultsYesEntrées métier (shape spécifique au tool, cf. description du tool).
freshnessNoFraîcheur des sources (présent si `include_freshness: true`).
perimetreNoLentille de la source : ce que le comptage inclut/exclut. Lire `completeness_note` et la restituer au lecteur final.
truncatedNotrue si le total réel dépasse `limit` (re-paginer via `offset` si supporté, ou augmenter `limit` sur les lister_*). Optional sur les tools de listing exhaustif (lister_*).
query_metadataNoMetadata de la query (radius_km, departement, filtres appliqués, …).
activite_hebergeeNoCompte juxtaposé des sites hébergeant l'activité correspondant à la famille filtrée, sous une autre catégorie FINESS. Distinct du `count` principal — lire `note` pour comprendre la sémantique et ne JAMAIS additionner les deux comptes sans préciser leur nature.
Behavior5/5

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

Beyond annotations (readOnly, openWorld, idempotent, non-destructive), the description adds key behavioral details: geolocation precision (~3 km), distance type (haversine), deduplication behavior, data source and update frequency (weekly), and copyright 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.

Conciseness5/5

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

The description is efficiently structured: starts with a clear purpose sentence, then proceeds logically through precision, parameter usage, dedup, distance, perimeter, and source. Every sentence adds unique value with no redundancy. Though lengthy, it earns its length through completeness.

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?

Considering the 8 parameters, output schema presence, and complexity, the description covers all necessary context: geolocation precision, parameter interplay, perimeter inclusion/exclusion, data freshness, and linkage to sibling tools. It leaves no significant gap for the agent to infer.

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?

With 100% schema description coverage, the description adds significant value by explaining the meaning of type_ps_codes (listing the three codes and their catch-all nature), dedupe_by_ps (default behavior and structure), include_freshness (effect on payload), and referencing sibling tool for specialite_codes. This goes well beyond the schema's basic descriptions.

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: searching for liberal health professionals (conventionnés) within a geographic radius. It specifies the resource (professionnels de santé libéraux conventionnés), distinguishes from sibling tools by mentioning the Ameli source and scope, and includes precise geolocation accuracy notes.

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?

Explicit guidance is provided: when to use specialite_codes over type_ps_codes, how dedupe_by_ps works, and when to use external services for driving distance. It also clearly defines the perimeter (libéraux conventionnés only) and lists what is not covered, directing users to alternative sources like RPPS.

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

professionnels_par_specialite_deptA
Read-onlyIdempotent
Inspect

Liste des professionnels de santé libéraux conventionnés d'un département, avec filtres optionnels par spécialité ou type de PS. Pour énumération administrative — pas de rayon. Codes type_ps Ameli présents en base (3) : '1' médecins, '2' auxiliaires médicaux (fourre-tout : IDE, kinés, sages-femmes, podologues, orthophonistes, orthoptistes, IPA), '5' chirurgiens-dentistes. Pour cibler une profession précise (ex: IDE seuls), passer par specialite_code plutôt que type_ps_code qui ratisse plus large. Liste exhaustive des codes spécialité disponibles via le tool lister_nomenclature(referentiel:'ameli_specialites'). Pagination : utiliser offset pour récupérer les pages suivantes quand truncated=true. Multi-sites : utiliser dedupe_by_ps=true pour regrouper par praticien. PÉRIMÈTRE : libéraux conventionnés UNIQUEMENT. HORS PÉRIMÈTRE : médecins exclusivement hospitaliers/salariés, biologistes médicaux salariés en LBM, anatomopathologistes hospitaliers, médecins du travail, médecine légale. Pour effectifs tous statuts, voir Annuaire Santé ANS (RPPS, esante.gouv.fr) — non couvert par ce serveur. Source : Annuaire santé Ameli (Assurance Maladie), MAJ hebdomadaire. Réutilisation soumise à l'art. L.1461-2 CSP — citer la source et la date de sync.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoNombre max de résultats (1-500, défaut 100). Appliqué AVANT déduplication.
offsetNoDécalage de pagination (≥ 0, défaut 0). Combiner avec `limit` pour énumérer un département à fort effectif. Re-paginer tant que `truncated=true`.
departementYesCode département INSEE : 2 caractères métropole/Corse ('01'-'95', '2A'/'2B'), 3 caractères DOM ('971'-'978').
dedupe_by_psNoRegrouper les entrées par praticien (nom + prénom + code spécialité) et lister chaque adresse d'exercice dans `sites[]`. Défaut false.
type_ps_codeNoCode type PS Ameli ('1' médecins, '2' auxiliaires médicaux, '5' chirurgiens-dentistes). Optionnel — préférer `specialite_code` pour un ciblage précis. Liste complète via `lister_nomenclature(referentiel:'ameli_types_ps')`.
specialite_codeNoCode spécialité Ameli (ex: '01' MG, '24' IDE, '26' kiné, '03' cardio). Optionnel. Liste complète via `lister_nomenclature(referentiel:'ameli_specialites')`.
include_freshnessNoSi true, ajoute un champ `data_freshness` au payload (dans `query_metadata` si présent, sinon à la racine) listant la dernière ingestion réussie par source (FINESS, Ameli, RPPS, CDS) avec `staleness_days`. Opt-in pour ne pas alourdir les payloads par défaut. Cache 5min côté serveur — coût négligeable.

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYesNombre d'entrées retournées dans `results` (post-troncature).
totalNoEffectif réel avant troncature. Présent sur les tools de nomenclature paginés (lister_*) : `count` = échantillon, `total` = total réel, re-appeler avec un `limit` supérieur si `truncated`.
resultsYesEntrées métier (shape spécifique au tool, cf. description du tool).
freshnessNoFraîcheur des sources (présent si `include_freshness: true`).
perimetreNoLentille de la source : ce que le comptage inclut/exclut. Lire `completeness_note` et la restituer au lecteur final.
truncatedNotrue si le total réel dépasse `limit` (re-paginer via `offset` si supporté, ou augmenter `limit` sur les lister_*). Optional sur les tools de listing exhaustif (lister_*).
query_metadataNoMetadata de la query (radius_km, departement, filtres appliqués, …).
activite_hebergeeNoCompte juxtaposé des sites hébergeant l'activité correspondant à la famille filtrée, sous une autre catégorie FINESS. Distinct du `count` principal — lire `note` pour comprendre la sémantique et ne JAMAIS additionner les deux comptes sans préciser leur nature.
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint. The description adds operational context: source (Ameli), update frequency (weekly), legal reuse requirements, and pagination behavior with `truncated=true`. 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 well-organized with clear sections, but somewhat lengthy. Each sentence adds value (scope, filters, pagination, deduplication, source, legal). Could be slightly more concise, but structure is good and information 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?

Given the tool's complexity (7 params, 1 required), the description is highly complete. It covers scope, out-of-scope, pagination, deduplication, source, legal note, and references a sibling tool for code lists. Output schema exists, so return values need not be described.

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% with good descriptions. The description adds meaning beyond schema by explaining `type_ps_code` values, the distinction between type and specialty codes, how to use `offset` for pagination, and `dedupe_by_ps` for multi-sites. This justifies a slightly higher score than baseline 3.

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 it lists liberal health professionals in a department with optional filters, distinguishes itself from radius-based tools, and contrasts with sibling tools like `lister_specialites_ameli`. The verb 'list' and resource 'professionnels de santé libéraux conventionnés' are specific.

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 provides when to use (administrative enumeration), when not to use (for hospital/salaried or all statuses), and alternatives (Annuaire Santé ANS, or `lister_specialites_ameli` for codes). Gives guidance on choosing `specialite_code` over `type_ps_code` and explains pagination with `offset`.

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

professionnels_rpps_in_radiusA
Read-onlyIdempotent
Inspect

Trouve les PS dans un rayon via RPPS (Annuaire Santé ANS — tous statuts : libéraux + salariés + mixtes + remplaçants ; vs professionnels_in_radius Ameli = libéraux conventionnés seuls).

Param critique precise_only — Défaut false (mode hybride). À true : ne renvoie que les PS géolocalisés précisément (distance_km exacte au m près) — recommandé pour rayons courts (<3 km), classement intra-commune, "PS à <500 m d'une adresse".

Chaque résultat porte geo_precision ∈ :

  • "adresse" — coords BAN rue/lieu-dit/bâtiment, distance_km exacte.

  • "etablissement_finess" — coords du site FINESS (via num_finess), distance_km exacte au site.

  • "centroide_commune" — centroïde commune (~3 km), distance_km IDENTIQUE pour tous les PS de la commune — ne PAS l'utiliser pour classer individuellement, seulement comme filtre de zone.

Couverture actuelle : ~68,5 % précis, ~31,5 % centroide_commune résiduel. Mode hybride = précis (granularité adresse) + centroïde (granularité commune) fusionnés et triés globalement par distance_km.

Filtres : profession_codes (ex: ["10"] Médecin, ["60"] Infirmier), savoir_faire_codes (spécialité fine DES/DESC), mode_exercice_codes. Codes mode_exercice ANS : L libéral, S salarié, M mixte, R remplaçant, B bénévole, A autre. Catégorie par défaut : Civil (C, ~97 % — libéraux, salariés privés, hospitaliers contractuels). Opt-in : include_agents_publics: true ajoute Agents publics (M, ~0,3 % — PH titulaires, ARS, CNAM, Éducation nationale, PMI, militaires SSA) ; include_etudiants: true ajoute Étudiants (E, ~2,5 % — internes, externes, élèves IDE/SF). Réf : https://mos.esante.gouv.fr/NOS/TRE_R09-CategorieProfessionnelle/. ATTENTION nomenclatures : les codes ANS (profession_code, savoir_faire_code) sont une nomenclature DISTINCTE des codes Ameli (specialite_code, type_ps_code) — un même nombre désigne des choses différentes (ex: '10' = Médecin côté ANS, Neurochirurgien côté Ameli). Ne JAMAIS passer un code Ameli à un paramètre ANS : le filtre renverrait vide sans erreur. Découvrir les codes ANS via lister_nomenclature(referentiel:'rpps_savoir_faire'). Source : Annuaire Santé, Agence du Numérique en Santé (ANS) — Licence Ouverte v2.0

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoNombre max de résultats retournés (défaut serveur 100).
centerYesCentre du cercle de recherche (coordonnées WGS84).
radius_kmYesRayon en km (0.1-50).
precise_onlyNoSi true, exclut les PS au centroïde commune et ne renvoie que ceux à `distance_km` exacte (cf. description du tool pour la sémantique complète et le seuil d'usage recommandé). Défaut false.
profession_codesNoCodes profession ANS (ex: ['10'] Médecin, ['60'] Infirmier). Si omis, toutes professions.
include_etudiantsNo
include_freshnessNoSi true, ajoute un champ `data_freshness` au payload (dans `query_metadata` si présent, sinon à la racine) listant la dernière ingestion réussie par source (FINESS, Ameli, RPPS, CDS) avec `staleness_days`. Opt-in pour ne pas alourdir les payloads par défaut. Cache 5min côté serveur — coût négligeable.
savoir_faire_codesNoCodes savoir-faire ANS (spécialités fines DES/DESC). Si omis, tous savoir-faire.
mode_exercice_codesNoCodes mode d'exercice ANS (libéral / salarié / mixte). Si omis, tous modes.
include_agents_publicsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYesNombre d'entrées retournées dans `results` (post-troncature).
totalNoEffectif réel avant troncature. Présent sur les tools de nomenclature paginés (lister_*) : `count` = échantillon, `total` = total réel, re-appeler avec un `limit` supérieur si `truncated`.
resultsYesEntrées métier (shape spécifique au tool, cf. description du tool).
freshnessNoFraîcheur des sources (présent si `include_freshness: true`).
perimetreNoLentille de la source : ce que le comptage inclut/exclut. Lire `completeness_note` et la restituer au lecteur final.
truncatedNotrue si le total réel dépasse `limit` (re-paginer via `offset` si supporté, ou augmenter `limit` sur les lister_*). Optional sur les tools de listing exhaustif (lister_*).
query_metadataNoMetadata de la query (radius_km, departement, filtres appliqués, …).
activite_hebergeeNoCompte juxtaposé des sites hébergeant l'activité correspondant à la famille filtrée, sous une autre catégorie FINESS. Distinct du `count` principal — lire `note` pour comprendre la sémantique et ne JAMAIS additionner les deux comptes sans préciser leur nature.
Behavior4/5

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

Annotations already indicate read-only and idempotent behavior. The description adds value by explaining coordinate accuracy (centroids ~3km), the need to cross-reference num_finess for precise addresses, and the default category plus optional includes (agents publics, étudiants). This goes beyond 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 detailed, which is justified given the complexity (9 parameters, multiple categories). However, it could be more concise; some details like percentages and source URLs, while useful, add length. The front-loading is good.

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 and the presence of an output schema, the description covers all critical aspects: differentiation, parameter defaults, coordinate caveats, data freshness opt-in, and data source. It leaves no major gaps for an AI agent to understand usage and limitations.

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?

With 78% schema coverage, the description significantly enriches parameter meaning: examples for profession_codes, ANS codes for mode_exercice_codes, detailed explanation of include_agents_publics and include_etudiants with percentages. It also links to the nomenclature source, providing context the schema alone lacks.

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 it searches for health professionals via RPPS, using the verb 'Recherche' and specifying the resource. It immediately distinguishes itself from the sibling 'professionnels_in_radius' by noting it covers all professionals (liberals, salaried, etc.), making 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.

Usage Guidelines4/5

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

The description provides explicit guidance on when to use this over the sibling, explaining the filtration difference. It details parameter usage (e.g., profession_codes, mode_exercice_codes) and defaults (only civil category). However, it does not explicitly state when not to use this tool beyond the sibling comparison.

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

professionnels_rpps_par_deptA
Read-onlyIdempotent
Inspect

Liste tous les PS d'un département via RPPS (libéraux + salariés). Pour les libéraux conventionnés uniquement, préférer professionnels_par_specialite_dept (Ameli). Re-paginer via offset tant que truncated=true.

Chaque résultat géolocalisé porte geo_precision ∈ {"adresse", "etablissement_finess", "centroide_commune"} — lire ce champ pour évaluer la fiabilité des coords (précise BAN/FINESS au m près vs centroïde commune ~3 km, non discriminant intra-commune).

Filtres optionnels : profession_code, savoir_faire_code, mode_exercice_code. Catégorie par défaut : Civil (C, ~97 % — libéraux, salariés privés, hospitaliers contractuels). Opt-in : include_agents_publics: true ajoute Agents publics (M, ~0,3 % — PH titulaires, ARS, CNAM, Éducation nationale, PMI, militaires SSA) ; include_etudiants: true ajoute Étudiants (E, ~2,5 % — internes, externes, élèves IDE/SF). Réf : https://mos.esante.gouv.fr/NOS/TRE_R09-CategorieProfessionnelle/. ATTENTION nomenclatures : les codes ANS (profession_code, savoir_faire_code) sont une nomenclature DISTINCTE des codes Ameli (specialite_code, type_ps_code) — un même nombre désigne des choses différentes (ex: '10' = Médecin côté ANS, Neurochirurgien côté Ameli). Ne JAMAIS passer un code Ameli à un paramètre ANS : le filtre renverrait vide sans erreur. Découvrir les codes ANS via lister_nomenclature(referentiel:'rpps_savoir_faire'). Source : Annuaire Santé, Agence du Numérique en Santé (ANS) — Licence Ouverte v2.0

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoNombre max de résultats par page (défaut serveur 100).
offsetNoOffset pour pagination (défaut 0). Re-paginer tant que `truncated=true`.
departementYesCode département INSEE (ex: '75', '2A', '2B', '971'). Métropole 2 caractères (Corse '2A'/'2B', pas '20'), DOM/TOM 3 caractères.
profession_codeNoCode profession ANS (ex: '10' Médecin, '60' Infirmier). Optionnel.
include_etudiantsNo
include_freshnessNoSi true, ajoute un champ `data_freshness` au payload (dans `query_metadata` si présent, sinon à la racine) listant la dernière ingestion réussie par source (FINESS, Ameli, RPPS, CDS) avec `staleness_days`. Opt-in pour ne pas alourdir les payloads par défaut. Cache 5min côté serveur — coût négligeable.
savoir_faire_codeNoCode savoir-faire ANS (spécialité fine DES/DESC). Optionnel.
mode_exercice_codeNoCode mode d'exercice ANS (libéral / salarié / mixte). Optionnel.
include_agents_publicsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYesNombre d'entrées retournées dans `results` (post-troncature).
totalNoEffectif réel avant troncature. Présent sur les tools de nomenclature paginés (lister_*) : `count` = échantillon, `total` = total réel, re-appeler avec un `limit` supérieur si `truncated`.
resultsYesEntrées métier (shape spécifique au tool, cf. description du tool).
freshnessNoFraîcheur des sources (présent si `include_freshness: true`).
perimetreNoLentille de la source : ce que le comptage inclut/exclut. Lire `completeness_note` et la restituer au lecteur final.
truncatedNotrue si le total réel dépasse `limit` (re-paginer via `offset` si supporté, ou augmenter `limit` sur les lister_*). Optional sur les tools de listing exhaustif (lister_*).
query_metadataNoMetadata de la query (radius_km, departement, filtres appliqués, …).
activite_hebergeeNoCompte juxtaposé des sites hébergeant l'activité correspondant à la famille filtrée, sous une autre catégorie FINESS. Distinct du `count` principal — lire `note` pour comprendre la sémantique et ne JAMAIS additionner les deux comptes sans préciser leur nature.
Behavior4/5

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

Annotations already declare readOnly, openWorld, and idempotent hints. The description adds detailed behavioral context: default category Civil, optional inclusion of public agents and students, source of nomenclature, pagination details, and the include_freshness parameter. 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.

Conciseness4/5

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

The description is thorough and front-loaded with purpose and alternatives, but it is somewhat lengthy with detailed category breakdowns. Every sentence adds value, but could be more 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 complexity (9 parameters, 1 required, output schema present), the description covers usage, filters, categories, pagination, and alternative tools completely. The output schema handles return values, so no need to detail them.

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 78% (high), and the schema already documents each parameter. The description reiterates the optional filters and pagination but does not add significant meaning beyond what the schema provides, so baseline scoring 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 clearly states it lists health professionals by department via RPPS, specifies it includes both liberal and salaried professionals, and distinguishes from the sibling tool 'professionnels_par_specialite_dept' by noting its specific use case for counting or listing salaried/total workforce.

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 advises preferring 'professionnels_par_specialite_dept' for conventioned liberals, and states this tool is for counting or listing salaried/total workforce. It also explains optional filters and default inclusion categories, providing clear when-to-use guidance.

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

profil_irisA
Read-onlyIdempotent
Inspect

Profil démographique au grain QUARTIER (IRIS) — la « demande » d'un territoire (âge, CSP, familles, revenu), à croiser avec l'offre de soins pour l'aide à l'implantation. Source : INSEE RP 2022 + FILOSOFI 2021 (tables ingérées, géo 01/01/2024). Retourne un LookupResult discriminé par found.

Entrée : EXACTEMENT un de point (lat+lon) OU code_iris (9 car.). rayon_km optionnel (0 < r ≤ 10) → DEUX modes :

  • SANS rayon_km → profil de l'ÎLOT seul (~2000 hab) sous le point / du code. mode: "ilot", revenu_median = médiane réelle de l'îlot.

  • AVEC rayon_km → AGRÉGAT du BASSIN = îlots dont le CENTROÏDE est dans le disque (chaque îlot compté 1 fois). mode: "bassin", population_bassin, nb_iris_agreges, et revenu_median_pondere = PROXY (moyenne pondérée population des médianes des îlots couverts — PAS une vraie médiane de bassin) + couverture {revenu_pct_population, iris_revenu_manquants} car FILOSOFI ne couvre que les communes ≥5000 hab.

Les parts age (part_65_plus/75_plus) et csp (cadres, prof_interm, employés, ouvriers, agriculteurs, artisans_comm, retraités, autres) sont des ratios sur comptes bruts (Σ/Σ). Pour une simple population de commune/dept, utiliser population. not_found motivé si code absent ou point hors métropole / en mer.

ParametersJSON Schema
NameRequiredDescriptionDefault
latNoLatitude du point (mode point).
lonNoLongitude du point (mode point).
rayon_kmNoRayon du bassin en km (0 < r ≤ 10). Absent = profil de l'îlot seul.
code_irisNoCode IRIS 9 caractères (ex `751103701`) — alternatif au point.

Output Schema

ParametersJSON Schema
NameRequiredDescription
keyNoClé recherchée (SIREN, num_finess, code INSEE, …).
foundYes
messageNoExplication actionnable quand `found=false` (cause probable + remédiation).
lookupStatusYes
Behavior5/5

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

Annotations already set readOnlyHint=true, idempotentHint=true, destructiveHint=false. The description adds critical behavioral details: the proxy nature of `revenu_median_pondere` (population-weighted average, not a true median), coverage limitations (FILOSOFI only for communes ≥5000 hab), and the geographic centroid logic for basin aggregation. 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 relatively long but well-structured with clear sections and bullet-point style. Every sentence provides necessary information (modes, data sources, limitations). Could be slightly shortened without losing content, but the structure aids readability.

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 (two modes, aggregation logic, data sources, multiple output fields), the description covers all essential aspects: input constraints, mode behaviors, output fields, data freshness, and limitations. An output schema exists, so return values need not be detailed. The description is complete for an AI agent to use 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 baseline is 3. The description adds significant value beyond schema: explains the mutual exclusivity of point vs code_iris, the effect of rayon_km on mode (ilot vs bassin), and the output structure (LookupResult with mode, revenu_median_pondere, etc.). It does not add syntax or format details already in 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 clearly defines the tool as providing demographic profiles at the IRIS level, specifying data sources (INSEE RP 2022 + FILOSOFI 2021) and differentiating it from sibling tools like `population` (simple population) and `panorama_sante_territoire` (broader health panorama). The verb 'Profil démographique' and resource 'QUARTIER (IRIS)' are specific.

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 two modes (with/without `rayon_km`) and gives guidance on when to use alternatives: 'Pour une simple population de commune/dept, utiliser `population`.' It also clarifies input constraints (exactly one of point or code_iris) and the optional parameter.

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

reconcilier_finess_sireneA
Read-onlyIdempotent
Inspect

Croise FINESS DREES ↔ SIRENE INSEE V3.11 et calcule un score de cohérence (Sørensen-Dice sur bigrammes) pour chaque SIRET candidat. Utile pour confirmer/infirmer un appariement num_finess ↔ SIRET avant prospection ou cross-check qualité.

Logique :

  1. Récupère FINESS (raison sociale + adresse libellée)

  2. Récupère SIRET candidats via la table RPPS

  3. Pour chaque SIRET, lookup SIRENE puis calcule 3 sous-scores :

    • nom : Dice sur raison sociale (FINESS vs SIRENE.uniteLegale)

    • adresse : Dice sur adresse complète

    • telephone : binaire 0/1 (toujours 0 actuellement : SIRENE n'expose pas le tel)

  4. Score global = pondération (nom 0.5, adresse 0.4, tel 0.1)

  5. Verdict brut : match (≥0.8) / partial (0.5..0.8) / mismatch (<0.5)

Algorithme PUBLIC (Sørensen-Dice est dans la littérature depuis 1948). Aucune valeur ajoutée Unilabs ici — c'est une primitive ouverte. La connaissance propriétaire (mapping enseignes ↔ SELAS) reste côté Geo Intel.

Format : objet LookupResult. Quand found: true, retourne { num_finess, candidates, skipped } :

  • candidates : tableau trié par score_global décroissant (meilleur match en premier)

  • skipped : SIRET candidats qu'on n'a PAS pu réconcilier (lookup SIRENE rejected ou not_found) avec la reason. Permet au caller de distinguer 'aucun SIRET candidat trouvé' (found: false LookupResult.not_found) de 'N SIRETs candidats mais tous rejetés par SIRENE' (candidates: [] + skipped: [...]).

ParametersJSON Schema
NameRequiredDescriptionDefault
num_finessYesNuméro FINESS exact (9 chiffres).

Output Schema

ParametersJSON Schema
NameRequiredDescription
keyNoClé recherchée (SIREN, num_finess, code INSEE, …).
foundYes
messageNoExplication actionnable quand `found=false` (cause probable + remédiation).
lookupStatusYes
Behavior5/5

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

The description adds significant context beyond the annotations, such as the public nature of the algorithm, the weighting of sub-scores, and the detailed output structure including the 'skipped' field. It does not contradict the annotations (readOnlyHint, idempotentHint, etc.).

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 thorough but somewhat lengthy, containing multiple paragraphs and bullet points. While well-structured, it could be more concise. However, the detail is warranted given the complexity of the tool.

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 has an output schema (context signals indicate 'Has output schema: true'), the description covers all essential aspects: algorithm, scoring logic, output fields (candidates, skipped, score_global), and differentiation between no candidates and rejected candidates. It is complete for the agent to use 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 single parameter 'num_finess' is well-documented in the schema (9-digit exact number). The description provides context on how it is used (to retrieve FINESS data) but does not add new semantic information beyond what the schema already covers. Schema coverage is 100%, so baseline 3 is appropriate.

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: cross-referencing FINESS and SIRENE data to compute a coherence score for candidate SIRETs. It also explains the use case (confirmation/infirmation before prospection) and distinguishes itself from sibling tools by detailing its unique scoring algorithm.

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 explains when to use the tool (before prospection or quality cross-check) and clarifies the meaning of the 'skipped' field to differentiate scenarios. However, it does not explicitly mention when not to use it or list direct alternatives among siblings.

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

reverse_geocodeA
Read-onlyIdempotent
Inspect

Géocodage inverse : à partir de coordonnées GPS, retrouve l'adresse la plus proche. Source : IGN Géoplateforme. Couverture France métropolitaine + DOM uniquement : des coordonnées hors zone (ex. New York) ou en pleine mer renvoient null (pas une erreur — c'est l'absence de résultat, pas une panne).

ParametersJSON Schema
NameRequiredDescriptionDefault
latYesLatitude (WGS84).
lonYesLongitude (WGS84).
Behavior3/5

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

Annotations already declare read-only, open-world, idempotent, and non-destructive traits. Description adds the data source but no additional behavioral context 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?

Single sentence with source, no wasted words. Perfectly concise for a simple tool.

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

Completeness3/5

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

No output schema; description mentions 'nearest address' but not its structure. For a straightforward reverse geocode, partially adequate but could specify address fields or limitations.

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?

Input schema provides full descriptions for both parameters ('Latitude (WGS84)', 'Longitude (WGS84)'). Description adds no extra parameter meaning beyond the 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 clearly states the tool performs reverse geocoding from GPS coordinates to nearest address, naming the source. It effectively distinguishes itself from sibling tools like geocode_adresse.

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

Usage Guidelines3/5

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

No explicit guidance on when to use this tool versus alternatives, though the context implies it for reverse geocoding. Lack of when-not conditions or alternative references.

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

rpps_dans_etablissementA
Read-onlyIdempotent
Inspect

Liste les PS rattachés à un établissement FINESS (num_finess 9 chiffres). Pivot RPPS↔FINESS — répond à "qui travaille dans ce labo / hôpital / clinique ?". Le mode_exercice distingue les libéraux exerçant sur place (vacations) des salariés. Couverture : RPPS expose ce lien quand le PS l'a déclaré ; salariés CH/CHU/cliniques bien couverts.

Sortie compacte : coords et distance_km sont null (le tool est par établissement, pas spatial — pour la géoloc, pivoter via etablissement_by_finess sur le num_finess). Catégorie par défaut : Civil (C, ~97 % — libéraux, salariés privés, hospitaliers contractuels). Opt-in : include_agents_publics: true ajoute Agents publics (M, ~0,3 % — PH titulaires, ARS, CNAM, Éducation nationale, PMI, militaires SSA) ; include_etudiants: true ajoute Étudiants (E, ~2,5 % — internes, externes, élèves IDE/SF). Réf : https://mos.esante.gouv.fr/NOS/TRE_R09-CategorieProfessionnelle/. Source : Annuaire Santé, Agence du Numérique en Santé (ANS) — Licence Ouverte v2.0

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
num_finessYes
include_etudiantsNo
include_freshnessNoSi true, ajoute un champ `data_freshness` au payload (dans `query_metadata` si présent, sinon à la racine) listant la dernière ingestion réussie par source (FINESS, Ameli, RPPS, CDS) avec `staleness_days`. Opt-in pour ne pas alourdir les payloads par défaut. Cache 5min côté serveur — coût négligeable.
include_agents_publicsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYesNombre d'entrées retournées dans `results` (post-troncature).
totalNoEffectif réel avant troncature. Présent sur les tools de nomenclature paginés (lister_*) : `count` = échantillon, `total` = total réel, re-appeler avec un `limit` supérieur si `truncated`.
resultsYesEntrées métier (shape spécifique au tool, cf. description du tool).
freshnessNoFraîcheur des sources (présent si `include_freshness: true`).
perimetreNoLentille de la source : ce que le comptage inclut/exclut. Lire `completeness_note` et la restituer au lecteur final.
truncatedNotrue si le total réel dépasse `limit` (re-paginer via `offset` si supporté, ou augmenter `limit` sur les lister_*). Optional sur les tools de listing exhaustif (lister_*).
query_metadataNoMetadata de la query (radius_km, departement, filtres appliqués, …).
activite_hebergeeNoCompte juxtaposé des sites hébergeant l'activité correspondant à la famille filtrée, sous une autre catégorie FINESS. Distinct du `count` principal — lire `note` pour comprendre la sémantique et ne JAMAIS additionner les deux comptes sans préciser leur nature.
Behavior4/5

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

Annotations indicate readOnlyHint, openWorldHint, idempotentHint, and destructiveHint false. The description adds context beyond annotations: coverage limitations (RPPS link declared by professional, salaried well covered), default exclusion of agents publics and étudiants, source and license info. 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 moderately long but well-structured in French. It front-loads the core purpose and usage, then details coverage, defaults, and optional parameters. Every sentence contributes value, though minor repetition could be trimmed. Overall efficient for the complexity.

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 has 5 parameters and an existing output schema (not shown), the description provides comprehensive context: purpose, usage, coverage, source, default behavior, and optional filters. It does not explain the output schema, but that is separate. It sufficiently aids selection and correct invocation.

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 has 5 parameters, but only 'include_freshness' has a description (coverage 20%). The description explains the boolean parameters 'include_agents_publics' and 'include_etudiants' with percentages and categories, adding meaning beyond the schema. However, 'limit' and 'num_finess' lack description, and 'mode_exercice' mentioned in description is not a parameter. The description partially compensates for low schema coverage.

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 lists healthcare professionals attached to a FINESS establishment using a 9-digit number. It identifies itself as the pivot between RPPS and FINESS, answering 'who works in this lab/hospital/clinic?'. This distinguishes it from sibling tools like 'etablissement_by_finess' (establishment info) and 'professionnel_by_rpps' (single professional).

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 explicitly states when to use this tool ('répond à "qui travaille dans ce labo / hôpital / clinique ?"') and provides detailed context: coverage details, default filtering to civil category, and optional inclusion of agents publics and étudiants with percentages. It does not explicitly mention when not to use or compare to alternatives, but the usage context is clear.

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

rpps_search_by_nameA
Read-onlyIdempotent
Inspect

Trouve un PS par identité (matching trigram tolérant aux accents/typos). Usage : "Dr Martin à Paris" → nom: "Martin", departement: "75". Nom obligatoire ; prenom et departement affinent.

Tri par match_score ∈ [0..1] décroissant (score trigram pg_trgm). Un score <0.5 = homonymie partielle à confirmer côté caller. Sans departement, des homonymes exacts ("Pierre Martin") ont TOUS le même score ~1.0 et ne sont pas départagés — toujours filtrer par dept ou prénom sur un nom commun.

truncated: true = d'autres résultats existent (restreindre, ne pas parcourir).

Chaque résultat géolocalisé porte geo_precision ∈ {"adresse", "etablissement_finess", "centroide_commune"} — lire ce champ pour évaluer la fiabilité des coords (précise BAN/FINESS au m près vs centroïde commune ~3 km, non discriminant intra-commune).

Catégorie par défaut : Civil (C, ~97 % — libéraux, salariés privés, hospitaliers contractuels). Opt-in : include_agents_publics: true ajoute Agents publics (M, ~0,3 % — PH titulaires, ARS, CNAM, Éducation nationale, PMI, militaires SSA) ; include_etudiants: true ajoute Étudiants (E, ~2,5 % — internes, externes, élèves IDE/SF). Réf : https://mos.esante.gouv.fr/NOS/TRE_R09-CategorieProfessionnelle/.

Source : Annuaire Santé, Agence du Numérique en Santé (ANS) — Licence Ouverte v2.0

ParametersJSON Schema
NameRequiredDescriptionDefault
nomYesNom de famille (non vide).
limitNoNombre max de résultats (1-500, défaut 100).
prenomNoPrénom du PS.
departementNoCode département INSEE (ex: '75', '2A', '2B', '971'). Métropole 2 caractères (Corse '2A'/'2B', pas '20'), DOM/COM 3 caractères.
include_etudiantsNo
include_freshnessNoSi true, ajoute un champ `data_freshness` au payload (dans `query_metadata` si présent, sinon à la racine) listant la dernière ingestion réussie par source (FINESS, Ameli, RPPS, CDS) avec `staleness_days`. Opt-in pour ne pas alourdir les payloads par défaut. Cache 5min côté serveur — coût négligeable.
include_agents_publicsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYesNombre d'entrées retournées dans `results` (post-troncature).
totalNoEffectif réel avant troncature. Présent sur les tools de nomenclature paginés (lister_*) : `count` = échantillon, `total` = total réel, re-appeler avec un `limit` supérieur si `truncated`.
resultsYesEntrées métier (shape spécifique au tool, cf. description du tool).
freshnessNoFraîcheur des sources (présent si `include_freshness: true`).
perimetreNoLentille de la source : ce que le comptage inclut/exclut. Lire `completeness_note` et la restituer au lecteur final.
truncatedNotrue si le total réel dépasse `limit` (re-paginer via `offset` si supporté, ou augmenter `limit` sur les lister_*). Optional sur les tools de listing exhaustif (lister_*).
query_metadataNoMetadata de la query (radius_km, departement, filtres appliqués, …).
activite_hebergeeNoCompte juxtaposé des sites hébergeant l'activité correspondant à la famille filtrée, sous une autre catégorie FINESS. Distinct du `count` principal — lire `note` pour comprendre la sémantique et ne JAMAIS additionner les deux comptes sans préciser leur nature.
Behavior5/5

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

Annotations already mark as readOnly, idempotent, non-destructive. Description adds: fuzzy matching engine (pg_trgm), tolerance details, sorting by relevance, default category filtering with percentages, return format with match_score field, and opt-in freshness. No contradictions 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?

Well-structured with clear paragraphs covering search behavior, usage, return format, category details, and source. Slightly verbose but every sentence adds value. Front-loaded with essential purpose.

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 has an output schema, the description covers all needed aspects: parameters, default behaviors, category filtering, return format, source citation, and license. No gaps for a complex search tool.

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 71% (5/7 params described in schema). Description adds value for undocumented parameters (include_etudiants, include_agents_publics) by explaining their effect and referencing official nomenclature. Also provides examples for departement codes. Lacks explicit mention of all params but overall enhances understanding.

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 it performs fuzzy search of healthcare professionals by identity (nom + optional prenom and departement), using trigram matching tolerant to accents and typos. It distinguishes from sibling tools like professionnel_by_rpps (exact ID lookup) or professionnels_in_radius (location-based).

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?

Provides typical usage example ('find Dr Martin in Paris'), explains that without département results can be numerous and recommends using match_score for disambiguation. Also clarifies default category filtering (Civil only) and how to include other categories via parameters.

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

verifier_site_actifA
Read-onlyIdempotent
Inspect

Vérifie si un établissement de santé FINESS est encore en activité en croisant FINESS DREES ↔ RPPS (pivot SIRET) ↔ DINUM (liste complète des SIRET du SIREN, incluant les fermés). Détecte les SIRET fermés encore listés actifs côté FINESS (DREES a 1-2 mois de retard).

V0.16 — fix succession M&A : quand un site a changé d'exploitant (rachat), l'ancien SIRET fermé et le repreneur actif coexistent à la même adresse. Le resolver privilégie désormais le SIRET ACTIF co-localisé avec le FINESS (distance géodésique ≤ 100 m, recalibré V0.16.1 — le géocodage DREES place le point FINESS à plusieurs dizaines de mètres de l'adresse réelle) — avant, le verdict pouvait être ferme à tort, le best_match étant choisi sur la seule ressemblance d'adresse. Parmi les co-localisés, seul l'actif de la bande la plus proche prime : un voisin actif d'une autre adresse ne bascule pas le verdict. Un site RÉELLEMENT fermé reste ferme (aucun SIRET actif co-localisé).

Logique :

  1. Lookup FINESS pour récupérer raison sociale + adresse + téléphone DREES

  2. SIRET candidats via le resolver : pivot RPPS, puis fallback géo DINUM /near_point (récupère TOUS les SIRET autour de l'adresse FINESS, actifs ET fermés — capte le repreneur invisible côté RPPS)

  3. best_match = le SIRET ACTIF co-localisé avec le FINESS s'il en existe un ; sinon le meilleur candidat (possiblement fermé). La co-localisation est une distance géo, pas un score textuel.

  4. 2 verdicts distincts :

  • verdict_site (actif / ferme / indetermine) : basé sur best_match.actif. C'est le verdict qui compte pour un audit territorial.

  • verdict_groupe (actif / ferme / indetermine) : basé sur l'état admin de l'UL parente (champ actif DINUM). Une UL active peut très bien avoir un site fermé.

Format de retour : objet LookupResult discriminé par found. Quand found: true, le payload contient finess (vue DREES), candidates (liste enrichie — chaque candidat porte distance_finess_m), best_match, sirens_explored, verdict_site, verdict_groupe, succession ({ detected, exploitants_precedents } — les SIRET fermés co-localisés avec le repreneur ; fait brut, le tool ne qualifie PAS de « rachat »), explication. Quand num_finess est absent de FINESS DREES, le tool retourne {found: false, lookupStatus: 'not_found', message, ...}.

Coût : 1 RPC FINESS + 1 SELECT rpps + N appels DINUM (N = nombre de SIREN distincts, typiquement 1). DINUM gère son propre fallback INSEE V3.11 pour les SIREN diffusion partielle.

ParametersJSON Schema
NameRequiredDescriptionDefault
num_finessYesNuméro FINESS exact (9 chiffres).

Output Schema

ParametersJSON Schema
NameRequiredDescription
keyNoClé recherchée (SIREN, num_finess, code INSEE, …).
foundYes
messageNoExplication actionnable quand `found=false` (cause probable + remédiation).
lookupStatusYes
Behavior5/5

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

The description provides extensive behavioral context beyond annotations: cost (RPC calls), version changes (V0.7.0 breaking), logic steps, two distinct verdicts, and data freshness delay (1-2 months). Annotations already indicate read-only, idempotent, and non-destructive, and the description adds valuable detail without contradiction.

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 well-structured with clear sections (version, logic, return format) but is somewhat verbose for an AI agent. It could be more concise while retaining essential details.

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 and presence of an output schema, the description is comprehensive: it explains the algorithm, data sources, multiple verdicts, edge cases (not found), and cost. No gaps identified.

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 describes the parameter (num_finess) with 100% coverage. The description adds some context about the parameter's usage in the logic but does not provide significant additional meaning beyond the 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 clearly states the tool's purpose: to verify if a FINESS healthcare establishment is still active by cross-referencing multiple data sources. It distinguishes itself from sibling tools by focusing on activity status rather than just retrieving establishment data.

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

Usage Guidelines3/5

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

The description does not explicitly state when to use this tool versus alternatives. It implies usage for activity verification but lacks guidance on exclusions or when another tool would be more appropriate.

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

Discussions

No comments yet. Be the first to start the discussion!

Try in Browser

Your Connectors

Sign in to create a connector for this server.