Un serveur Model Context Protocol (MCP) qui connecte Clio à Claude — permettant aux avocats et aux responsables legal-ops de demander à Claude de lister les matters ouverts, de récupérer les entrées de temps d’un dossier, d’obtenir une fiche de contact ou de résumer l’activité de facturation, le tout depuis une conversation Claude plutôt que depuis l’interface Clio. Le scaffold se trouve dans apps/web/public/artifacts/mcp-server-clio-legal/ et est conçu en lecture seule : les données de matters Clio et les notes d’entrées de temps sont des communications et du travail protégés par le secret professionnel, aussi le serveur n’enregistre aucune opération d’écriture et ne journalise que des métadonnées (nom du tool, horodatage, nombre de résultats — jamais les noms de matters, les notes d’activité ou les identifiants de contacts).
Quand l’utiliser
Optez pour cela lorsque votre équipe juridique ou votre cabinet utilise Clio et que vous vous retrouvez à naviguer dans l’interface plusieurs fois par jour pour répondre aux mêmes questions : combien de matters ouverts existent dans un domaine de pratique donné, quel est le total d’heures facturées sur un dossier ce mois-ci, quels matters n’ont eu aucune activité depuis 30 jours, quelles sont les coordonnées d’un client spécifique. Ces questions sont mécaniques. Elles se prêtent bien à une conversation d’outils avec Claude.
L’argument temporel : un avocat en solo qui effectue cinq de ces recherches par jour, à 3 minutes chacune dans l’interface Clio, investit environ 75 minutes par semaine en navigation. Exécuter les mêmes cinq requêtes comme appels d’outils Claude prend moins de 2 minutes au total. Cela représente environ 60 heures par an restituées au travail juridique substantiel. À un taux horaire de 300 USD, le coût d’opportunité de ne pas automatiser cette navigation avoisine 18 000 USD annuellement (estimation ; votre taux réel et votre volume de requêtes déterminent le chiffre exact). Pour un cabinet où plusieurs avocats effectuent des requêtes similaires sur un inventaire de matters plus large, les chiffres s’adaptent en proportion.
Pour les responsables legal-ops qui génèrent des rapports hebdomadaires d’état des matters, des comparaisons budget/réalisé ou des synthèses de productivité par domaine de pratique, le serveur permet à Claude d’extraire les données brutes et de rédiger le narratif en une seule conversation, sans export vers Excel en étape intermédiaire.
Quand NE PAS l’utiliser
Passez votre chemin si le volume de requêtes matters est inférieur à une dizaine par semaine pour toute l’équipe. Le coût d’installation comprend : l’enregistrement d’une application développeur dans Clio, la réalisation du flux OAuth pour obtenir un access token, l’installation d’un environnement Python et la revue des implications en matière de confidentialité avec le responsable de la politique de sécurité des données du cabinet. Ce coût ne s’amortit pas à faible volume. Utilisez l’interface Clio ; revenez quand le volume augmente.
Passez votre chemin si votre cabinet n’a pas encore de politique écrite couvrant l’accès de l’IA aux données des dossiers clients. Le serveur MCP achemine les données Clio à travers la fenêtre de contexte de Claude, ce qui signifie que les noms de clients, les descriptions de matters, les notes d’entrées de temps et les coordonnées transitent par l’API d’Anthropic. Examinez les conditions de traitement des données d’Anthropic et, si votre juridiction l’exige, obtenez le consentement des clients pour la revue assistée par IA avant tout déploiement. Le scaffold ne remplace pas ce travail de politique.
Passez votre chemin si vous avez besoin d’opérations d’écriture — créer des entrées de temps depuis Claude, mettre à jour le statut de matters, ajouter des contacts ou consigner des communications. Le scaffold n’expose intentionnellement aucun outil d’écriture. L’ajout d’écriture nécessite une modification explicite du code, une revue du modèle de privilège et une évaluation du risque de responsabilité professionnelle qui dépasse le périmètre de ce scaffold. Consultez un juriste avant d’exposer tout accès en écriture à un assistant IA opérant sur des données de dossiers clients.
Installation
La documentation complète est dans apps/web/public/artifacts/mcp-server-clio-legal/README.md. Résumé :
Clonez le bundle dans un dépôt privé. Exécutez pip install -e . dans un environnement virtuel Python 3.11+.
Enregistrez une application développeur dans le portail développeur Clio à l’adresse https://app.clio.com/settings/developer_applications. Accordez un accès en lecture seule aux Matters, Contacts et Activities. Copiez l’App Key (CLIO_CLIENT_ID) et l’App Secret (CLIO_CLIENT_SECRET).
Réalisez le flux OAuth Authorization Code pour obtenir un access token et un refresh token (le README détaille l’échange curl étape par étape).
Définissez les variables d’environnement : CLIO_ACCESS_TOKEN, CLIO_REGION (l’une des valeurs us, eu, ca, au — correspond à l’URL de connexion Clio) et, en option, CLIO_CLIENT_ID, CLIO_CLIENT_SECRET, CLIO_REFRESH_TOKEN pour l’implémentation du refresh que vous ajouterez avant la mise en production.
Enregistrez le serveur dans Claude Desktop via l’extrait JSON du README, ou ajoutez-le à Claude Code avec claude mcp add.
Vérification rapide : demandez à Claude de lister les matters ouverts. Confirmez que la réponse contient les champs display_number et status. Confirmez que le journal d’audit n’affiche que tool=list_matters ts=... results=N — sans noms de matters.
L’access token OAuth expire après environ une heure. Le scaffold n’implémente pas le renouvellement automatique (point TODO 2 du README). Pour un usage en production, implémentez le flux de refresh avant de distribuer le serveur aux avocats.
Ce que le serveur fait
Le serveur enregistre cinq tools, tous en lecture seule :
list_matters appelle GET /api/v4/matters.json avec un paramètre fields demandant id, display_number, description, status, open_date, close_date, client, practice_area, responsible_attorney, originating_attorney et custom_field_values. Il prend en charge le filtrage par status (open/closed/pending), client_id et un curseur de pagination. L’API Clio ne retourne que id et etag par défaut sauf si vous spécifiez fields explicitement ; la chaîne fields dans server.py est le mécanisme qui rend les réponses exploitables.
get_matter appelle GET /api/v4/matters/{id}.json avec le même paramètre fields. Utilisez-le lorsque vous disposez d’un ID de matter issu de list_matters et que vous avez besoin des métadonnées complètes, y compris les champs personnalisés.
get_matter_time_entries appelle GET /api/v4/activities.json avec les filtres type=TimeEntry et matter_id. Les entrées de temps dans Clio sont un sous-type de la ressource Activities ; le filtre type les isole. La réponse comprend la date, la quantité (heures en décimal), le tarif unitaire, le flag de facturation, le nom du timekeeper et la description de l’activité. Les filtres de plage de dates sont pris en charge. Les notes d’entrées de temps (champ note) peuvent contenir des références à des travaux protégés par le secret ; les avocats utilisant ce tool doivent traiter la conversation Claude comme tout autre canal véhiculant du contenu confidentiel.
get_matter_activity appelle également GET /api/v4/activities.json mais sans la restriction type=TimeEntry, retournant entrées de temps, dépenses et forfaits ensemble. Le paramètre type optionnel permet de filtrer sur une seule catégorie. Utilisez-le lorsque vous avez besoin d’une image complète de l’activité de facturation d’un matter.
get_contact appelle GET /api/v4/contacts/{id}.json avec des champs pour le nom, le type, les adresses email, les numéros de téléphone et l’affiliation à une entreprise. Les fiches de contact dans Clio incluent les clients, les parties adverses, les experts et autres contacts du cabinet. L’identité du client est protégée par des obligations de confidentialité ; traitez les résultats de ce tool en conséquence.
La logique de dispatch se trouve dans apps/web/public/artifacts/mcp-server-clio-legal/src/clio_legal_mcp/server.py.
Réalité des coûts
Trois postes :
Abonnement Claude. Claude Desktop ou Claude Code avec MCP activé. Pro à 20 USD/utilisateur/mois ou Team à 25–30 USD/utilisateur/mois couvre la plupart des configurations de cabinets. Les avocats à usage intensif peuvent opter pour Max.
Hébergement du serveur. Processus Python auto-hébergé. Exécutez-le localement par avocat pour le développement ; sur une petite VM interne (1 vCPU / 1 Go de RAM suffit pour moins de 100 appels/jour) derrière votre VPN pour une utilisation partagée. Environ 5–20 USD/mois chez un fournisseur cloud ; gratuit si vous disposez déjà de capacité serveur interne.
Quota API Clio. Clio applique une limite de 3 requêtes/seconde par application. Une équipe effectuant 50 requêtes Clio quotidiennes via Claude reste largement dans cette limite en usage normal. La limite devient contraignante si vous construisez une automatisation qui parcourt l’ensemble de la liste des matters en boucle.
Le poste non budgété est le temps consacré à la configuration OAuth et à la revue de la politique de confidentialité. Prévoyez 1 à 2 heures de temps développeur pour l’installation et 1 à 2 heures de temps avocat ou conformité pour examiner les implications du flux de données avant la mise en production. Les cabinets dans des juridictions aux règles strictes de souveraineté des données peuvent avoir besoin d’un examen supplémentaire pour déterminer si l’acheminement des données de dossiers clients via un fournisseur IA basé aux États-Unis est autorisé — consultez un juriste sur ce point.
Modes d’échec
Expiration de l’access token en cours de session. Les access tokens Clio expirent après environ une heure. Si le token expire pendant qu’un avocat est en conversation avec Claude, les appels d’outils suivants retournent HTTP 401, ce qui apparaît dans Claude comme une erreur ou une réponse indiquant que les données sont indisponibles. L’avocat peut ne pas réaliser que le token a expiré.
Guard : implémentez le flux de refresh OAuth (point TODO 2 du README dans apps/web/public/artifacts/mcp-server-clio-legal/README.md) avant de distribuer le serveur au-delà de l’ingénieur qui l’a configuré. Le refresh token n’expire pas selon le même calendrier que l’access token ; un appel de refresh au démarrage du serveur garantit que l’access token est valide avant tout appel d’outil visible par l’utilisateur.
Déclenchement de la limite de débit sur des requêtes en rafale. Un avocat qui demande à Claude de résumer tous les matters ouverts puis demande immédiatement les entrées de temps pour chacun génère N+1 appels API en succession rapide. Sur une liste de 50 matters, cela représente 51 appels séquentiels ; à la limite de 3 req/s de Clio, le modèle en rafale génère des erreurs 429 après quelques secondes.
Guard : ajoutez des tentatives de réessai avec backoff exponentiel à clio_get() dans server.py (point TODO 3 du README). Un schéma simple : sur 429, attendez 1 seconde, réessayez ; sur un second 429, attendez 2 secondes, réessayez ; plafond à 60 secondes ; abandonnez après 5 tentatives.
Fuite de la confidentialité avocat-client via la fenêtre de contexte Claude. Lorsque get_matter_time_entries ou get_matter_activity retourne des résultats, le champ de notes d’activité peut contenir des informations confidentielles : discussions de stratégie, arguments en cours de rédaction, paramètres de transaction, instructions du client. Ces notes arrivent dans la fenêtre de contexte de Claude, ce qui signifie qu’elles transitent par l’API Anthropic et peuvent apparaître dans le texte de réponse de Claude. Si l’avocat partage sa conversation Claude, il peut inclure par inadvertance du contenu confidentiel issu des notes Clio.
Guard : passez en revue les pratiques de notes d’entrées de temps avec les avocats qui utiliseront ce serveur avant le déploiement. Évaluez si la convention du cabinet est de tenir des notes générales (codes de temps et descriptions brèves) ou détaillées (synthèses de stratégie). Si les notes sont détaillées, décidez de supprimer le champ note de TIME_ENTRY_FIELDS et ACTIVITY_FIELDS dans server.py avant le déploiement. Les chaînes de champs se trouvent en haut de server.py et sont simples à modifier.
Mauvaise région produisant des 404 qui ressemblent à des données manquantes. Si CLIO_REGION est défini sur us mais que le compte Clio du cabinet est sur la région EU ou CA, chaque appel API arrive à la mauvaise URL de base et retourne 404. Claude interprète la réponse vide comme « aucun matter trouvé » plutôt que « mauvais endpoint ».
Guard : vérifiez votre région avant le déploiement en contrôlant l’URL utilisée pour vous connecter à Clio. Définissez CLIO_REGION en conséquence. L’étape de vérification rapide du README détecte ceci : si vous savez qu’il y a des matters ouverts mais que list_matters retourne zéro résultat, la région est la première chose à vérifier.
Par rapport aux alternatives
Rapports natifs Clio et fonctionnalités IA natives. Clio intègre des rapports natifs (rapports de matters, rapports de temps, synthèses de facturation) et a commencé à intégrer des fonctionnalités IA dans son produit. Choisissez les rapports natifs si vos modèles de requêtes sont couverts par les templates de rapports Clio et que la réponse reste dans Clio. Choisissez ce serveur MCP si la réponse doit arriver dans une conversation Claude qui intègre également d’autres contextes — rédiger un email de mise à jour client en utilisant à la fois le récapitulatif d’entrées de temps et un template de mémoire séparé, ou comparer l’activité de matters entre deux domaines de pratique dans une seule réponse narrative.
Export CSV manuel et upload dans Claude. Une alternative ne nécessitant aucune configuration de serveur : exporter un rapport de matters depuis Clio en CSV, le télécharger dans Claude, demander à Claude de l’analyser. Cela fonctionne pour les analyses ponctuelles et évite entièrement les contraintes d’OAuth et d’hébergement. Choisissez cette approche si la fréquence des requêtes est faible (moins de dix fois par semaine), si les données n’ont pas besoin d’être en temps réel, ou si la politique IT du cabinet interdit les processus serveur locaux. Choisissez le serveur MCP lorsque les requêtes sont fréquentes, nécessitent des données actualisées ou doivent s’intégrer dans une conversation Claude en cours sans interruption pour uploader un fichier.
Stack
Serveur Python MCP auto-hébergé (SDK officiel mcp, httpx, pydantic) communiquant avec l’API Clio v4 côté backend ; Claude Desktop ou Code côté frontend. Optionnel : logging structuré via python-json-logger acheminé vers votre piste d’audit de gestion des matters ; export Sentry / OpenTelemetry avec noms de matters et contenus de notes expurgés avant transmission. Sources dans apps/web/public/artifacts/mcp-server-clio-legal/src/clio_legal_mcp/server.py.
# mcp-server-clio-legal
An MCP server for legal teams using Clio practice management. Exposes five read-only tools over the Clio API v4: `list_matters`, `get_matter`, `get_matter_time_entries`, `get_matter_activity`, and `get_contact`. No writes — the server intentionally does not register create, update, or delete operations. Attorney-client data is sensitive; queries are metadata-logged only (matter names, contact names, time-entry notes, and activity descriptions are never written to logs).
> **STATUS: scaffold — not runtime-tested.** The code is structurally complete and follows the official `mcp` Python SDK conventions, but it has not been executed against a live Clio tenant. Validate endpoint paths, field names, and filter syntax against your Clio account before use. Clio's API surface (response shapes, custom-field conventions, activity type labels) varies by account tier.
## What it exposes
- `list_matters(status?, client_id?, limit?, page_token?)` — paginated matter list filtered by status and/or client
- `get_matter(matter_id)` — full matter metadata including practice area, attorneys, and custom fields
- `get_matter_time_entries(matter_id, start_date?, end_date?, limit?)` — time entries logged against a matter
- `get_matter_activity(matter_id, type?, limit?)` — all activity records (time, expense, flat-rate) for a matter
- `get_contact(contact_id)` — contact metadata: name, type, email, phone, company
The server does **not** expose document retrieval, calendar events, billing/invoice operations, task creation, or any endpoint that modifies Clio records. The read-only posture is intentional — adding any write tool requires an explicit code change reviewed against your firm's privilege and security policies.
## Setup
### 1. Install
```bash
git clone <wherever you put this>
cd mcp-server-clio-legal
python -m venv .venv
source .venv/bin/activate # or .venv\Scripts\activate on Windows
pip install -e .
```
### 2. OAuth — create a Clio developer application
Clio uses OAuth 2.0 Authorization Code flow. There is no static API key; you must register an application and obtain tokens.
1. Sign in to the Clio developer portal: https://app.clio.com/settings/developer_applications
2. Click **Create Application**. Set the redirect URI to `http://localhost:8080/callback` for local development.
3. Under **Permissions**, select read-only access for: Matters, Contacts, Activities. Do not select write permissions unless you are extending the server with write tools and have completed a privilege review.
4. Copy the **App Key** (this is your `CLIO_CLIENT_ID`) and **App Secret** (your `CLIO_CLIENT_SECRET`).
The OAuth token exchange produces an **access token** and a **refresh token**. Access tokens expire (typically after one hour); the production posture is to use the refresh token to obtain a new access token automatically (see TODO item 2). For local development, a static access token obtained via the Authorization Code dance is sufficient.
To obtain an initial access token manually:
1. Direct your browser to: `https://app.clio.com/oauth/authorize?response_type=code&client_id=<YOUR_CLIENT_ID>&redirect_uri=http://localhost:8080/callback`
2. Authorize the application in your Clio account.
3. Clio redirects to `http://localhost:8080/callback?code=<AUTH_CODE>`.
4. Exchange the code for tokens:
```bash
curl -X POST https://app.clio.com/oauth/token \
-d "grant_type=authorization_code" \
-d "code=<AUTH_CODE>" \
-d "client_id=<YOUR_CLIENT_ID>" \
-d "client_secret=<YOUR_CLIENT_SECRET>" \
-d "redirect_uri=http://localhost:8080/callback"
```
The response JSON includes `access_token` and `refresh_token`. Copy the `access_token`.
For EU, CA, or AU regions, replace `app.clio.com` with the regional host in all OAuth URLs and API calls.
### 3. Configure environment variables
#### `CLIO_ACCESS_TOKEN`
Required. The OAuth access token obtained in step 2. Set to the `access_token` value from the token exchange response.
#### `CLIO_REGION`
Optional. Clio hosts accounts in four regions; the server must use the correct regional base URL. Accepted values: `us` (default), `eu`, `ca`, `au`. Corresponds to:
- `us` → `https://app.clio.com/api/v4`
- `eu` → `https://eu.app.clio.com/api/v4`
- `ca` → `https://ca.app.clio.com/api/v4`
- `au` → `https://au.app.clio.com/api/v4`
If you are unsure of your region, check the URL you use to sign in to Clio.
#### `CLIO_CLIENT_ID` / `CLIO_CLIENT_SECRET` / `CLIO_REFRESH_TOKEN`
Not consumed by the scaffold today. Placeholder for the OAuth refresh implementation in TODO item 2. Set them now so the variables are available when you add refresh logic.
```bash
export CLIO_ACCESS_TOKEN="eyJ..."
export CLIO_REGION="us"
export CLIO_CLIENT_ID="<your app key>"
export CLIO_CLIENT_SECRET="<your app secret>"
export CLIO_REFRESH_TOKEN="<your refresh token>"
```
### 4. Register with Claude Desktop or Claude Code
**Claude Desktop** — edit `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) or `%APPDATA%\Claude\claude_desktop_config.json` (Windows):
```json
{
"mcpServers": {
"clio-legal": {
"command": "python",
"args": ["-m", "clio_legal_mcp.server"],
"env": {
"CLIO_ACCESS_TOKEN": "eyJ...",
"CLIO_REGION": "us"
}
}
}
}
```
**Claude Code** — add to your project's `.claude/mcp.json` or run:
```bash
claude mcp add clio-legal python -m clio_legal_mcp.server
```
Restart Claude Desktop (or reload Claude Code). You should see 5 tools registered under `clio-legal`.
### 5. Sanity-check
Ask Claude: "List my open matters in Clio." If the response returns a list of matters with `display_number` and `status` fields, the server is working. If you receive a 401, the access token has expired — re-run the token exchange (step 2). If you receive a 429, you have exceeded the 3 req/s rate limit; add a delay between rapid successive calls.
Confirm that the response does **not** include activity note text or contact addresses unless you called `get_contact` or `get_matter_activity` explicitly. The audit log should show only `tool=list_matters ts=... results=N`.
## Security model
**Read-only.** The server registers no create, update, or delete tools. Adding any write path requires editing `server.py` — a deliberate friction point so that write access is a reviewed decision, not an accidental addition.
**Token scope.** The OAuth token's permissions are bounded by the scopes granted during the authorization dance (step 2). If you granted read-only Matters + Contacts + Activities, the token cannot modify records even if a write call were attempted. Provision the narrowest scope your use case requires.
**Who sees what.** Any user with access to the Claude Desktop or Claude Code session that has the `clio-legal` MCP registered can query any matter, contact, or activity the OAuth token's account can see. This means:
- If the token is a partner's Clio account, that partner's entire matter list is queryable.
- If you share the MCP registration across a team, every team member's Claude session can query any matter in the token holder's account.
In a multi-attorney firm, the appropriate posture is a dedicated service-account Clio user with restricted matter access, not a partner's personal account. Document the service account in your security policy.
**Attorney-client confidentiality.** Matter descriptions, time-entry notes, activity notes, and contact records are protected by attorney-client privilege and confidentiality rules. The MCP server routes all responses to Claude's context window, which means:
- The data flows through Anthropic's API (governed by Anthropic's data processing terms).
- Claude's context window is not permanently stored beyond the session, but the conversation log in Claude Desktop may persist on disk.
Review these implications with counsel before deploying to production. The scaffold is not a substitute for a firm-level AI policy that addresses privilege and confidentiality.
**Audit log.** The logger records tool name, timestamp, and result count only — never matter names, contact names, activity descriptions, or any content that could reveal case strategy or client identity.
## Known limits and TODOs (before production use)
1. Validate Clio API v4 field names and filter parameter syntax against your tenant — Clio's response shapes differ by account tier and feature flags. The `fields` strings in `server.py` follow the documented v4 conventions but have not been executed against a live account.
2. Implement OAuth token refresh using `CLIO_CLIENT_ID`, `CLIO_CLIENT_SECRET`, and `CLIO_REFRESH_TOKEN`. Static access tokens expire after approximately one hour; a production deployment needs automatic refresh via `POST https://app.clio.com/oauth/token` with `grant_type=refresh_token`.
3. Add request-level retries with exponential backoff for HTTP 429 responses. Clio enforces a 3 requests/second per-application rate limit; burst patterns (e.g., fetching all matters then all time entries immediately) will hit this.
4. Wire structured logging via `python-json-logger` piped to your matter-management audit trail. The current logger writes plain text; structured JSON simplifies downstream aggregation and privilege-compliant log scrubbing.
5. Add a matter-access guard: refuse to return matters that the authenticated user does not have explicit permission to see in Clio. The current scaffold relies entirely on Clio's API access control — if the OAuth token's account has broad matter access, so does the MCP server.
6. Write integration tests against a Clio sandbox account. The Clio developer portal provides sandbox credentials for testing without touching production data.
7. Add Sentry / OpenTelemetry export — but scrub matter names, contact names, and note text before transmission. Only identifiers (matter_id, contact_id) and counts are safe to export.