Légifrance (unofficial)

Official registry Search and web

Unofficial MCP server for French law via the Légifrance API (PISTE): search, read and cite texts.

Install

Add this to your client's MCP configuration (Claude Desktop: claude_desktop_config.json; Cursor: .cursor/mcp.json; VS Code and others use the same "mcpServers" shape).

MCPB package https://github.com/muchiny/mcp-legifrance/releases/download/v1.0.1/mcp-legifrance-1.0.1.mcpb

Environment variables

  • LF_PISTE_CLIENT_ID required secret OAuth client ID of your own Légifrance application on piste.gouv.fr. Never share it.
  • LF_PISTE_CLIENT_SECRET required secret OAuth client secret of the same PISTE application.
  • LF_PISTE_ENV PISTE environment; credentials are environment-specific.
OCI package ghcr.io/muchiny/mcp-legifrance:1.0.1
Claude Code
claude mcp add l-gifrance-unofficial -e 'LF_PISTE_CLIENT_ID=<your lf_piste_client_id>' -e 'LF_PISTE_CLIENT_SECRET=<your lf_piste_client_secret>' -e 'LF_PISTE_ENV=sandbox' -- docker run -i --rm ghcr.io/muchiny/mcp-legifrance:1.0.1
JSON configuration (Claude Desktop, Cursor, VS Code)
{
    "mcpServers": {
        "l-gifrance-unofficial": {
            "command": "docker",
            "args": [
                "run",
                "-i",
                "--rm",
                "ghcr.io/muchiny/mcp-legifrance:1.0.1"
            ],
            "env": {
                "LF_PISTE_CLIENT_ID": "<your lf_piste_client_id>",
                "LF_PISTE_CLIENT_SECRET": "<your lf_piste_client_secret>",
                "LF_PISTE_ENV": "sandbox"
            }
        }
    }
}

Environment variables

  • LF_PISTE_CLIENT_ID required secret OAuth client ID of your own Légifrance application on piste.gouv.fr. Never share it.
  • LF_PISTE_CLIENT_SECRET required secret OAuth client secret of the same PISTE application.
  • LF_PISTE_ENV PISTE environment; credentials are environment-specific.

Documentation

From the project's README on GitHub, refreshed weekly. Links open on GitHub.

Contents
  1. mcp-legifrance
  2. Sommaire
  3. Ce que fait le serveur
  4. Avant d'installer : une application PISTE
  5. Installation par canal
  6. Configuration des clients
  7. Variables d'environnement
  8. Mode hors ligne (index local DILA)
  9. Hôtes contactés
  10. Attribution, licence des données et non-affiliation
  11. Migrer depuis fr-eli-mcp
  12. Confidentialité et sécurité
  13. Ce qui n'est pas encore vérifié
  14. Développer et contribuer

mcp-legifrance

Projet non officiel, sans lien avec la DILA. Not affiliated with or endorsed by DILA.

Dépôt : https://github.com/muchiny/mcp-legifrance

Serveur MCP en Rust pour interroger le droit français officiel (lois, codes, jurisprudence, conventions collectives) : il lit l'API Légifrance du portail PISTE, en lecture seule, et renvoie le texte tel que Légifrance le publie, avec une citation et l'adresse de la source. Il cible la spécification MCP 2026-07-28 et reste compatible avec les clients en 2025-11-25 et 2025-06-18.

Binaires non signés. Les binaires et le bundle MCPB ne sont signés par aucun certificat (ni Authenticode sous Windows, ni notarisation sous macOS). Sous Windows, Smart App Control peut bloquer l'exécutable : ne le désactivez pas, utilisez l'image Docker ou WSL. Sous macOS, Gatekeeper peut demander une confirmation. Les sommes SHA-256 et les attestations de provenance GitHub permettent de contrôler ce que vous installez (voir Vérifier un téléchargement).

Statut. Cette page décrit la version 0.3.0. Les commandes d'installation s'appliquent dès que l'étiquette v0.3.0 et sa release GitHub existent ; avant cela, seule la compilation depuis un clone du dépôt est possible.

Sommaire

  1. Ce que fait le serveur
  2. Avant d'installer : une application PISTE
  3. Installation par canal
  4. Configuration des clients
  5. Variables d'environnement
  6. Mode hors ligne (index local DILA)
  7. Hôtes contactés
  8. Attribution, licence des données et non-affiliation
  9. Migrer depuis fr-eli-mcp
  10. Confidentialité et sécurité
  11. Ce qui n'est pas encore vérifié
  12. Développer et contribuer

Ce que fait le serveur

Treize outils, tous en lecture seule (readOnlyHint), qui interrogent Légifrance sur le réseau (openWorldHint) :

