Metadata-Version: 2.4
Name: nomos-ai
Version: 0.4.2
Summary: Nomos AI MCP server for legal use
Requires-Python: >=3.10
Requires-Dist: flashtext>=2.7
Requires-Dist: huggingface-hub>=0.20
Requires-Dist: mcp[cli]<2,>=1.0
Requires-Dist: numpy>=1.24
Requires-Dist: onnxruntime>=1.17
Requires-Dist: pdfminer-six>=20221105
Requires-Dist: pdfplumber>=0.11
Requires-Dist: presidio-analyzer>=2.2.351
Requires-Dist: presidio-anonymizer>=2.2.351
Requires-Dist: pypdf>=4.0
Requires-Dist: python-docx>=1.1
Requires-Dist: spacy<3.9,>=3.8
Requires-Dist: tokenizers>=0.15
Provides-Extra: camembert
Description-Content-Type: text/markdown

# NomosAI — Assistant juridique IA

Serveur MCP pour Claude Desktop et Claude Code. Anonymise les documents confidentiels, initialise des espaces de travail juridiques et installe des skills spécialisés pour la recherche jurisprudentielle et la rédaction de tâches juridiques.

---

## Installation

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

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

**Étape 2 — Installer NomosAI :**

```bash
uv tool install nomos-ai
```

**Étape 3 — Connecter NomosAI à Claude :**

---

### Claude Code (CLI / VS Code / JetBrains)

**Méthode recommandée — commande automatique (scope utilisateur) :**

```bash
claude mcp add --scope user nomos-ai -- uv tool run nomos-ai
```

