# france-data-mcp MCP server

French territorial intelligence MCP: cross-reference health, business & geo public registries.

## Links
- Registry page: https://www.getdrio.com/mcp/io-github-cturkieh-france-data-mcp
- Repository: https://github.com/cturkieh/france-data-mcp

## Install
- Command: `npx -y france-data-mcp`
- Endpoint: https://france-data-mcp.vercel.app/mcp
- Auth: Not captured

## Setup notes
- Package: Npm france-data-mcp v0.9.4
- Remote endpoint: https://france-data-mcp.vercel.app/mcp

## Tools
- autocomplete_commune - 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`/`search` → `nom`, `codepostal`/`postal_code` → `codePostal`, `code_insee`/`insee` → `code`. Endpoint: https://france-data-mcp.vercel.app/mcp
- get_commune_by_code - 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`/`insee` → `code`. Endpoint: https://france-data-mcp.vercel.app/mcp
- geocode_adresse - 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). Endpoint: https://france-data-mcp.vercel.app/mcp
- reverse_geocode - 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). Endpoint: https://france-data-mcp.vercel.app/mcp
- population_par_commune - Population municipale (PMUN), population comptée à part (PCAP) et population totale (PTOT) d'une commune française par son code INSEE (5 caractères). Source : INSEE Melodi (DS_POPULATIONS_REFERENCE). PMUN est la base légale officielle utilisée pour les indicateurs DREES (densité médicale, etc.). Retourne un `LookupResult` discriminé par `found`. Si la commune a fusionné ou changé de code, `found: false` avec orientation vers `autocomplete_commune`.

Alias acceptés : `code_insee`/`codeInsee`/`insee` → `code`. Endpoint: https://france-data-mcp.vercel.app/mcp
- population_par_departement - Population municipale (PMUN), comptée à part (PCAP) et totale (PTOT) d'un département français par son code INSEE (2-3 caractères). Source : INSEE Melodi (DS_POPULATIONS_REFERENCE). PMUN recommandée pour calculs de densité (méthodo DREES). Supporte la Corse (2A, 2B) et les DOM 971-974 ; Mayotte (976) est ABSENTE de DS_POPULATIONS_REFERENCE INSEE Melodi → retour `lookupNotFound` (pas une erreur).

