Um servidor de Model Context Protocol (MCP) que conecta o Clio ao Claude, permitindo que advogados e gestores de legal-ops perguntem ao Claude para listar matters abertos, buscar entradas de tempo de um caso, recuperar um registro de contato ou resumir atividade de faturamento, tudo a partir de uma conversa no Claude em vez da interface do Clio. O scaffold está em apps/web/public/artifacts/mcp-server-clio-legal/ e é somente leitura por design: dados de matters e notas de entrada de tempo são comunicações e trabalho protegido pelo privilégio advogado-cliente, então o servidor não registra operações de escrita e registra apenas metadados nos logs (nome do tool, timestamp, contagem de resultados — nunca nomes de matters, notas de atividade ou identificadores de contatos).
Quando usar
Use isso quando seu time jurídico ou escritório individual opera no Clio e você se encontra navegando pela interface várias vezes ao dia para responder as mesmas perguntas: quantos matters abertos existem em determinada área de prática, qual é o total de horas faturadas em um processo neste mês, quais matters não tiveram atividade nos últimos 30 dias, quais são os dados de contato de um cliente específico. Essas perguntas são mecânicas. Elas comprimem bem em uma conversa de tool no Claude.
O argumento de tempo: um advogado solo que realiza cinco dessas consultas por dia, a 3 minutos cada na interface do Clio, gasta aproximadamente 75 minutos semanais em navegação. Executar as mesmas cinco consultas como chamadas de tool no Claude leva menos de 2 minutos no total. Isso representa aproximadamente 60 horas por ano devolvidas ao trabalho jurídico substantivo. A uma taxa de faturamento de USD 300/hora, o custo de oportunidade de não automatizar essa navegação gira em torno de USD 18.000 anuais (trate como estimativa; sua taxa real e volume de consultas determinam o número exato). Para um escritório onde vários advogados realizam consultas similares sobre um inventário maior de matters, os números escalam proporcionalmente.
Para gestores de legal-ops que geram relatórios semanais de status de matters, comparações de orçamento vs. realizado ou resumos de produtividade por área de prática, o servidor permite que o Claude extraia os dados brutos e redija a narrativa em uma única conversa, sem precisar exportar para Excel como etapa intermediária.
Quando NÃO usar
Ignore isso se o volume de consultas de matters for inferior a cerca de dez por semana em todo o time. O custo de configuração inclui: registrar uma aplicação de desenvolvedor no Clio, completar o fluxo OAuth para obter um access token, instalar um ambiente Python e revisar as implicações de confidencialidade com quem for responsável pela política de segurança de dados do escritório. Esse custo não se paga com volume baixo. Use a interface do Clio; retome quando o volume crescer.
Ignore isso se seu escritório ainda não tem uma política escrita cobrindo acesso de IA a dados de matters de clientes. O servidor MCP roteia dados do Clio pelo contexto do Claude, o que significa que nomes de clientes, descrições de matters, notas de entrada de tempo e dados de contato trafegam pela API da Anthropic. Revise os termos de processamento de dados da Anthropic e, se sua jurisdição exigir, obtenha o consentimento do cliente para revisão assistida por IA antes de implantar. O scaffold não substitui esse trabalho de política.
Ignore isso se precisar de operações de escrita — criar entradas de tempo pelo Claude, atualizar status de matters, adicionar contatos ou registrar comunicações. O scaffold intencionalmente não expõe tools de escrita. Adicionar escrita requer uma mudança explícita no código, uma revisão do modelo de privilégio e uma avaliação de risco de responsabilidade profissional que está fora do escopo deste scaffold. Consulte um advogado antes de expor qualquer operação de escrita a um assistente de IA operando sobre dados de matters de clientes.
Configuração
A documentação completa de configuração está em apps/web/public/artifacts/mcp-server-clio-legal/README.md. Resumo:
Clone o bundle em um repositório privado. Execute pip install -e . dentro de um ambiente virtual Python 3.11+.
Registre uma aplicação de desenvolvedor no portal de desenvolvedores do Clio em https://app.clio.com/settings/developer_applications. Conceda acesso somente leitura a Matters, Contacts e Activities. Copie o App Key (CLIO_CLIENT_ID) e o App Secret (CLIO_CLIENT_SECRET).
Complete o fluxo OAuth Authorization Code para obter um access token e um refresh token (o README detalha passo a passo a troca via curl).
Configure as variáveis de ambiente: CLIO_ACCESS_TOKEN, CLIO_REGION (um de us, eu, ca, au — deve corresponder à URL de login do Clio) e, opcionalmente, CLIO_CLIENT_ID, CLIO_CLIENT_SECRET, CLIO_REFRESH_TOKEN para a implementação do refresh que você adicionará antes de ir para produção.
Registre o servidor no Claude Desktop usando o trecho JSON do README, ou adicione ao Claude Code com claude mcp add.
Verificação básica: peça ao Claude que liste os matters abertos. Confirme que a resposta retorna os campos display_number e status. Confirme que o log de auditoria mostra apenas tool=list_matters ts=... results=N — sem nomes de matters.
O access token OAuth expira após aproximadamente uma hora. O scaffold não implementa refresh automático (item TODO 2 do README). Para uso em produção, implemente o fluxo de refresh antes de distribuir o servidor para advogados.
O que faz
O servidor registra cinco tools, todos somente leitura:
list_matters chama GET /api/v4/matters.json com um parâmetro fields solicitando id, display_number, description, status, open_date, close_date, client, practice_area, responsible_attorney, originating_attorney e custom_field_values. Suporta filtragem por status (open/closed/pending), client_id e um cursor de paginação. A API do Clio retorna apenas id e etag por padrão, a menos que você especifique fields explicitamente; a string fields em server.py é o mecanismo que torna as respostas úteis.
get_matter chama GET /api/v4/matters/{id}.json com o mesmo parâmetro fields. Use quando você tiver um ID de matter de list_matters e precisar dos metadados completos, incluindo campos personalizados.
get_matter_time_entries chama GET /api/v4/activities.json com filtros type=TimeEntry e matter_id. Entradas de tempo no Clio são um subtipo do recurso Activities; o filtro type as isola. A resposta inclui data, quantidade (horas em decimal), preço unitário, flag de faturabilidade, nome do timekeeper e descrição da atividade. Filtros de intervalo de datas são suportados. Notas de entrada de tempo (note) podem conter referências a trabalho protegido por privilégio; advogados que usarem este tool devem tratar a conversa no Claude como qualquer outro canal que carregue conteúdo privilegiado.
get_matter_activity também chama GET /api/v4/activities.json mas sem a restrição type=TimeEntry, retornando entradas de tempo, despesas e tarifas fixas juntas. O parâmetro type opcional permite filtrar a uma única categoria. Use quando precisar de um panorama completo de faturamento de um matter.
get_contact chama GET /api/v4/contacts/{id}.json com campos para nome, tipo, endereços de email, números de telefone e afiliação empresarial. Registros de contato no Clio incluem clientes, partes adversas, peritos e outros contatos do escritório. A identidade do cliente é protegida por obrigações de confidencialidade; trate os resultados deste tool adequadamente.
A lógica de dispatch está em apps/web/public/artifacts/mcp-server-clio-legal/src/clio_legal_mcp/server.py.
Realidade de custos
Três itens:
Assinatura do Claude. Claude Desktop ou Claude Code com MCP habilitado. Pro a USD 20/usuário/mês ou Team a USD 25–30/usuário/mês cobre a maioria dos times jurídicos. Advogados com uso intensivo podem optar pelo Max.
Hosting do servidor. Processo Python auto-hospedado. Execute localmente por advogado para desenvolvimento; em uma VM interna pequena (1 vCPU / 1 GB RAM é suficiente para menos de 100 chamadas/dia) atrás da sua VPN para uso compartilhado. Aproximadamente USD 5–20/mês em um provedor de nuvem; gratuito se você já tiver capacidade de servidor interna.
Cota da API do Clio. O Clio impõe um limite de 3 requisições/segundo por aplicação. Um time com 50 consultas diárias pelo Claude fica bem dentro desse limite em padrões de uso normais. O limite se torna relevante se você construir uma automação que varre toda a lista de matters em loop.
O item não orçado é o tempo de configuração do OAuth e a revisão da política de confidencialidade. Planeje de 1 a 2 horas de tempo de engenheiro para a configuração e de 1 a 2 horas de tempo de advogado ou compliance para revisar as implicações do fluxo de dados antes da implantação em produção. Escritórios em jurisdições com regras rígidas de soberania de dados podem precisar de revisão adicional sobre se rotear dados de matters de clientes por um provedor de IA sediado nos EUA é permitido — consulte um advogado sobre essa questão.
Modos de falha
Expiração do access token no meio de uma sessão. Access tokens do Clio expiram após aproximadamente uma hora. Se o token expirar enquanto um advogado estiver em uma conversa no Claude, chamadas de tool subsequentes retornam HTTP 401, que aparece no Claude como um erro ou como uma resposta sugerindo que os dados estão indisponíveis. O advogado pode não perceber que o token expirou.
Guard: implemente o fluxo de refresh OAuth (item TODO 2 do README em apps/web/public/artifacts/mcp-server-clio-legal/README.md) antes de distribuir o servidor além do engenheiro que o configurou. O refresh token não expira no mesmo prazo que o access token; uma chamada de refresh na inicialização do servidor garante que o access token esteja válido antes de qualquer chamada de tool visível para o usuário.
Ativação do limite de taxa em consultas em rajada. Um advogado que pede ao Claude para resumir todos os matters abertos e então solicita imediatamente as entradas de tempo de cada um gera N+1 chamadas de API em rápida sucessão. Em uma lista de 50 matters, isso são 51 chamadas sequenciais; ao limite de 3 req/s do Clio, o padrão de rajada gera 429s após os primeiros segundos.
Guard: adicione retries com backoff exponencial a clio_get() em server.py (item TODO 3 do README). Um padrão simples: ao receber 429, aguarde 1 segundo, tente novamente; ao segundo 429, aguarde 2 segundos, tente novamente; cap em 60 segundos; falhe após 5 tentativas.
Vazamento de confidencialidade advogado-cliente pelo contexto do Claude. Quando get_matter_time_entries ou get_matter_activity retorna resultados, o campo de notas de atividade pode conter informação privilegiada: discussões de estratégia, argumentos em rascunho, parâmetros de acordo, instruções do cliente. Essas notas chegam ao contexto do Claude, o que significa que trafegam pela API da Anthropic e podem aparecer no texto de resposta do Claude. Se o advogado compartilhar sua conversa com o Claude, pode inadvertidamente incluir conteúdo privilegiado que se originou nas notas do Clio.
Guard: revise as práticas de notas de entrada de tempo com os advogados que usarão este servidor antes da implantação. Considere se a convenção do seu escritório é manter notas gerais (códigos de tempo e descrições breves) ou detalhadas (resumos de estratégia). Se as notas forem detalhadas, decida se remove o campo note de TIME_ENTRY_FIELDS e ACTIVITY_FIELDS em server.py antes do deploy. As strings de campos ficam no topo de server.py e são simples de editar.
Região incorreta produzindo 404s que parecem dados ausentes. Se CLIO_REGION estiver configurado como us mas a conta Clio do escritório estiver na região EU ou CA, cada chamada de API chega à URL base errada e retorna 404. O Claude interpreta a resposta vazia como “nenhum matter encontrado” em vez de “endpoint incorreto”.
Guard: verifique sua região antes do deploy conferindo a URL que você usa para fazer login no Clio. Configure CLIO_REGION adequadamente. O passo de verificação básica do README detecta isso: se você sabe que há matters abertos mas list_matters retorna zero resultados, a primeira coisa a verificar é a região.
Versus as alternativas
Relatórios nativos do Clio e funcionalidades de IA nativas. O Clio inclui relatórios integrados (relatórios de matters, relatórios de tempo, resumos de faturamento) e começou a integrar funcionalidades de IA em seu produto. Escolha os relatórios nativos se seus padrões de consulta estiverem cobertos pelos templates de relatório do Clio e a resposta permanecer dentro do Clio. Escolha este servidor MCP se a resposta precisar chegar a uma conversa do Claude que também incorpora outro contexto — redigir um email de atualização ao cliente usando tanto o resumo de entradas de tempo quanto um template de brief separado, ou comparar atividade de matters entre duas áreas de prática em uma única resposta narrativa.
Exportação manual de CSV e upload para o Claude. Uma alternativa que não requer configuração de servidor: exportar um relatório de matters do Clio como CSV, fazer upload para o Claude, pedir ao Claude que analise. Isso funciona para análises pontuais e evita completamente a sobrecarga de OAuth e hosting. Escolha essa abordagem se a frequência de consultas for baixa (menos de dez vezes por semana), se os dados não precisarem ser em tempo real, ou se a política de TI do seu escritório proibir executar um processo de servidor local. Escolha o servidor MCP quando as consultas forem frequentes, precisarem de dados atualizados ou precisarem ser incorporadas em uma conversa contínua do Claude sem interrupções para fazer upload de um arquivo.
Stack
Servidor Python MCP auto-hospedado (SDK oficial mcp, httpx, pydantic) comunicando-se com a API v4 do Clio no backend; Claude Desktop ou Code no frontend. Opcional: logging estruturado via python-json-logger integrado ao seu trail de auditoria de gestão de matters; exportação Sentry / OpenTelemetry com nomes de matters e texto de notas removidos antes da transmissão. Fonte em 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.