Légifrance (unofficial)
Unofficial MCP server for French law via the Légifrance API (PISTE): search, read and cite texts.
Installation
Ajoutez ceci à la configuration MCP de votre client (Claude Desktop : claude_desktop_config.json ; Cursor : .cursor/mcp.json ; VS Code et les autres utilisent la même forme « mcpServers »).
https://github.com/muchiny/mcp-legifrance/releases/download/v1.0.1/mcp-legifrance-1.0.1.mcpbVariables d'environnement
LF_PISTE_CLIENT_IDobligatoire secret OAuth client ID of your own Légifrance application on piste.gouv.fr. Never share it.LF_PISTE_CLIENT_SECRETobligatoire secret OAuth client secret of the same PISTE application.LF_PISTE_ENVPISTE environment; credentials are environment-specific.
ghcr.io/muchiny/mcp-legifrance:1.0.1claude 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
{
"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"
}
}
}
}
Variables d'environnement
LF_PISTE_CLIENT_IDobligatoire secret OAuth client ID of your own Légifrance application on piste.gouv.fr. Never share it.LF_PISTE_CLIENT_SECRETobligatoire secret OAuth client secret of the same PISTE application.LF_PISTE_ENVPISTE environment; credentials are environment-specific.
Documentation
Tirée du README du projet sur GitHub, actualisée chaque semaine. Les liens ouvrent GitHub.
Sommaire
- mcp-legifrance
- Sommaire
- Ce que fait le serveur
- Avant d'installer : une application PISTE
- Installation par canal
- Configuration des clients
- Variables d'environnement
- Mode hors ligne (index local DILA)
- Hôtes contactés
- Attribution, licence des données et non-affiliation
- Migrer depuis fr-eli-mcp
- Confidentialité et sécurité
- Ce qui n'est pas encore vérifié
- 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.0et sa release GitHub existent ; avant cela, seule la compilation depuis un clone du dépôt est possible.
Sommaire
- Ce que fait le serveur
- Avant d'installer : une application PISTE
- Installation par canal
- Configuration des clients
- Variables d'environnement
- Mode hors ligne (index local DILA)
- Hôtes contactés
- Attribution, licence des données et non-affiliation
- Migrer depuis fr-eli-mcp
- Confidentialité et sécurité
- Ce qui n'est pas encore vérifié
- 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) :
| Outil | Rôle |
|---|---|
fr_search | Recherche 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_act | Table des matières d'un texte (loi, décret, code) à une date donnée. |
fr_get_text | Texte d'un article, avec lecture progressive (voir ci-dessous). |
fr_get_decision | Décision de justice (Cour de cassation, Conseil constitutionnel, Conseil d'État, cours d'appel, tribunaux administratifs). |
fr_get_deliberation | Délibération de la CNIL. |
fr_get_convention | Convention collective : métadonnées et table des matières. |
fr_get_company_agreement | Accord d'entreprise : métadonnées seules (le texte est une pièce jointe). |
fr_coverage | Ce que le serveur couvre et ne couvre pas, l'environnement PISTE, l'état de la configuration, la source et la date de consultation. |
fr_resolve | Transforme 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_citations | Vé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_related | Liens juridiques d'un article ou d'une décision : textes cités, textes qui le citent, jurisprudence mentionnée. |
fr_diff_article | Compare les versions d'un article à deux dates : passages retirés et ajoutés, avec un peu de contexte. |
fr_search_all | Recherche 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 :
- Créer un compte nominatif sur https://piste.gouv.fr et accepter les conditions d'utilisation de PISTE.
- Dans le catalogue, choisir l'API Légifrance et accepter ses conditions (l'accès est gratuit).
- Créer une application par environnement : une pour le bac à sable (
sandbox), une pour laproduction. Relever leclient_idet leclient_secretdans 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
| Canal | Pour qui | Commande ou action | Inté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 MCPB | Claude Desktop | double-clic sur mcp-legifrance-0.3.0.mcpb | fileSha256 vérifié par le client ; non signé | ||
| Image Docker | isolation, VS Code (galerie), Docker Desktop | docker run -i --rm … | digest, attestation | ||
cargo install --git | développeurs Rust | compilation locale depuis le dépôt, à l'étiquette | Cargo.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)
- Télécharger
mcp-legifrance-0.3.0.mcpbdepuis la page de la release. - Le double-cliquer, ou le glisser dans les réglages d'extensions de Claude Desktop.
- 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 (
sandboxpar 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.--lockedimpose les versions de dépendances contrôlées par le projet. - Le binaire est posé dans le répertoire
binde votre installation Cargo (~/.cargo/binpar défaut) et n'est pas signé. - N'exécutez pas
cargo install mcp-legifrancesans--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 sousmcp__legifrance__fr_searchdans Claude Code. - Commande :
mcp-legifrance, avec l'argumentserve(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 votrePATH, 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_IDetLF_PISTE_CLIENT_SECRETdans 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 --onlinedans 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, dossierClaudedes 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 sansinputsni 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 decmd /c: c'est un exécutable natif. - Après l'installeur, redémarrez le client (le
PATHest 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-configaffiche le chemin effectif.
Passer en production
- Créer une application PISTE de production et y souscrire l'API Légifrance.
- Positionner
LF_PISTE_ENV=productionet les identifiants de cette application. - Lancer
mcp-legifrance check-config --online. - Appeler
fr_coverage: l'environnement affiché doit êtreproduction.
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
| Variable | Rôle | Valeurs et défaut |
|---|---|---|
LF_PISTE_CLIENT_ID | identifiant OAuth de votre application PISTE | obligatoire |
LF_PISTE_CLIENT_SECRET | secret OAuth de la même application | obligatoire, jamais affiché |
LF_PISTE_ENV | environnement PISTE | sandbox (défaut) ou production |
LF_PISTE_OAUTH_URL, LF_PISTE_BASE_URL | surcharge des adresses PISTE (à éviter : préférez LF_PISTE_ENV) | voir les règles ci-dessous |
LF_AUDIT_DIR | répertoire du journal d'audit | chemin 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_MODE | conduite si le journal ne peut pas être écrit | strict (défaut : l'appel d'outil échoue en [audit_error]) ou best-effort |
LF_LOG | filtre des journaux (syntaxe tracing), écrits sur stderr | défaut : info, avec warn pour les bibliothèques réseau et MCP |
LF_HTTP_TIMEOUT_S | délai par requête vers PISTE, en secondes | 1 à 300, défaut 40 |
LF_TOOL_DEADLINE_S | délai global par appel d'outil, en secondes | 1 à 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.
| Variable | Rôle | Valeurs et défaut |
|---|---|---|
LF_PISTE_RPS | requêtes par seconde vers PISTE | 1 à 100, défaut 5 |
LF_PISTE_BURST | rafale autorisée du limiteur | 1 à 100, défaut 10 |
LF_PISTE_CONCURRENCY | requêtes en vol en même temps | 1 à 16, défaut 4 |
LF_PISTE_MOJIBAKE_REPAIR | réparation des textes dont les accents sont corrompus | on (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ée | Comportement | À utiliser à la place |
|---|---|---|
FR_ELI_CLIENT_ID | lue 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 existent | LF_PISTE_CLIENT_ID |
FR_ELI_CLIENT_SECRET | idem | LF_PISTE_CLIENT_SECRET |
FR_ELI_OAUTH_URL | idem | LF_PISTE_ENV, ou LF_PISTE_OAUTH_URL |
FR_ELI_BASE_URL | idem | LF_PISTE_ENV, ou LF_PISTE_BASE_URL |
FR_ELI_AUDIT_DIR | idem | LF_AUDIT_DIR |
FR_ELI_CACHE_DIR | jamais lue : plus de cache disque. Définie, elle produit l'avertissement « ignored » au démarrage et dans check-config | aucune |
FR_ELI_RUNTIME_URL | jamais lue : plus de configuration distante. Avertissement « ignored » | aucune |
FR_ELI_ENV | jamais lue (la référence ne l'employait pas non plus). Avertissement « ignored » | LF_PISTE_ENV |
PISTE_CLIENT_ID, PISTE_CLIENT_SECRET | jamais 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.
- 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 - 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 - 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 avecmcp-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, jamaisnot_found. La date de l'instantané n'est pas encore indiquée dans les réponses ; le fichierregistry.tsvdu 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-indexpendant 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é (voirdocs/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.
| Composant | Hôtes | Quand |
|---|---|---|
Binaire, LF_PISTE_ENV=sandbox (défaut) | sandbox-oauth.piste.gouv.fr, sandbox-api.piste.gouv.fr | au premier appel d'outil, jamais au démarrage |
Binaire, LF_PISTE_ENV=production | oauth.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_URL | l'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 officiels | idem |
check-config --online | l'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, archives | github.com et l'hôte vers lequel GitHub redirige le téléchargement des fichiers de release | à l'installation |
cargo install --git | github.com (clone du dépôt à l'étiquette), index.crates.io et static.crates.io (dépendances) | à l'installation |
| Image Docker | ghcr.io | au docker pull |
| Script de téléchargement des dumps DILA (version 1.0, hors binaire) | echanges.dila.gouv.fr | lancé 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(ouuvx fr-eli-mcp) parmcp-legifrancedans 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_IDetFR_ELI_CLIENT_SECRETenLF_PISTE_CLIENT_IDetLF_PISTE_CLIENT_SECRET(les anciens noms marchent encore, avec un avertissement). SupprimezFR_ELI_CACHE_DIR,FR_ELI_RUNTIME_URL,FR_ELI_ENV,PISTE_CLIENT_IDetPISTE_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--onlinepour tester les identifiants. - Sorties : lisez
citation(ex-human_readable_citation) ;eli_uri,eli_noteetdataset_noten'existent plus ; une valeur absente est une clé absente, jamaisnull; ne comptez pas surtitle. Les tables des matières s'appellenttoc(et nonarticles) et se paginent avectoc_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 suroffset = next_offset, ou employezfocus. - Erreurs : le préfixe
[code]donne la nature de l'erreur. Deux codes s'ajoutent àinvalid_arg,not_found,upstream_erroretconfig_error:rate_limited(réessayer après le délai) etaudit_error. Ne réessayez jamaisconfig_errorniaudit_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 modestrict(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 --gitn'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 à
openWorldHintne 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_urln'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
| Langage | Rust (édition 2024, MSRV 1.88, chaîne 1.99.0 épinglée), workspace Cargo crates/lf-*, binaire mcp-legifrance |
| Architecture | hexagonale : lf-domain pur → lf-application (ports, cas d'usage) → adapters PISTE, cache, audit, MCP → lf-app (binaire) |
| SDK MCP | rmcp 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 |
- CONTRIBUTING.md : boucle de développement, portes de qualité, règles de licence des contributions.
- docs/plan/ : point d'entrée du plan et ordre de lecture ; docs/plan/00-decisions.md : décisions normatives ; docs/plan/07-feuille-de-route.md : jalons et tâches.
- docs/adr/ : décisions d'architecture ; docs/recherche/ : notes de recherche sourcées.
- CHANGELOG.md : ce que contient chaque version.
Questions fréquentes
Qu'est-ce que Légifrance (unofficial) ?
Unofficial MCP server for French law via the Légifrance API (PISTE): search, read and cite texts.
Comment installer Légifrance (unofficial) ?
Suivez les étapes d'installation de sa documentation, affichée sur cette page et dans son dépôt.
Faut-il une clé API pour Légifrance (unofficial) ?
Oui. Il attend LF_PISTE_CLIENT_ID, LF_PISTE_CLIENT_SECRET, à renseigner dans sa configuration.
Légifrance (unofficial) est-il open source ?
Oui. Son code est sur GitHub sous licence Apache-2.0.
Qui maintient Légifrance (unofficial) ?
Il est publié par muchiny. AI.tn le référence sans le maintenir ni le recommander.
Issu du registre MCP officiel. Être listé n'est pas une recommandation : vérifiez le code et les permissions d'un serveur avant de lui donner accès à vos données.