Skip to main content

GDPR-compliant document anonymization MCP server for legal use

Project description

NomosAI — Anonymiseur de documents juridiques

Détecte et masque les données personnelles (RGPD) dans des documents .docx, .pdf, .txt, .md et .rst, et produit un Markdown structuré avec métadonnées de conformité.
Moteur : Microsoft Presidio + spaCy · Langue par défaut : français.

Distribué comme serveur MCP — utilisable directement depuis Claude Desktop ou Claude Code, sans interface graphique.


Installation rapide (utilisateurs finaux)

Étape 1 — Installer uv (une seule fois par machine) :

  • Windows : ouvre PowerShell et colle :
    powershell -c "irm https://astral.sh/uv/install.ps1 | iex"
    
  • Mac : ouvre Terminal et colle :
    curl -LsSf https://astral.sh/uv/install.sh | sh
    

Étape 2 — Ajouter NomosAI à Claude Desktop :

Édite %APPDATA%\Claude\claude_desktop_config.json (Windows) ou
~/Library/Application Support/Claude/claude_desktop_config.json (Mac) :

{
  "mcpServers": {
    "nomos-ai": {
      "command": "uvx",
      "args": ["nomos-ai"]
    }
  }
}

Redémarre Claude Desktop. Au premier démarrage, uvx télécharge automatiquement toutes les dépendances (modèle spaCy fr_core_news_lg inclus, ~600 Mo) — environ 1 à 3 minutes. Les démarrages suivants sont instantanés.

Pour plus de détails, voir le Guide d'utilisation MCP.


Formats supportés

Entrée Librairie
.docx python-docx
.pdf pdfminer.six (fallback : pypdf)
.txt / .md / .rst natif

Installation développeur

Pour travailler sur le code source :

# Cloner le dépôt et installer en mode éditable
pip install -e .

# Ou via conda (environnement existant)
conda activate nomosai
pip install -e .

Le modèle spaCy est installé automatiquement comme dépendance du package.
Pour ajouter le modèle anglais (optionnel) :

python -m spacy download en_core_web_lg

Anonymisation — anonymize.py

# Fichier unique (sortie : <nom>_anonymise.md)
python anonymize.py rapport.pdf

# Sortie explicite
python anonymize.py contrat.docx --output contrat_anon.md

# Dossier complet
python anonymize.py dossier/ --output dossier_anonymise/

# Dossier récursif
python anonymize.py dossier/ --recursive --language fr

# Limiter les types d'entités
python anonymize.py notes.txt --entities PERSON EMAIL_ADDRESS PHONE_NUMBER

# Ajuster le seuil de confiance (défaut : 0.55)
python anonymize.py file.pdf --score-threshold 0.6

# Activer les entités opt-in (dates, chemins fichiers)
python anonymize.py file.pdf --entities PERSON DATE_TIME FILE_PATH

Chaque exécution produit deux fichiers :

Fichier Contenu
<nom>_anonymise.md Document anonymisé avec frontmatter YAML RGPD
<nom>_anonymise-index.md Confidentiel — table placeholder → valeur originale

En mode dossier, un RAPPORT_ANONYMISATION.md de synthèse est également généré.


Désanonymisation — deanonymize.py

Restaure les valeurs originales à partir de l'index.

# Index auto-détecté (<fichier>-index.md voisin)
python deanonymize.py contrat_anonymise.md

# Index explicite
python deanonymize.py contrat_anonymise.md --index contrat_anonymise-index.md

# Sortie explicite
python deanonymize.py contrat_anonymise.md --output contrat_restaure.md

# Dossier complet
python deanonymize.py dossier_anonymise/ --output dossier_restaure/

⚠ Ce script restaure des données personnelles. Réservez-le aux personnes habilitées.


Entités détectées

Par défaut

Entité Label Description
PERSON [PERSONNE_N] Noms de personnes (NLP + titres Pr/Dr/M./Mme)
ORGANIZATION [ORGANISATION_N] Noms d'organisations
LOCATION [ADRESSE_N] Lieux, adresses
EMAIL_ADDRESS [EMAIL_N] Adresses e-mail
PHONE_NUMBER [TELEPHONE_N] Numéros français (+33, 0033, local)
URL [URL_N] URLs
IP_ADDRESS [IP_N] Adresses IP
CREDIT_CARD [CARTE_BANCAIRE_N] Numéros de carte bancaire
IBAN_CODE [IBAN_N] IBAN
NRP [ID_NATIONAL_N] Identifiants nationaux
MEDICAL_LICENSE [LICENCE_MEDICALE_N] Licences médicales
CRYPTO [CRYPTO_N] Adresses crypto

Reconnaisseurs français supplémentaires