OutilRôle
fr_searchRecherche par mots-clés dans un fonds : LODA (lois et décrets), CODE, JURI (Cour de cassation et cours d'appel), CONSTIT, CETAT, CNIL, KALI (conventions collectives) ou ACCO (accords d'entreprise). Pagination, filtres de dates, version en vigueur à une date.
fr_get_actTable des matières d'un texte (loi, décret, code) à une date donnée.
fr_get_textTexte d'un article, avec lecture progressive (voir ci-dessous).
fr_get_decisionDécision de justice (Cour de cassation, Conseil constitutionnel, Conseil d'État, cours d'appel, tribunaux administratifs).
fr_get_deliberationDélibération de la CNIL.
fr_get_conventionConvention collective : métadonnées et table des matières.
fr_get_company_agreementAccord d'entreprise : métadonnées seules (le texte est une pièce jointe).
fr_coverageCe que le serveur couvre et ne couvre pas, l'environnement PISTE, l'état de la configuration, la source et la date de consultation.
fr_resolveTransforme une citation en texte libre (« article 1240 du code civil », « Cass. civ. 1re, 4 juin 2025, n° 24-13.470 », un ECLI) en identifiants Légifrance, avec un niveau de confiance. Rien n'est deviné ni inventé.
fr_verify_citationsVérifie toutes les citations juridiques d'un texte (jusqu'à 20 000 caractères, par exemple un brouillon de réponse) contre Légifrance : codes, lois, décrets, décisions, ECLI, délibérations de la CNIL, conventions.
fr_get_relatedLiens juridiques d'un article ou d'une décision : textes cités, textes qui le citent, jurisprudence mentionnée.
fr_diff_articleCompare les versions d'un article à deux dates : passages retirés et ajoutés, avec un peu de contexte.
fr_search_allRecherche dans plusieurs fonds à la fois : les meilleurs résultats de chacun, groupés par fonds, avec leurs totaux.

Retour progressif. Pour économiser le contexte du modèle, un texte de plus de 1 200 caractères est d'abord rendu en résumé. Pour le lire en entier, demandez detail: "full" et enchaînez avec offset = next_offset ; focus extrait les passages qui correspondent à des mots donnés. Une réponse ne dépasse jamais 45 000 caractères de JSON compact.

Resources, prompts et complétions. En plus des outils, le serveur expose la resource legifrance://coverage, quatre modèles de resources (legifrance://act/{text_id}, legifrance://article/{article_id}, legifrance://code/{code}/article/{num}, legifrance://decision/{decision_id}), trois prompts en français (analyser_decision, etat_du_droit, verifier_citations) et la complétion de leurs arguments.

Option de compilation, absente des binaires publiés. Le transport Streamable HTTP local (--features http, sous-commande serve-http, boucle locale seulement, jeton dans LF_MCP_HTTP_TOKEN) existe dans le code et se compile à la demande, mais n'est pas livré dans les binaires, l'image Docker et le bundle MCPB.

Mode hors ligne, inclus dans les binaires publiés à partir de la 1.0.0. L'index local DILA (fonctionnalité dila, fonds LEGI seul, activé par LF_DILA_DIR) se construit avec la sous-commande build-dila-index, voir Mode hors ligne. L'index local est un instantané : il peut être en retard sur Légifrance et ne prouve donc jamais qu'un texte n'existe pas. Le CHANGELOG dit, version par version, ce que livre chaque release.

Protocole. MCP 2026-07-28 (« moderne »), ainsi que 2025-11-25 et 2025-06-18 (« legacy ») dans le même binaire. La version 2025-03-26 n'est pas servie. Le démarrage ne fait aucun appel réseau : l'authentification PISTE se fait au premier appel d'outil.

Avant d'installer : une application PISTE

Chaque utilisateur apporte ses propres identifiants : le projet n'en fournit aucun, et les conditions d'utilisation de PISTE interdisent de partager les vôtres. Étapes, à faire une seule fois :

  1. Créer un compte nominatif sur https://piste.gouv.fr et accepter les conditions d'utilisation de PISTE.
  2. Dans le catalogue, choisir l'API Légifrance et accepter ses conditions (l'accès est gratuit).
  3. Créer une application par environnement : une pour le bac à sable (sandbox), une pour la production. Relever le client_id et le client_secret dans la section « OAuth Credentials » de l'application.

Les identifiants du bac à sable ne sont pas valables en production (PISTE répond invalid_client). Le serveur démarre en sandbox par défaut ; le bac à sable peut renvoyer d'autres données que la production et n'offre aucun engagement de service. Pour la production, voir Passer en production.

Si vos clés sont divulguées, réinitialisez-les sur PISTE sans attendre, puis prévenez la DILA et l'AIFE.

Installation par canal

CanalPour quiCommande ou actionIntégrité
Installeur (archives de la release)juristes et développeurs à l'aise en terminal`curl … \sh(Linux, macOS) ;irm … \iex` (Windows)HTTPS ; sommes SHA-256 et attestations, non signé
Bundle MCPBClaude Desktopdouble-clic sur mcp-legifrance-0.3.0.mcpbfileSha256 vérifié par le client ; non signé
Image Dockerisolation, VS Code (galerie), Docker Desktopdocker run -i --rm …digest, attestation
cargo install --gitdéveloppeurs Rustcompilation locale depuis le dépôt, à l'étiquetteCargo.lock imposé par --locked ; non signé

Cibles des binaires : Linux x86_64 et aarch64 (gnu et musl), macOS x86_64 et aarch64, Windows x86_64. Windows sur ARM64 n'est pas une cible : le binaire x86_64 y fonctionne par émulation (non vérifié).

