Document anonymization MCP server for legal use
Project description
NomosAI — Anonymiseur de documents juridiques
Détecte et masque les données personnelles 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
É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 :
Directement dans claude code:
claude mcp add nomos-ai -- uvx nomos-ai
Ou manuellement:
É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
**.
Mettre à jour NomosAI
uvx met en cache la version installée. Pour forcer la mise à jour vers la dernière version publiée sur PyPI :
uvx --reinstall nomos-ai
Puis redémarrez Claude Desktop pour que le nouveau serveur soit pris en compte.
Formats supportés
| Entrée | Librairie |
|---|---|
.docx |
python-docx |
.pdf |
pdfminer.six (fallback : pypdf) |
.txt / .md / .rst |
natif |
Anonymisation
# 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 |
<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
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
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.
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file nomos_ai-0.1.5.tar.gz.
File metadata
- Download URL: nomos_ai-0.1.5.tar.gz
- Upload date:
- Size: 72.5 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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
26bcaf9d7b4a9d2af9d015498121cd6677f2eda88d406cf4dd0f10b8f8d6b1fb
|
|
| MD5 |
3961b2cacdcde4ee76c98a81d9ed5d21
|
|
| BLAKE2b-256 |
69b6acf96c92502f0fc3a93298faa85cad032d6353c2b2ef7ecb4c928d584308
|
File details
Details for the file nomos_ai-0.1.5-py3-none-any.whl.
File metadata
- Download URL: nomos_ai-0.1.5-py3-none-any.whl
- Upload date:
- Size: 29.6 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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4d6ddb582dc117b4bd887d3f230b3cdde24b52820e916116d2d95e1e4151e628
|
|
| MD5 |
b27d30bd31f7c471587a5fa4f15976f5
|
|
| BLAKE2b-256 |
ca006ba4390d16b673873f6f709474fe000ecc6e00c7d7f2d5b74af4b460e17f
|