Cette commande inscrit le serveur dans `~/.claude.json` (fichier d'état interne géré par Claude Code — ne pas éditer directement).

**Méthode manuelle — partage au niveau projet (à committer dans le dépôt) :**

1. Créer `.mcp.json` à la **racine du projet** :

```json
{
  "mcpServers": {
    "nomos-ai": {
      "command": "uv",
      "args": ["tool", "run", "nomos-ai"]
    }
  }
}
```

2. Autoriser le serveur sans prompt de confirmation en ajoutant dans `.claude/settings.json` (projet) ou `~/.claude/settings.json` (utilisateur) :

```json
{
  "enabledMcpjsonServers": ["nomos-ai"]
}
```

3. Rendre visible, s'assurer d'avoir dans `~/.claude.json`:

```json
{
  "mcpServers": {
      "nomos-ai": {
        "type": "stdio",
        "command": "uv",
        "args": [
          "tool",
          "run",
          "nomos-ai"
        ],
        "env": {}
      }
    }
}
```

Redémarrer Claude Code (ou lancer `/mcp` pour reconnecter sans redémarrer).

---

### Claude Desktop (claude.ai/chat)

Éditer le fichier de configuration selon le système :

| Système | Fichier |
|---------|---------|
| **Windows** | `%APPDATA%\Claude\claude_desktop_config.json` |
| **Mac** | `~/Library/Application Support/Claude/claude_desktop_config.json` |

Ajouter ou compléter la section `mcpServers` :

```json
{
  "mcpServers": {
    "nomos-ai": {
      "command": "uv",
      "args": ["tool", "run", "nomos-ai"]
    }
  }
}
```

Redémarrer Claude Desktop.

---

## Sécurité — confinement (postes clients)

Sur un poste qui traite des dossiers confidentiels, on confine Claude Code au dossier de travail : il ne peut ni lire ni écrire ailleurs, et `documents-confidentiels/` est bloqué partout. Une commande, dans le terminal :

```bash
nomos-ai install-confinement            # tout le poste (scope utilisateur)
nomos-ai install-confinement --managed  # imposé par l'IT, non contournable (administrateur)
```

Le scope `--managed` pose une politique au niveau machine que l'utilisateur ne peut pas retirer : c'est l'option pour une équipe sécurité. Les shells restent utilisables pour lire et parcourir le dossier (`ls`, `cat`, `grep`, `find`…) ; seuls la sortie du dossier, `documents-confidentiels/`, le réseau et l'exécution de code arbitraire sont bloqués. Sans confinement machine, `initiate_project` pose un hook équivalent par projet.

---

## Mise à jour

```bash
uv tool upgrade nomos-ai
```

L'outil MCP `check_update` indique si une version plus récente existe sur PyPI. L'upgrade lui-même reste cette commande au terminal (le serveur ne peut pas remplacer ses propres fichiers en cours d'exécution). Redémarrer Claude ensuite pour que le nouveau serveur soit pris en compte.

Les skills ne sont pas mis à jour par cette commande : ils vivent dans `~/.claude/skills/`, hors
du paquet. Après une montée de version, lancer **`update_nomos_skills`** depuis Claude pour les
skills NomosAI, et **`update_cabinet_skills`** pour ceux du cabinet.

---

## Fonctionnalités principales

> 📖 **Référence complète des outils MCP** (paramètres, valeurs de retour, codes d'erreur) : [`docs/MCP.md`](docs/MCP.md).

### Espace de travail juridique — `initiate_project`

Initialise un dossier de travail structuré, éventuellement adossé à un workflow du cabinet (`cabinet_template`, voir ci-dessous) :

- Arborescence standard (`documents-confidentiels/`, `sources/`, `documents-anonymisés/`, `livrables/`, `artefacts/`)
- `CLAUDE.md` en deux parties : le socle NOMOS, toujours écrit et annoncé comme impératif (répertoires, confidentialité, hook), puis le workflow du cabinet s'il en a un. NomosAI ne fournit aucun workflow de dossier : la méthode de travail appartient au cabinet.
- Confinement du dossier : les outils de fichier sont restreints à la racine du projet, `documents-confidentiels/` est bloqué partout, les shells limités à la lecture et au parcours. Le confinement est posé au niveau machine (recommandé, voir [Sécurité](#sécurité--confinement-postes-clients)) ou, à défaut, par ce hook de projet. Il n'est écrit ici que si aucun confinement machine n'est déjà en place.

### Skills juridiques — `initialise_nomos_skills` / `update_nomos_skills` / `export_nomos_skills`

Un skill est une méthode de travail que Claude applique quand la tâche se présente : quelle
source interroger, dans quel ordre, sous quelle forme rendre le résultat.

| Outil | Effet |
|-------|-------|
| `initialise_nomos_skills()` | Installe les skills dans `~/.claude/skills/`. **N'écrase pas** l'existant. |
| `update_nomos_skills()` | Liste les skills, puis met à jour ceux que l'on choisit (écrase la version locale). |
| `export_nomos_skills()` | Produit un `.zip` par skill dans `nomos-skills/` sur le Bureau, pour téléversement sur **Claude.ai** (Réglages > Capacités > Skills) ou glisser-déposer dans la conversation. |

**Recherche — jurisprudence**

| Skill | Rôle | Source |
|-------|------|--------|
| `recherche-Ccass_droit-prive` | Cour de cassation : pourvoi, qualification, manque de base légale, état d'une jurisprudence | Judilibre |
| `recherche-fond-droit-prive` | Juridictions du fond : cours d'appel, TJ, tribunaux de commerce, recherche par n° RG | Judilibre |
| `recherche-ce-droit-public` | Conseil d'État : REP, référés, avis contentieux, responsabilité, contrats administratifs | ArianeWeb + Légifrance |
| `recherche-CEDH` | Cour EDH : article de la Convention, État défendeur, importance, n° de requête | HUDOC |
| `recherche-CJUE_UE` | CJUE et Tribunal : renvoi préjudiciel, recours en annulation, manquement, ECLI EU | InfoCuria + EUR-Lex |

**Recherche — régulateurs et doctrine administrative**

| Skill | Rôle | Source |
|-------|------|--------|
| `recherche-cnil` | Délibérations CNIL : sanctions, mises en demeure, référentiels, lignes directrices EDPB | Open Legi |
| `recherche-adlc-concurrence` | Autorité de la concurrence : ententes, abus de position dominante, concentrations | MCP ADLC |
| `recherche-commission-dgcomp` | Commission européenne, DG COMP : art. 101 et 102 TFUE, concentrations, soft law | Legal Data Hunter |
| `recherche-acpr` | Commission des sanctions ACPR : LCB-FT, protection de la clientèle, gouvernance | MCP ACPR |
| `recherche-BOFIP_fiscal` | Doctrine fiscale : BOI, rescrits, opposabilité (art. L. 80 A LPF) | MCP BOFiP |

**Rédaction — Cour de cassation**

| Skill | Rôle |
|-------|------|
| `extraction-faits` | Lit les pièces et produit `livrables/faits-pertinents.md`, chargé en contexte pour la session |
| `redaction-faits` | Rédige la section « I.- Faits et procédure » et applique les règles rédactionnelles du cabinet |
| `redaction-MA-cassation` | Mémoire ampliatif : construction des moyens contre l'arrêt d'appel |
| `redaction-MD-cassation` | Mémoire en défense : réponse aux moyens adverses |
| `redaction-moyen` | Chapeau du moyen : grief et « Alors que » de chaque branche |

**Outillage du cabinet**

| Skill | Rôle |
|-------|------|
| `creation-outils-nomos` | Crée un outil du cabinet — skill ou `CLAUDE.md` de workflow — le dépose dans le dossier partagé, le déploie sur le poste et organise la phase de test |

Le cabinet ajoute ensuite ses propres skills métier, qui ne transitent pas par NomosAI : voir
[Dossier cabinet](#dossier-cabinet--configure_cabinet--list_templates--initialise_cabinet_skills--update_cabinet_skills).

### Dossier cabinet — `configure_cabinet` / `list_templates` / `initialise_cabinet_skills` / `update_cabinet_skills`

Le cabinet range son propre savoir-faire dans un dossier partagé (Google Drive, SharePoint,
réseau interne) : ses skills métier et ses `CLAUDE.md` de workflow, qu'il rédige lui-même.
NomosAI fournit les skills de recherche et les connecteurs ; le contenu du dossier cabinet
**reste local au cabinet**, le serveur le lit depuis le poste.

```
cabinet-nomos/
├── skills/       ← skills métier du cabinet (un sous-dossier par skill, avec SKILL.md)
├── templates/    ← CLAUDE.md de workflow, un .md par type de dossier récurrent
└── _zips/        ← archives générées pour l'upload sur claude.ai / Cowork
```

- `configure_cabinet(cabinet_path=…)` déclare le dossier sur le poste (écrit `~/.nomos-cabinet/config.json`) ; sans argument, il affiche l'état courant. Le skill `mise-en-place_NOMOS` le fait aussi lors de l'installation.
- `list_templates()` liste dans le chat les workflows du cabinet ; `initiate_project(directory=…, cabinet_template="litige-commercial")` pose le `CLAUDE.md` correspondant dans le dossier d'affaire.
- `initialise_cabinet_skills()` déploie les skills du cabinet vers `~/.claude/skills/` sans écraser l'existant ; `update_cabinet_skills()` les met à jour (écrase) quand un collaborateur a modifié le dossier partagé. Les deux régénèrent les `.zip` de `_zips/` pour Claude Desktop / Cowork.

### Recherche ArianeWeb — `search_arianeweb` / `get_conclusion`

Interroge directement la base de jurisprudence du Conseil d'État :

- Recherche plein texte ou par numéro dans les décisions CE, CAA, Tribunal des conflits et conclusions de rapporteurs publics
- Téléchargement et extraction du texte intégral des conclusions des rapporteurs publics (PDF)

### Recherche HUDOC (CEDH) — `search_hudoc` / `get_hudoc_decision`

Interroge directement la base de jurisprudence de la Cour européenne des droits de l'homme :

- Recherche structurée : plein texte, numéro de requête, article de la Convention, État défendeur, importance, formation, thésaurus, dates. Par défaut : arrêts de Grande Chambre et de chambre, en français.
- Téléchargement du document Word officiel d'un arrêt ou d'une décision (par `itemid` ou numéro de requête, avec repli automatique sur l'anglais), sauvegarde dans `artefacts/` et extraction du texte intégral en Markdown.

### Recherche InfoCuria (CJUE) — `search_curia` / `get_curia_document`

Interroge directement la base de jurisprudence de la Cour de justice de l'Union européenne (Cour de justice + Tribunal général) :

- Recherche plein texte (arrêts, conclusions d'avocat général, ordonnances), avec filtres par juridiction, type de document et dates, et recherche par numéro d'affaire ou ECLI. Chaque résultat expose un **extrait surligné** du passage correspondant à la requête.
- Téléchargement et extraction du texte intégral d'un document (par ECLI ou numéro d'affaire), sauvegarde dans `artefacts/`. Détails techniques de l'API dans [docs/curia.md](docs/curia.md).

### Autorités administratives indépendantes — `acpr_*` / `adlc_*` / `amf_*`

Treize outils de recherche dans la pratique décisionnelle de trois autorités, servis depuis des corpus **locaux** : une fois le corpus en place, la recherche ne dépend d'aucune API tierce et fonctionne hors ligne.

| Autorité | Corpus | Couverture |
|----------|--------|------------|
| **ACPR** | décisions + catalogue de soft law | 2010 → aujourd'hui |
| **ADLC** — Autorité de la concurrence | décisions + catalogue de soft law | 1988 → aujourd'hui |
| **AMF** — Commission des sanctions | 443 décisions + 207 documents de doctrine | 2022 → aujourd'hui |

Pour chaque autorité : recherche plein texte avec filtres (année, type de sanction, type de décision, secteur), accès direct par référence avec deux niveaux de lecture (`filter` pour trancher la pertinence, `full` pour le texte intégral structuré), parcours exhaustif par filtres, et recherche dans la soft law.


### Entreprises françaises — `entreprise_search` / `entreprise_get` / `entreprise_bodacc` / `entreprise_beneficiaires` / `entreprise_actes` / `entreprise_bilan`

Interroge en temps réel trois sources publiques gratuites :

- **Annuaire des entreprises (DINUM)**, sans authentification : recherche par nom, SIREN, SIRET ou dirigeant, puis fiche complète (forme juridique, état, siège, capital, code NAF, dirigeants, finances du dernier exercice).
- **BODACC (DILA)**, sans authentification : annonces légales, avec filtre par famille (créations, modifications, procédures collectives, ventes et cessions).
- **INPI RNE**, authentifié : actes déposés (statuts, PV d'AG, modifications), bilans structurés ou PDF, bénéficiaires effectifs. Les PDF se récupèrent via `entreprise_acte_download` / `entreprise_bilan_download` (destination : `artefacts/` du projet).

Les outils INPI supposent un compte gratuit chez l'INPI : le skill `mise-en-place_NOMOS` s'en charge de bout en bout, sans que le mot de passe transite par la conversation ni par un fichier du projet. Tant que ce n'est pas fait, les outils DINUM et BODACC restent pleinement fonctionnels et les outils INPI indiquent eux-mêmes la marche à suivre. La consultation des bénéficiaires effectifs suppose en outre une habilitation spécifique auprès de l'INPI (arrêt CJUE C-601/20, juillet 2024).

> ⚠️ Ces données ne constituent pas un extrait Kbis officiel. Pour un Kbis certifié, consulter [infogreffe.fr](https://infogreffe.fr).

### Anonymisation — `pseudonymize_file` / `depseudonymize_file`

Détecte et remplace les données personnelles dans les documents `.docx`, `.pdf`, `.txt`, `.md` et `.rst`, et produit un Markdown pseudonymisé. Appelé **sans chemin**, `pseudonymize_file` balaie de lui-même `documents-confidentiels/` (les noms de fichiers ne transitent jamais par le contexte). Supporte le français, l'anglais et cinq autres langues européennes.

### Conversion — `convert_to_markdown`

Convertit en Markdown les fichiers dans un format non supporté nativement (`.doc`, `.odt`, `.rtf`, `.html`, `.htm`, `.epub`, `.tex`, `.org`, `.wpd`) via **pandoc**. Accepte n'importe quel mélange de fichiers et/ou de dossiers via `paths`, avec un dossier de destination optionnel (`output_dir`). Sans `paths`, traite par défaut le dossier `documents-confidentiels/` (les `.md` produits y restent confidentiels). Les `.md` servent de cache (pas de reconversion).

`pseudonymize_file` tente aussi cette conversion automatiquement avant d'échouer sur un format non supporté.

**Pré-requis :** [pandoc](https://pandoc.org) installé. Les `.doc` binaires (que pandoc ne lit pas) nécessitent en plus [LibreOffice](https://www.libreoffice.org) ; sinon, ré-enregistrez-les en `.docx`.

---

## Formats supportés

**Nativement :** `.docx` · `.pdf` · `.txt` · `.md` · `.rst`

**Via conversion pandoc :** `.doc` · `.odt` · `.rtf` · `.html` · `.htm` · `.epub` · `.tex` · `.org` · `.wpd`