Le serveur est aussi déclaré au registre MCP sous le nom io.github.muchiny/mcp-legifrance (paquets mcpb et oci).

Installeurs (Linux, macOS, Windows)
# Linux, macOS
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/muchiny/mcp-legifrance/releases/download/v0.3.0/mcp-legifrance-installer.sh | sh
# Windows
powershell -c "irm https://github.com/muchiny/mcp-legifrance/releases/download/v0.3.0/mcp-legifrance-installer.ps1 | iex"

Le binaire est posé dans ~/.mcp-legifrance/bin/mcp-legifrance (Windows : dossier .mcp-legifrance\bin de votre dossier utilisateur, fichier mcp-legifrance.exe) et ce répertoire est ajouté au PATH. Une application graphique déjà ouverte (Claude Desktop, VS Code) ne voit pas le nouveau PATH : redémarrez-la, ou donnez le chemin absolu dans sa configuration, comme dans les exemples plus bas. L'installeur ne fait aucune mise à jour automatique : pour changer de version, relancez-le avec l'étiquette voulue.

Vérifier un téléchargement

Plutôt que d'exécuter un script téléchargé, vous pouvez prendre l'archive de votre cible sur la page des releases, la vérifier, puis l'extraire :

# somme SHA-256 : comparez le résultat à la ligne correspondante du fichier sha256.sum de la release
sha256sum mcp-legifrance-x86_64-unknown-linux-gnu.tar.xz      # macOS : shasum -a 256 ; Windows : Get-FileHash

# provenance : l'archive a été construite par la CI de ce dépôt
gh attestation verify mcp-legifrance-x86_64-unknown-linux-gnu.tar.xz --repo muchiny/mcp-legifrance

Les noms d'archives suivent le motif mcp-legifrance-<cible>.tar.xz (Windows : .zip). Chaque archive contient le binaire, la licence, le fichier NOTICE, les licences tierces, la présente page et le journal des modifications.

Bundle MCPB (Claude Desktop)
  1. Télécharger mcp-legifrance-0.3.0.mcpb depuis la page de la release.
  2. Le double-cliquer, ou le glisser dans les réglages d'extensions de Claude Desktop.
  3. Renseigner les trois champs demandés : identifiant client PISTE, secret client PISTE (tous deux conservés par le stockage sécurisé du client) et environnement (sandbox par défaut).

Un seul bundle sert toutes les plateformes ; il choisit le bon binaire au lancement. C'est la voie la plus simple si vous n'êtes pas développeur : aucune configuration JSON à écrire.

Image Docker
docker pull ghcr.io/muchiny/mcp-legifrance:0.3.0

# vérification de la configuration (aucun secret sur la ligne de commande : -e NOM sans valeur)
docker run --rm -e LF_PISTE_CLIENT_ID -e LF_PISTE_CLIENT_SECRET ghcr.io/muchiny/mcp-legifrance:0.3.0 check-config

L'image est publique, minimale (distroless), exécutée par un utilisateur non root, pour linux/amd64 et linux/arm64. -i est indispensable : le client dialogue avec le serveur par l'entrée et la sortie standard. Le journal d'audit est écrit dans /data/audit ; montez-y un volume nommé pour le conserver (exemple plus bas). L'image est faite pour un usage local.

cargo install --git
cargo install --git https://github.com/muchiny/mcp-legifrance --tag v0.3.0 --locked mcp-legifrance
  • Prérequis : une chaîne Rust d'au moins la version 1.88 et un compilateur C. Le fournisseur TLS actuel (aws-lc) peut réclamer d'autres outils de compilation sur certaines plateformes (non confirmé hors Linux).
  • Le nom du paquet (mcp-legifrance) est obligatoire : le dépôt en contient plusieurs. --locked impose les versions de dépendances contrôlées par le projet.
  • Le binaire est posé dans le répertoire bin de votre installation Cargo (~/.cargo/bin par défaut) et n'est pas signé.
  • N'exécutez pas cargo install mcp-legifrance sans --git : le projet ne publie rien sur crates.io en version 0.x, et un crate de ce nom, s'il existait, ne serait pas celui-ci.
Vérifier l'installation
mcp-legifrance --version
mcp-legifrance check-config            # lit l'environnement, n'appelle aucun service
mcp-legifrance check-config --online   # obtient un jeton OAuth auprès de PISTE, sans appeler l'API

