Public leaderboard

Public assessment

cturkieh/france-data-mcp (france-data-mcp)

france-data-mcp · v0.26.3 · scanned

What changed in the harness

Selection accuracy 98→100, token cost down 0%, unconfirmed writes 100%→100%.

Category breakdown

Where the score comes from.

Earned points across the four signals Gradable measures. Safety and Legibility are scored out of 30; Economics and Discoverability are scored out of 20.

01Safety

30.0 / 30

30.0 out of 30
02Legibility

25.6 / 30

25.6 out of 30
03Economics

5.3 / 20

5.3 out of 20
04Discoverability

15.0 / 20

15.0 out of 20

Highest-impact fix

Estimated gain +15 points

Reduce the tool-definition and task token payload

Consolidate overlapping tools and trim repetitive schema text while preserving behavior, parameter, and return semantics.

Description evidence

Defects and rewrites.

7 defects found across the exposed tool descriptions. Suggested rewrites make purpose, inputs, boundaries, and returns easier for an agent to understand.

Tool Defect types Suggested rewrite
autocomplete_commune
no_return_description
Recherche de communes françaises par nom, code postal ou code INSEE — idéal pour autocomplétion. Retourne la liste des communes correspondantes (nom, code INSEE à 5 caractères, codes postaux, coordonnées/centre), limitée à `limit` résultats (1-30, défaut 10). Un (au moins) parmi `nom`, `codePostal`, `code` est requis. `boostPopulation` (défaut true) trie par population décroissante pour favoriser les homonymes les plus peuplés (ex: 'Charleville'). Source : geo.api.gouv.fr (DINUM/Etalab). Alias acceptés : `q`/`query`/`search` → `nom`, `codepostal`/`postal_code` → `codePostal`, `code_insee`/`insee` → `code`.
geocode_adresse
no_return_description
Géocode une adresse française en coordonnées GPS, précision au numéro de rue. Retourne un résultat de géocodage avec `point` (coordonnées GPS), `score` (0-1) qualifiant la fiabilité du match (>= 0.8 fiable, < 0.5 = match douteux, souvent un fallback rue/commune sans rapport avec l'adresse demandée), `confidence_low` (booléen, `true` dans ce cas — ne PAS utiliser `point` pour une décision quand `confidence_low: true`) et `type` indiquant la granularité (housenumber > street > locality > municipality). `adresse` est requis ; `codePostal` et `codeCommune` optionnels pour désambiguïser. Source : IGN Géoplateforme (data.geopf.fr).
reverse_geocode
no_return_description
Géocodage inverse : à partir de coordonnées GPS (WGS84), retrouve l'adresse la plus proche (numéro de rue, code postal, commune). Retourne l'adresse correspondante, ou `null` si aucune n'est trouvée — c'est l'absence de résultat, pas une erreur (couverture France métropolitaine + DOM uniquement : coordonnées hors zone, ex. New York, ou en pleine mer → `null`). Source : IGN Géoplateforme.
professionnels_rpps_in_radius
params_unexplained
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). Chaque résultat porte `geo_precision` ∈ {`"adresse"` (coords BAN, `distance_km` exacte), `"etablissement_finess"` (coords du site FINESS, `distance_km` exacte), `"centroide_commune"` (~3 km, `distance_km` identique pour tous les PS de la commune — ne pas utiliser pour classer individuellement, seulement comme filtre de zone)}. `precise_only` (défaut false) : à true, ne renvoie que les PS à `distance_km` exacte — recommandé pour rayons courts (<3 km) et classement intra-commune. `include_agents_publics: true` ajoute les Agents publics (M, ~0,3 % — PH titulaires, ARS, CNAM, Éducation nationale, PMI, militaires SSA) ; `include_etudiants: true` ajoute les Étudiants (E, ~2,5 % — internes, externes, élèves IDE/SF) ; sans ces options seuls les PS de catégorie Civil (C, ~97 %) sont retournés. ATTENTION nomenclatures : les codes ANS (`profession_codes`, `savoir_faire_codes`) sont DISTINCTS des codes Ameli — ne jamais passer un code Ameli à un paramètre ANS, le filtre renverrait vide sans erreur. Découvrir les codes via `lister_nomenclature(referentiel:'rpps_savoir_faire')`. Source : Annuaire Santé, ANS — Licence Ouverte v2.0.
professionnels_rpps_par_dept
params_unexplained
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). Chaque résultat porte `geo_precision` ∈ {`"adresse"`, `"etablissement_finess"`, `"centroide_commune"`} — lire pour évaluer la fiabilité des `coords`. `include_agents_publics: true` ajoute les Agents publics (M, ~0,3 % — PH titulaires, ARS, CNAM, Éducation nationale, PMI, militaires SSA) ; `include_etudiants: true` ajoute les Étudiants (E, ~2,5 % — internes, externes, élèves IDE/SF) ; sans ces options seuls les PS de catégorie Civil (C, ~97 %) sont retournés. Filtres optionnels : `profession_code`, `savoir_faire_code`, `mode_exercice_code`. Re-paginer via `offset` tant que `truncated=true`. ATTENTION nomenclatures : les codes ANS sont DISTINCTS des codes Ameli — ne jamais passer un code Ameli à un paramètre ANS, le filtre renverrait vide sans erreur. Découvrir les codes via `lister_nomenclature(referentiel:'rpps_savoir_faire')`. Source : Annuaire Santé, ANS — Licence Ouverte v2.0.
rpps_dans_etablissement
params_unexplained
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`). `limit` : nombre maximal d'entrées retournées dans `results` — la réponse est tronquée côté serveur à cette borne, et `truncated: true` signale qu'il existe davantage de PS (re-appeler avec un `limit` supérieur pour les récupérer). 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
densite_sante
no_return_description
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). **Sortie** : renvoie la densité santé calculée — effectif de la cible (professionnels RPPS ou établissements FINESS) rapporté à la population municipale PMUN 2023, exprimé pour 100 000 habitants, pour le scope résolu (département entier ou commune). `compare_national: true` ajoute la densité France entière (DOM inclus) + l'écart en % (positif = sur-doté, négatif = sous-doté). Aucune interprétation métier n'est renvoyée (pas de seuil "désert médical" auto). **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). Alias : `dept`/`departement` → `code_dept`, `codeInsee`/`insee` → `code_insee`. 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

Selection evidence

Confusable tool pairs.

7 pairs where similar names or overlapping descriptions may send an agent toward the wrong tool.

Tool A Tool B Confidence Why they collide
professionnels_in_radius professionnels_rpps_in_radius high Nearly identical names and both search health professionals by lat/lon/radius; only the source differs (Ameli libéraux conventionnés vs RPPS tous statuts). A plain task like 'trouve les médecins autour de ce point' leaves the statut unspecified, so an agent can plausibly pick either and silently get a different population (libéraux only vs salariés+mixtes included).
professionnels_par_specialite_dept professionnels_rpps_par_dept high Both list health professionals of a department and share the 'par_dept' pattern; one is Ameli libéraux, the other RPPS all statuses. A task like 'liste les cardiologues du département 59' is genuinely ambiguous because neither the name nor the input schema (departement + speciality filters) reveals the source/statut boundary.
etablissement_by_siret etablissement_by_finess medium Both return single-establishment detail and differ only by identifier type (14-digit SIRET vs 9-digit FINESS). A user who supplies a bare number ('les infos de l'établissement 12345678901234') or uses the term 'numéro' without specifying SIRET/FINESS forces a digit-count guess, making the wrong pick plausible.
verifier_site_actif inspect_site medium inspect_site's own description says it replaces verifier_site_actif (+ rpps_dans_etablissement + historique_etablissement) and includes the exact actif/fermé verdicts. A task like 'vérifie si le site 590048997 est encore actif' is satisfied by both tools, so selection depends on whether the agent wants a targeted verdict or the aggregate 360 view.
compare_raison_sociale_finess_vs_rpps compare_adresse_cnam_vs_finess medium Both take the same num_finess and compare two reference sources, differing only in the field compared (raison sociale vs adresse). A generic task like 'compare les données de l'établissement 123456789 entre les sources' under-specifies the field, so an agent may pick the wrong comparison tool.
etablissements_finess_in_radius etablissements_finess_by_categorie medium Both enumerate FINESS establishments per family; only the zone mechanics differ (geographic radius vs administrative departement/commune). A task like 'recense les EHPAD autour de Villeneuve-d'Ascq' or 'les labos de la métropole lilloise' can convincingly map to either tool (by_categorie accepts nom_commune, in_radius requires coordinates), leading to a wrong choice.
professionnels_rpps_in_radius professionnels_rpps_par_dept medium Identical 'professionnels_rpps_' prefix; the only distinction is how the zone is expressed (center+radius vs departement code). A task phrased with a fuzzy zone ('tous les médecins du bassin de Roubaix', 'les infirmières du secteur de la ville X') gives no cue whether a radius or an administrative scope is wanted, so either could be picked.

Compare the field

One score is useful.
The evidence makes it actionable.

Back to the leaderboard