Alias acceptés : `code_dept`/`dept`/`departement`/`code_departement` → `code`. Endpoint: https://france-data-mcp.vercel.app/mcp
- entreprises_in_radius - 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. Endpoint: https://france-data-mcp.vercel.app/mcp
- entreprise_by_siren - 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). Endpoint: https://france-data-mcp.vercel.app/mcp
- data_freshness - 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). Endpoint: https://france-data-mcp.vercel.app/mcp
- compare_raison_sociale_finess_vs_rpps - 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. Endpoint: https://france-data-mcp.vercel.app/mcp
- compare_adresse_cnam_vs_finess - 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). Endpoint: https://france-data-mcp.vercel.app/mcp
- historique_etablissement - 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. Endpoint: https://france-data-mcp.vercel.app/mcp
- reconcilier_finess_sirene - 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: [...]`). Endpoint: https://france-data-mcp.vercel.app/mcp
- verifier_site_actif - 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.7.0 — breaking** : pivot SIRET élargi. Avant V0.7.0, on ne testait que les SIRET RPPS-déclarés (= SIRET du siège employeur typiquement) → on ratait le SIRET physique fermé du site. Désormais, le resolver récupère TOUS les SIRET du SIREN via DINUM puis fuzzy-matche leur adresse contre FINESS — ce qui capte aussi les SIRET fermés invisibles côté RPPS.

Logique :
1. Lookup FINESS pour récupérer raison sociale + adresse + téléphone DREES
2. Récupération des SIRET candidats via le resolver (RPPS + DINUM avec scoring d'adresse Dice)
3. `best_match` = SIRET avec le meilleur score d'adresse ≥ 0.6 (= site physique)
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 tri score), `best_match`, `sirens_explored`, `verdict_site`, `verdict_groupe`, `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. Endpoint: https://france-data-mcp.vercel.app/mcp
- etablissement_by_siret - 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). Endpoint: https://france-data-mcp.vercel.app/mcp
- etablissements_finess_in_radius - 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). Endpoint: https://france-data-mcp.vercel.app/mcp
- etablissements_finess_by_categorie - 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. 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). Endpoint: https://france-data-mcp.vercel.app/mcp
- etablissement_by_finess - 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). Endpoint: https://france-data-mcp.vercel.app/mcp
- centres_sante_in_radius - 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_meters` → `radius_km`, `latitude`/`longitude` → `lat`/`lon`. Endpoint: https://france-data-mcp.vercel.app/mcp
- centres_sante_by_finess - 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_finess` → `num_finess`. Endpoint: https://france-data-mcp.vercel.app/mcp
- professionnels_in_radius - Recherche de professionnels de santé libéraux conventionnés dans un rayon géographique. Précision géo : centroïde commune (~3 km en moyenne — adapté à l'analyse de densité, pas au géocodage adresse). 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_specialites_ameli`. 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: "centroide_commune"` : `coords` et `distance_km` sont au centroïde commune, donc tous les PS d'une même commune ont la MÊME `distance_km` — ne pas l'utiliser pour classer/choisir un PS individuel, uniquement comme filtre de zone. 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. Endpoint: https://france-data-mcp.vercel.app/mcp
- professionnels_par_specialite_dept - 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_specialites_ameli`. 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. Endpoint: https://france-data-mcp.vercel.app/mcp
- lister_specialites_ameli - Liste les codes spécialité Ameli effectivement présents en base, avec leur libellé natif, leur `type_ps_code` de rattachement et leur count. Triés par fréquence décroissante. Utile pour découvrir la nomenclature avant de filtrer un `professionnels_in_radius` ou `professionnels_par_specialite_dept`. Le champ `libelle_clarifie` désambigüise les libellés partagés par plusieurs codes (ex: "Médecin généraliste" regroupe les codes 01/22/23, "Chirurgien-dentiste" 19/53/54, "Psychiatre" 33/75, "Gynécologue / Obstétricien" 07/70/77/79). Format quand partagé : `'{libelle} (code {code}, {count_compact})'` (ex: "Médecin généraliste (code 01, 55K)"). Sinon identique à `libelle`. `is_libelle_partage: true` quand au moins 2 codes utilisent le même libellé — utiliser ce flag côté caller pour décider d'afficher le code à l'utilisateur. Paginé : `limit` (défaut 50), la 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. Endpoint: https://france-data-mcp.vercel.app/mcp
- lister_types_ps_ameli - Liste les codes `type_ps` Ameli présents en base, avec leur libellé natif (`libelle_source`), un libellé clarifié (`libelle_clarifie`) résolvant l'ambiguïté du code "2" fourre-tout, leur count total, et `specialites_presentes` (la liste effective des spécialités regroupées sous chaque type_ps avec leurs counts). Pas de dictionnaire inventé : la clarification est dérivée de la donnée live à chaque appel. Payload léger possible via `include_specialites: false` (remplace le sous-tableau par `nb_specialites`). 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. Endpoint: https://france-data-mcp.vercel.app/mcp
- professionnels_rpps_in_radius - 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_specialites_medicales`. Source : Annuaire Santé, Agence du Numérique en Santé (ANS) — Licence Ouverte v2.0 Endpoint: https://france-data-mcp.vercel.app/mcp
- professionnels_rpps_par_dept - 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_specialites_medicales`. Source : Annuaire Santé, Agence du Numérique en Santé (ANS) — Licence Ouverte v2.0 Endpoint: https://france-data-mcp.vercel.app/mcp
- rpps_dans_etablissement - 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 Endpoint: https://france-data-mcp.vercel.app/mcp
- densite_professionnels_sante - Densité de professionnels de santé pour 100 000 habitants, au niveau **département** (`code_dept`) OU **commune** (`code_insee`, V0.9). Exactement un des deux requis. Méthodo DREES par défaut : médecins (`profession_code='10'`) en activité régulière (libéral + salarié + mixte, codes mode_exercice L, S, M), hors étudiants. Croise RPPS (count) et INSEE Melodi (population municipale PMUN, recensement 2023).

Usages : densité de cardiologues / dermatologues / infirmiers libéraux / pharmaciens / sages-femmes par dept ou commune. Pour une spécialité médicale, passer `savoir_faire_code` (ex 'SM04' Cardiologie — code 'SM02' est Anesthésie-réanimation, pas Cardiologie). Pour une autre profession que médecin, passer `profession_code` (60 infirmier, 21 pharmacien, etc.). Pour libéraux seuls, passer `mode_exercice_codes: ['L']`.

Paris/Marseille/Lyon : la densité par `code_insee` est INDISPONIBLE (les praticiens RPPS sont rattachés aux arrondissements alors qu'INSEE n'expose la population qu'à la commune entière) — passer un code commune-mère (75056) ou arrondissement (75108) lève une RangeError explicite. Utiliser `code_dept` (75, 13, 69) pour la densité ville entière.

`compare_national: true` ajoute la densité France entière (DOM inclus) et l'écart en % (positif = sur-doté vs France, négatif = sous-doté). Coût : 1 RPC count_rpps supplémentaire + 1 appel Melodi (cacheable).

Alias acceptés : `dept`/`departement` → `code_dept`, `codeInsee`/`insee` → `code_insee`.

Ne renvoie AUCUNE interprétation métier (pas de seuil "désert médical" automatique). Le caller applique sa grille.

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_specialites_medicales`.

Source : Annuaire Santé, Agence du Numérique en Santé (ANS) — Licence Ouverte v2.0 Endpoint: https://france-data-mcp.vercel.app/mcp
- densite_etablissements_sante - Densité d'établissements de santé pour 100 000 habitants dans un département, par famille FINESS. Croise FINESS DREES (count) et INSEE Melodi (population municipale PMUN, recensement 2023).

Familles disponibles : `labo` (laboratoires de biologie médicale), `pharmacie`, `ehpad`, `mco` (court séjour médecine/chirurgie/obstétrique), `ssr` (soins de suite), `psychiatrie`, `dialyse`, `imagerie`, `had` (hospitalisation à domicile), `msp_cpts` (maisons de santé + CPTS), `handicap_enfants`, `handicap_adultes`, `addictologie`, `pmi`, `prevention_sante`, etc. Famille obligatoire — sans filtre, le ratio mélangerait labos / hôpitaux / EHPAD et n'aurait pas de sens.

`compare_national: true` ajoute la densité France entière (DOM inclus) + écart en %. Coût : 1 RPC count_finess + 1 appel Melodi (cacheable).

Alias acceptés : `dept`/`departement` → `code_dept`. Endpoint: https://france-data-mcp.vercel.app/mcp
- panorama_sante_territoire - 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), et nombre d'établissements FINESS par famille (default ["labo","pharmacie","ehpad","mco","msp_cpts"]).

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.