check-config affiche une ligne par variable (nom, origine, valeur, état), jamais un secret (« set (n characters) » ; l'identifiant client est tronqué à 4 caractères), puis les avertissements et les problèmes. Codes de sortie : 0 tout va bien ; 2 configuration invalide ; 3 PISTE refuse les identifiants ; 4 erreur réseau.

Configuration des clients

Principes communs :

  • Nom du serveur côté client : legifrance (recommandé). Les outils apparaissent par exemple sous mcp__legifrance__fr_search dans Claude Code.
  • Commande : mcp-legifrance, avec l'argument serve (c'est le comportement par défaut ; l'écrire évite toute ambiguïté). Utilisez le chemin absolu du binaire : les applications graphiques n'héritent pas toujours de votre PATH, et un ~ n'est pas développé dans un fichier JSON. Les exemples ci-dessous supposent l'installeur (/home/alice/.mcp-legifrance/bin/mcp-legifrance) ; adaptez le chemin.
  • Secrets : le serveur lit LF_PISTE_CLIENT_ID et LF_PISTE_CLIENT_SECRET dans son environnement. Aucune option de ligne de commande ne les porte (un argument se lit dans la liste des processus). Du plus sûr au moins sûr : stockage sécurisé du client (MCPB, invites de VS Code) ; variable d'environnement alimentée par un gestionnaire de secrets ; valeur en clair dans un fichier de configuration, à éviter et à ne jamais versionner.
  • Diagnostic : en cas de doute, lancez mcp-legifrance check-config --online dans le même environnement que le client.

La syntaxe des clients a été relevée dans leur documentation officielle le 2026-10-29. Elle n'a pas été éprouvée sur une installation réelle de chacun (voir Ce qui n'est pas encore vérifié).

Claude Code

Fichier .mcp.json à la racine du projet. Claude Code remplace ${NOM} par la variable d'environnement correspondante : le fichier ne contient aucun secret et peut être versionné.

{
  "mcpServers": {
    "legifrance": {
      "type": "stdio",
      "command": "/home/alice/.mcp-legifrance/bin/mcp-legifrance",
      "args": ["serve"],
      "env": {
        "LF_PISTE_ENV": "sandbox",
        "LF_PISTE_CLIENT_ID": "${LF_PISTE_CLIENT_ID}",
        "LF_PISTE_CLIENT_SECRET": "${LF_PISTE_CLIENT_SECRET}"
      }
    }
  }
}

Définissez les deux variables dans l'environnement du shell qui lance Claude Code. La même entrée peut s'ajouter en ligne de commande avec claude mcp add-json legifrance '<json>', où <json> est le contenu de l'entrée legifrance ci-dessus (option --scope user pour toutes vos sessions). Évitez claude mcp add --env LF_PISTE_CLIENT_SECRET=… : le secret resterait dans l'historique de votre shell. Vérification : claude mcp list, puis /mcp dans une session.

Claude Desktop
  • Voie recommandée : le bundle MCPB (ci-dessus).
  • Configuration manuelle : fichier claude_desktop_config.json (sous macOS ~/Library/Application Support/Claude/ ; sous Windows, dossier Claude des données d'application de l'utilisateur, AppData\Roaming\Claude). Le secret y est en clair.
{
  "mcpServers": {
    "legifrance": {
      "command": "/Users/alice/.mcp-legifrance/bin/mcp-legifrance",
      "args": ["serve"],
      "env": {
        "LF_PISTE_ENV": "sandbox",
        "LF_PISTE_CLIENT_ID": "<votre client_id>",
        "LF_PISTE_CLIENT_SECRET": "<votre client_secret>"
      }
    }
  }
}
VS Code

Fichier .vscode/mcp.json. Les invites promptString avec password: true demandent les identifiants au premier démarrage et VS Code les conserve ; rien n'est écrit dans le fichier.

{
  "inputs": [
    { "type": "promptString", "id": "lf-client-id", "description": "PISTE client ID", "password": true },
    { "type": "promptString", "id": "lf-client-secret", "description": "PISTE client secret", "password": true }
  ],
  "servers": {
    "legifrance": {
      "type": "stdio",
      "command": "/home/alice/.mcp-legifrance/bin/mcp-legifrance",
      "args": ["serve"],
      "env": {
        "LF_PISTE_ENV": "sandbox",
        "LF_PISTE_CLIENT_ID": "${input:lf-client-id}",
        "LF_PISTE_CLIENT_SECRET": "${input:lf-client-secret}"
      }
    }
  }
}
  • Un fichier .mcp.json à la racine de l'espace de travail est aussi lu par VS Code, mais sans inputs ni substitution : n'y mettez pas de secret.
  • Variante avec fichier d'environnement : "envFile": "${workspaceFolder}/.env.legifrance", fichier ignoré par git.
  • Les outils sont annoncés en lecture seule mais ouverts sur le monde extérieur : VS Code peut demander une confirmation avant de transmettre un résultat. Son comportement exact n'a pas été mesuré.
  • Depuis la galerie MCP de VS Code, seul le paquet Docker est installable.
Cursor

Fichier ~/.cursor/mcp.json (global) ou .cursor/mcp.json (projet). Format et substitution de variables non vérifiés ; le secret est en clair.