Entité Label Exemples
FR_NIR [NIR_N] Numéro de sécurité sociale (15 chiffres)
FR_SIRET [SIRET_N] SIRET (14 chiffres)
FR_SIREN [SIREN_N] SIREN (9 chiffres)
FR_TVA [TVA_N] TVA intracommunautaire
FR_PASSPORT [PASSEPORT_N] Passeport français
FR_CNI [CNI_N] Carte nationale d'identité
FR_DRIVING_LICENSE [PERMIS_N] Permis de conduire
FR_POSTAL_CODE [CODE_POSTAL_N] Code postal (avec contexte)

Entités opt-in (à activer via --entities)

Entité Label Remarque
DATE_TIME [DATE_N] Dates — exclus par défaut (bruit dans les rapports)
FILE_PATH [CHEMIN_FICHIER_N] Chemins Windows/Unix — français uniquement, exclus par défaut

Architecture

anonymize.py              CLI principal (lecture, anonymisation, écriture)
deanonymize.py            CLI de restauration à partir de l'index
src/
  nomosai/
    readers.py            Lecture DOCX/PDF/TXT/MD/RST → liste de Block
    engine.py             Moteur Presidio + filtres faux positifs + dédup spans
    recognizers_fr.py     Reconnaisseurs regex français (NIR, SIRET, téléphone…)
    formatter.py          Rendu Markdown + frontmatter RGPD
    server.py             Serveur MCP (FastMCP, transport stdio)
pyproject.toml            Métadonnées du package et dépendances

Pipeline : Reader → Engine → Formatter → fichier .md + fichier -index.md


Qualité de détection

Seuils de confiance

Le seuil global par défaut est 0.55. Certains types ont un plancher plus élevé pour réduire les faux positifs :

Type Seuil minimum
LOCATION 0.80 (sur-détection dans les tableaux PDF)
FR_SIREN 0.70
FR_CNI 0.70
FR_POSTAL_CODE 0.70

Filtres anti-faux-positifs

L'engine rejette automatiquement les détections dont le texte :

  • est une lettre ou sigle de 1–3 caractères (F, NR, ET…)
  • est une valeur statistique (N=1 035, 75,6…)
  • est un numéro de section (II.4, I.1…)
  • est un fragment tout-en-majuscules multi-mots (en-tête de tableau)
  • contient des artefacts OCR (espaces intrus dans un mot)

Ajouter un reconnaisseur personnalisé

from presidio_analyzer import PatternRecognizer, Pattern

MY_RECOGNIZER = PatternRecognizer(
    supported_entity="MY_ENTITY",
    supported_language="fr",
    patterns=[Pattern("MY_PATTERN", r"\bREGEX\b", score=0.85)],
    context=["mot", "clé", "contextuel"],
)

Ajouter l'instance dans get_french_recognizers() de src/nomosai/recognizers_fr.py et son label dans FRENCH_ENTITY_LABELS.

Voir la doc Presidio.


Publier une nouvelle version sur PyPI

Première publication (une seule fois)

  1. Créer un compte sur pypi.org
  2. Générer un token API : Account Settings → API tokens → Add API token
  3. Publier :
uv build
uv publish --token pypi-<VOTRE_TOKEN>

Mettre à jour une version existante

# 1. Incrémenter la version dans pyproject.toml
#    ex. version = "0.1.0"  →  version = "0.2.0"

# 2. Construire et publier
uv build
uv publish --token pypi-<VOTRE_TOKEN>

Vérifier l'installation depuis PyPI

Sur une machine sans l'environnement de développement :

uvx nomos-ai
# → le serveur MCP démarre (attend sur stdin, pas d'erreur)

Stocker le token de façon permanente

Pour ne pas retaper le token à chaque publication, créer ~/.pypirc :

[pypi]
  username = __token__
  password = pypi-<VOTRE_TOKEN>

Puis publier simplement avec :

uv publish

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

nomos_ai-0.1.0.tar.gz (36.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

nomos_ai-0.1.0-py3-none-any.whl (23.7 kB view details)

Uploaded Python 3

File details

Details for the file nomos_ai-0.1.0.tar.gz.

File metadata

  • Download URL: nomos_ai-0.1.0.tar.gz
  • Upload date:
  • Size: 36.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for nomos_ai-0.1.0.tar.gz
Algorithm Hash digest
SHA256 16f9c0a150c713381f99cdf6ae69d157e8ea7c8e7a9ada43649d420da74487b7
MD5 0b4fa6490ce0b2c76951833f8e83e5e7
BLAKE2b-256 0556b84734eaf65e2cae2fc4dbb1c562d620c487790ff72960ee78e4364b2ff3

See more details on using hashes here.

File details

Details for the file nomos_ai-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: nomos_ai-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 23.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for nomos_ai-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 c367bbf44cd1567ad48991bc98aa52fd81bb9f4242537c1a3357f46502cd0f59
MD5 6fd4da24a0788d99a04c42bc86a3c60c
BLAKE2b-256 49f5a87122e4f7e6588b94bea88b81e65c5622b981b7fc3c95068299857a1828

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page