**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`/`code` → `code_insee`.

Sources : RPPS / Annuaire Santé ANS (mensuel), FINESS DREES (bimensuel), INSEE Melodi (PMUN 2023). Endpoint: https://france-data-mcp.vercel.app/mcp
- inspect_site - 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`/`id` → `num_finess`. Endpoint: https://france-data-mcp.vercel.app/mcp
- lister_specialites_medicales - Liste les spécialités médicales (savoir_faire RPPS) avec leur libellé et le nombre de PS qui les portent. Tool d'aide à la découverte pour le LLM : avant d'appeler densite_professionnels_sante ou professionnels_rpps_par_dept avec un `savoir_faire_code` précis (ex 'SM04' Cardiologie), utiliser ce tool pour obtenir la liste exhaustive.

Filtre par défaut : profession_code='10' (Médecin) — retourne donc les spécialités médicales (cardiologie, dermato, gynéco, etc.). Passer `profession_code` pour énumérer les spécialités d'une autre profession (ex '60' Infirmier → spécialités IDE), ou `null` pour tous savoir_faire confondus.

Résultats triés par count_ps DESC (spécialités les plus représentées en premier). Paginé : `limit` (défaut 50), la réponse expose `total` et `truncated`. Source : RPPS / Annuaire Santé ANS (Supabase dump mensuel). Endpoint: https://france-data-mcp.vercel.app/mcp
- rpps_search_by_name - 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 Endpoint: https://france-data-mcp.vercel.app/mcp
- professionnel_by_rpps - 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 Endpoint: https://france-data-mcp.vercel.app/mcp
- finess_sirene_coverage_in_radius - 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. Source : FINESS DREES + DINUM Recherche Entreprises + SIRENE INSEE. Endpoint: https://france-data-mcp.vercel.app/mcp

## Resources
Not captured

## Prompts
Not captured

## Metadata
- Owner: io.github.cturkieh
- Version: 0.9.4
- Runtime: Npm
- Transports: STDIO, HTTP
- License: Not captured
- Language: Not captured
- Stars: Not captured
- Updated: May 14, 2026
- Source: https://registry.modelcontextprotocol.io