{
  "mcpServers": {
    "legifrance": {
      "command": "/home/alice/.mcp-legifrance/bin/mcp-legifrance",
      "args": ["serve"],
      "env": { "LF_PISTE_CLIENT_ID": "<votre client_id>", "LF_PISTE_CLIENT_SECRET": "<votre client_secret>" }
    }
  }
}
Variante Docker (tous les clients)
{
  "mcpServers": {
    "legifrance": {
      "command": "docker",
      "args": ["run", "-i", "--rm",
               "-e", "LF_PISTE_CLIENT_ID", "-e", "LF_PISTE_CLIENT_SECRET", "-e", "LF_PISTE_ENV",
               "-v", "mcp-legifrance-audit:/data/audit",
               "ghcr.io/muchiny/mcp-legifrance:0.3.0"],
      "env": {
        "LF_PISTE_CLIENT_ID": "${LF_PISTE_CLIENT_ID}",
        "LF_PISTE_CLIENT_SECRET": "${LF_PISTE_CLIENT_SECRET}",
        "LF_PISTE_ENV": "sandbox"
      }
    }
  }
}

Le client pose les variables sur le processus docker, qui les transmet au conteneur par -e NOM. La substitution ${…} dans env est celle de Claude Code ; pour un autre client, utilisez ses propres invites ou valeurs. C'est aussi la voie de repli sous Windows quand Smart App Control bloque le binaire.

Windows
  • En JSON, doublez les barres obliques inverses : "C:\\Users\\alice\\.mcp-legifrance\\bin\\mcp-legifrance.exe". Pas de cmd /c : c'est un exécutable natif.
  • Après l'installeur, redémarrez le client (le PATH est mis à jour dans le registre utilisateur) ou donnez le chemin absolu.
  • N'écrivez pas le secret avec setx : il serait stocké en clair dans le registre et dans l'historique PowerShell. Préférez le bundle MCPB ou les invites de VS Code.
  • Le chemin par défaut du journal d'audit sous Windows n'est pas vérifié : check-config affiche le chemin effectif.
Passer en production
  1. Créer une application PISTE de production et y souscrire l'API Légifrance.
  2. Positionner LF_PISTE_ENV=production et les identifiants de cette application.
  3. Lancer mcp-legifrance check-config --online.
  4. Appeler fr_coverage : l'environnement affiché doit être production.

Les adresses de production (oauth.piste.gouv.fr, api.piste.gouv.fr) n'ont jamais été appelées par le projet : elles sont documentées mais non vérifiées.

Variables d'environnement

La configuration vient uniquement de l'environnement (aucun fichier, aucune configuration distante). Elle est lue une fois au démarrage : après toute modification, redémarrez le serveur. Une variable vide ou blanche compte comme absente.

Réglages usuels
VariableRôleValeurs et défaut
LF_PISTE_CLIENT_IDidentifiant OAuth de votre application PISTEobligatoire
LF_PISTE_CLIENT_SECRETsecret OAuth de la même applicationobligatoire, jamais affiché
LF_PISTE_ENVenvironnement PISTEsandbox (défaut) ou production
LF_PISTE_OAUTH_URL, LF_PISTE_BASE_URLsurcharge des adresses PISTE (à éviter : préférez LF_PISTE_ENV)voir les règles ci-dessous
LF_AUDIT_DIRrépertoire du journal d'auditchemin absolu (un ~/ en tête est développé) ; défaut : répertoire de données de l'utilisateur, sous-dossier mcp-legifrance/audit
LF_AUDIT_MODEconduite si le journal ne peut pas être écritstrict (défaut : l'appel d'outil échoue en [audit_error]) ou best-effort
LF_LOGfiltre des journaux (syntaxe tracing), écrits sur stderrdéfaut : info, avec warn pour les bibliothèques réseau et MCP
LF_HTTP_TIMEOUT_Sdélai par requête vers PISTE, en secondes1 à 300, défaut 40
LF_TOOL_DEADLINE_Sdélai global par appel d'outil, en secondes1 à 600, défaut 60

Règles des surcharges d'adresse : https obligatoire (http n'est admis que vers 127.0.0.1, ::1 et localhost) ; ni identifiant utilisateur, ni paramètres, ni fragment dans l'adresse. Un hôte autre que les quatre hôtes officiels est accepté avec l'avertissement CustomHost (au démarrage, dans check-config et dans les lacunes de fr_coverage). Un hôte officiel de l'autre environnement est un problème EnvMismatch : le serveur ne déduit jamais l'environnement des adresses, il demande LF_PISTE_ENV=production.

N'activez pas debug ou trace pour rmcp dans LF_LOG : la bibliothèque y journalise alors les réponses entières.

Réglages avancés

Ces quatre réglages ne figurent ni dans server.json ni dans le manifeste du bundle MCPB. Pour les employer, ajoutez-les au bloc env de votre client. Une valeur invalide ne bloque pas le démarrage : le défaut s'applique, un avertissement est journalisé, et check-config affiche la valeur effective.

VariableRôleValeurs et défaut
LF_PISTE_RPSrequêtes par seconde vers PISTE1 à 100, défaut 5
LF_PISTE_BURSTrafale autorisée du limiteur1 à 100, défaut 10
LF_PISTE_CONCURRENCYrequêtes en vol en même temps1 à 16, défaut 4
LF_PISTE_MOJIBAKE_REPAIRréparation des textes dont les accents sont corrompuson (défaut) ou off
Configuration invalide : mode dégradé

Si la configuration PISTE est invalide (environnement inconnu, adresse refusée, identifiants absents), le serveur démarre quand même : chaque outil PISTE répond [config_error] … sans appel réseau, et fr_coverage comme check-config décrivent le problème.

Variables héritées de fr-eli-mcp

Ces noms viennent du serveur Python dont ce projet est la réécriture (NOTICE). Ils sont documentés ici pour la migration.

Variable héritéeComportementÀ utiliser à la place
FR_ELI_CLIENT_IDlue si LF_PISTE_CLIENT_ID est absente, avec un avertissement de dépréciation sur stderr ; LF_PISTE_CLIENT_ID l'emporte si les deux existentLF_PISTE_CLIENT_ID
FR_ELI_CLIENT_SECRETidemLF_PISTE_CLIENT_SECRET
FR_ELI_OAUTH_URLidemLF_PISTE_ENV, ou LF_PISTE_OAUTH_URL
FR_ELI_BASE_URLidemLF_PISTE_ENV, ou LF_PISTE_BASE_URL
FR_ELI_AUDIT_DIRidemLF_AUDIT_DIR
FR_ELI_CACHE_DIRjamais lue : plus de cache disque. Définie, elle produit l'avertissement « ignored » au démarrage et dans check-configaucune
FR_ELI_RUNTIME_URLjamais lue : plus de configuration distante. Avertissement « ignored »aucune
FR_ELI_ENVjamais lue (la référence ne l'employait pas non plus). Avertissement « ignored »LF_PISTE_ENV
PISTE_CLIENT_ID, PISTE_CLIENT_SECRETjamais lues (la documentation de la référence les citait à tort). Avertissement « ignored »LF_PISTE_CLIENT_ID, LF_PISTE_CLIENT_SECRET

L'avertissement a la forme FR_ELI_ENV ignored: it is never read, ou FR_ELI_CLIENT_ID is deprecated: use LF_PISTE_CLIENT_ID pour une variable lue par compatibilité. Il n'est jamais accompagné de la valeur de la variable.

Mode hors ligne (index local DILA)

Option : au lieu d'appeler PISTE, le serveur lit une copie locale des codes, lois et décrets de Légifrance (le fonds LEGI des données ouvertes de la DILA). Vous n'avez alors ni compte PISTE à créer, ni requête qui quitte votre ordinateur. Les décisions de justice, les délibérations de la CNIL, les conventions collectives et les accords d'entreprise ne sont pas dans cette copie : ces outils répondent [config_error] et demandent PISTE. Quand LF_DILA_DIR est défini, le serveur ne se rabat jamais sur PISTE.

Place nécessaire (mesurée le 2026-10-31 sur les archives réelles : 1 fichier complet du 2025-07-13 et 481 mises à jour) : 3,1 Go d'archives à télécharger, puis un index de 3,6 Go (2 405 838 documents, aucun membre refusé), soit environ 7 Go de disque. La construction a pris 1 h 10 avec un binaire de développement non optimisé et 3,6 Go de mémoire au plus ; la durée avec le binaire publié n'a pas été mesurée.

Trois étapes.

  1. Télécharger les archives avec le script du dépôt (bash et curl ; une seule connexion, avec des pauses, reprise possible) :
     scripts/fetch-dila-dumps.sh ~/dila/archives
  2. Construire l'index (aucun accès au réseau ; rien n'est extrait sur le disque ; relancer la commande n'applique que ce qui est nouveau) :
     mcp-legifrance build-dila-index --archives ~/dila/archives --index ~/dila/index
  3. Déclarer l'index dans la configuration de votre client MCP, à la place des variables PISTE, avec un chemin absolu : LF_DILA_DIR=/chemin/absolu/vers/dila/index. Vérifiez avec mcp-legifrance check-config.

À savoir.

  • C'est un instantané : un texte publié après le fichier téléchargé manque, et une absence est rendue unresolvable, jamais not_found. La date de l'instantané n'est pas encore indiquée dans les réponses ; le fichier registry.tsv du dossier d'index liste les archives appliquées.
  • Pour mettre à jour, relancez les étapes 1 et 2. Un nouveau fichier complet de la DILA refait l'index depuis zéro. Ne lancez pas build-dila-index pendant qu'un client lit le même index.
  • Le script est en bash : sous Windows, il n'a pas été essayé (WSL ou Git Bash). Le bundle MCPB ne propose pas ce réglage, et l'image Docker n'a pas été essayée avec un index monté.
  • Licence des données. Les fiches de la DILA demandent de mentionner la paternité (DILA), l'adresse de téléchargement, le nom du fichier et sa date. En cas de doute, citez : « Source : DILA, base LEGI, Légifrance, fichier <nom> du <date>, https://echanges.dila.gouv.fr/OPENDATA/LEGI/ ». Les fiches citent la Licence Ouverte 2.0 et le portail data.gouv.fr celle de 2014 : l'écart n'est pas tranché (voir docs/recherche/10-dumps-dila.md §8).

Hôtes contactés

Le serveur ne contacte que les hôtes ci-dessous, et seulement dans les cas indiqués. Aucune télémétrie, aucun compte, aucune vérification de version en ligne, aucune mise à jour automatique.

ComposantHôtesQuand
Binaire, LF_PISTE_ENV=sandbox (défaut)sandbox-oauth.piste.gouv.fr, sandbox-api.piste.gouv.frau premier appel d'outil, jamais au démarrage
Binaire, LF_PISTE_ENV=productionoauth.piste.gouv.fr, api.piste.gouv.fr (jamais appelés par le projet : non vérifiés)idem
Binaire avec LF_PISTE_OAUTH_URL ou LF_PISTE_BASE_URLl'hôte que vous fournissez (https, ou http vers la boucle locale seulement) ; avertissement CustomHost s'il n'est pas l'un des quatre hôtes officielsidem
check-config --onlinel'hôte OAuth de l'environnement choisi : une requête de jeton, jamais d'appel à l'APIà la demande
Installeurs shell et PowerShell, bundle MCPB, archivesgithub.com et l'hôte vers lequel GitHub redirige le téléchargement des fichiers de releaseà l'installation
cargo install --gitgithub.com (clone du dépôt à l'étiquette), index.crates.io et static.crates.io (dépendances)à l'installation
Image Dockerghcr.ioau docker pull
Script de téléchargement des dumps DILA (version 1.0, hors binaire)echanges.dila.gouv.frlancé explicitement par l'utilisateur

Derrière un proxy d'entreprise, le binaire emploie le proxy système ; la prise en compte des variables de proxy usuelles n'est pas vérifiée. Les installeurs de dist déclarent respecter les variables de proxy usuelles.

Attribution, licence des données et non-affiliation

Source des données. Les contenus servis proviennent de Légifrance (https://www.legifrance.gouv.fr), service de la Direction de l'information légale et administrative (DILA), par l'API Légifrance du portail PISTE. Ils sont réutilisables sous Licence Ouverte 2.0 (Etalab). La mention à reprendre est :

Source : Légifrance / DILA — Licence Ouverte 2.0

Date de consultation. Quand vous citez ou republiez un texte obtenu par ce serveur, indiquez aussi la date à laquelle vous l'avez consulté. L'outil fr_coverage la fournit : son champ consulted_on donne la date du jour (fuseau Europe/Paris), et son champ attribution porte la mention ci-dessus. Les instructions du serveur rappellent la source et la licence. La Licence Ouverte demande le concédant et la date de dernière mise à jour ; le serveur ne dispose pas d'un champ fiable de mise à jour par document, et la date de consultation en tient lieu. Qu'une mention globale suffise est une lecture adoptée par défaut, non confirmée.

Valeur des textes. Seules les éditions du Journal officiel signées électroniquement font foi : une réponse de ce serveur n'a pas de valeur opposable et n'est pas un avis juridique. Les décisions de justice sont diffusées pseudonymisées et les délibérations de la CNIL occultées ; le serveur ne lève ni l'un ni l'autre.

Non-affiliation. Ce projet n'est ni édité, ni approuvé, ni soutenu par la DILA, ni par l'AIFE (qui exploite PISTE), ni par aucune autorité publique. « Légifrance » désigne le service public de diffusion du droit : le produit s'appelle mcp-legifrance, ses titres portent « (unofficial) », et il n'emploie aucun logo de Légifrance ni de l'État. Not affiliated with or endorsed by DILA, AIFE or any French public body.

Licence du code. Apache-2.0 (LICENSE), titulaire Loïc Wernert. Le projet est une réécriture en Rust de matematicsolutions/fr-eli-mcp (commit d3b5b13, Apache-2.0), dont il reprend des textes adaptés et des fixtures de test : voir NOTICE. Aucune ligne n'est reprise de projets sous licence AGPL. Les licences des bibliothèques tierces liées au binaire sont réunies dans le fichier de licences tierces fourni à la racine du dépôt et dans chaque archive.

Migrer depuis fr-eli-mcp

Pour un utilisateur de la référence Python (fr-eli-mcp). La note complète, champ par champ, est dans docs/plan/annexes/A-parite.md §6.

  • Commande : remplacez fr-eli-mcp (ou uvx fr-eli-mcp) par mcp-legifrance dans la configuration du client. Le nom du serveur et son nom au registre changent aussi (io.github.muchiny/mcp-legifrance).
  • Variables : renommez FR_ELI_CLIENT_ID et FR_ELI_CLIENT_SECRET en LF_PISTE_CLIENT_ID et LF_PISTE_CLIENT_SECRET (les anciens noms marchent encore, avec un avertissement). Supprimez FR_ELI_CACHE_DIR, FR_ELI_RUNTIME_URL, FR_ELI_ENV, PISTE_CLIENT_ID et PISTE_CLIENT_SECRET, sans effet.
  • Production : LF_PISTE_ENV=production, et supprimez les surcharges d'adresse. Des surcharges vers la production sans cette variable mettent le serveur en mode dégradé (EnvMismatch).
  • Vérification : mcp-legifrance check-config, puis --online pour tester les identifiants.
  • Sorties : lisez citation (ex-human_readable_citation) ; eli_uri, eli_note et dataset_note n'existent plus ; une valeur absente est une clé absente, jamais null ; ne comptez pas sur title. Les tables des matières s'appellent toc (et non articles) et se paginent avec toc_offset = next_toc_offset. D'autres champs sont renommés (date, convention_id, date_publication, path, gaps…) : voir la note complète.
  • Lecture des textes : au-delà de 1 200 caractères, la réponse par défaut est un résumé ; passez detail: "full" et bouclez sur offset = next_offset, ou employez focus.
  • Erreurs : le préfixe [code] donne la nature de l'erreur. Deux codes s'ajoutent à invalid_arg, not_found, upstream_error et config_error : rate_limited (réessayer après le délai) et audit_error. Ne réessayez jamais config_error ni audit_error.
  • Audit : nouveau dossier et nouveau nom de fichier (mcp-legifrance.jsonl) ; trois clés de plus ; les empreintes et les métriques ne se comparent pas à celles de la référence.
  • Client : protocole 2025-06-18 au minimum.

Confidentialité et sécurité

  • Ce qui part sur le réseau : vos requêtes de recherche et les identifiants de documents, avec vos identifiants PISTE, vers l'API Légifrance (DILA) par PISTE (AIFE). Rien d'autre (voir Hôtes contactés).
  • Ce qui reste sur votre machine : un journal d'audit au format JSONL (mcp-legifrance.jsonl, avec rotation), à raison d'une ligne par appel d'outil, quelle qu'en soit l'issue. Il contient une empreinte SHA-256 des arguments, jamais le texte de vos requêtes en clair, ni secret. En mode strict (défaut), un échec d'écriture fait échouer l'appel. Plusieurs processus peuvent partager le même dossier.
  • Journaux : sur stderr uniquement ; stdout ne porte que le protocole. Ni secret, ni texte de requête n'y figure.
  • Les textes renvoyés sont des données, pas des instructions : un modèle ne doit pas exécuter ce qu'un texte juridique lui demanderait.
  • Détails : PRIVACY.md (confidentialité) et SECURITY.md (signalement d'une vulnérabilité par le signalement privé de GitHub, limites connues).

Ce qui n'est pas encore vérifié

Le projet note ses incertitudes plutôt que de les taire. Pour la 0.3.0 :

  • Les adresses PISTE de production n'ont jamais été appelées.
  • La syntaxe de configuration de chaque client est tirée de sa documentation ; elle n'a pas été éprouvée sur une installation réelle (priorité : Claude Code et VS Code). Les formats de Cursor et l'emplacement des fichiers de Claude Desktop sont à confirmer.
  • Le bundle MCPB n'a pas encore été essayé dans Claude Desktop sous macOS et Windows.
  • cargo install --git n'a pas encore été essayé sous macOS et Windows.
  • Le chemin par défaut du journal d'audit sous Windows, ses permissions, la prise en compte d'un proxy et le comportement de VS Code face à openWorldHint ne sont pas mesurés.
  • Le bac à sable PISTE renvoie parfois d'autres données que la production.
  • L'index local DILA a été construit une fois sur les archives réelles (1 h 10 avec un binaire de développement) et interrogé sur quelques requêtes, sur Linux seulement : la durée avec le binaire publié, le comportement sous Windows et macOS, la date de l'instantané dans les réponses et la licence propre à chaque fonds ne sont pas vérifiés.
  • L'adresse Légifrance qu'un article de loi reçoit dans source_url n'a pas été ouverte dans un navigateur pour confirmer qu'elle s'affiche.
  • Un passage de 21 tests en bac à sable PISTE a réussi le 2026-10-29 ; il ne dit rien de la production, et la CI ne rejoue qu'une partie de ces tests chaque semaine.

Le registre complet des points ouverts est dans docs/plan/09-risques-et-questions.md.

Développer et contribuer

LangageRust (édition 2024, MSRV 1.88, chaîne 1.99.0 épinglée), workspace Cargo crates/lf-*, binaire mcp-legifrance
Architecturehexagonale : lf-domain pur → lf-application (ports, cas d'usage) → adapters PISTE, cache, audit, MCP → lf-app (binaire)
SDK MCPrmcp 3.5.1
Qualité100 % de couverture en lignes, régions et fonctions, à une exception nommée près (stdio.rs, la colle sur les vrais stdin et stdout, couverte par un test de bout en bout du binaire) ; mutation : le diff de chaque PR est muté sur les fichiers à risque seulement, le reste du code l'est chaque semaine, et des mutants survivants y sont connus et non résolus ; make ci est la preuve de complétion

Frequently asked questions

What is Légifrance (unofficial)?

Unofficial MCP server for French law via the Légifrance API (PISTE): search, read and cite texts.

How do I install Légifrance (unofficial)?

Follow the installation steps in its documentation, shown on this page and in its repository.

Does Légifrance (unofficial) need an API key?

Yes. It expects LF_PISTE_CLIENT_ID, LF_PISTE_CLIENT_SECRET, which you set in its configuration.

Is Légifrance (unofficial) open source?

Yes. Its code is on GitHub under the Apache-2.0 license.

Who maintains Légifrance (unofficial)?

It is published by muchiny. AI.tn lists it but does not maintain or endorse it.

From the official MCP Registry. Listing is not an endorsement: review a server's code and permissions before giving it access to your data.