Legalize
Conector oficial do corpus aberto de legislação consolidada da Legalize — leia uma lei como ela estava em qualquer data passada, com o commit do git por trás da citação.
Documentação
Legalize — o conector MCP para legislação consolidada
O que uma lei dizia em qualquer data passada, com a citação e o commit git por trás dela. Seu assistente responde a partir do corpus, em vez de memória.
Conecte seu cliente de IA (Claude, ChatGPT, Cursor, VS Code, Gemini CLI…) ao Legalize e pergunte sobre legislação em linguagem simples. Cada resposta vem com três coisas que um modelo não pode inventar:
- 📜 O texto em si — a lei inteira ou um artigo inteiro, nunca um fragmento truncado.
- 🕰️ Uma data — não apenas a redação atual, mas a versão que estava em vigor no dia que você indicar.
- 🔗 Uma citação e um SHA git — o commit no corpus público que contém exatamente esses bytes, para que o outro lado possa verificar a citação.
Um endpoint remoto:
https://legalize.dev/mcpRequer login. Veja ao vivo em legalize.dev/mcp, que sempre mostra a cobertura e a cota atuais.
Conexão rápida
É um servidor remoto (Streamable HTTP, sem estado). Nada é instalado: você entrega a URL ao seu cliente, e o cliente o guia pelo login na primeira vez que chama uma ferramenta.
Um clique, se o seu for um destes:
Os três primeiros pré-preenchem o nome e o endereço, e então pedem que você confirme e faça login. O ChatGPT abre o formulário de criação de conector — ele não aceita parâmetro para o servidor, então cole https://legalize.dev/mcp você mesmo, com o modo de desenvolvedor ativado em Avançado.
Claude.ai · Claude Desktop (Connectors)
Configurações → Connectors → Adicionar conector personalizado → cole https://legalize.dev/mcp.
Claude Code (CLI)
claude mcp add --transport http legalize https://legalize.dev/mcp
Cursor
Use o botão acima, ou em ~/.cursor/mcp.json:
{
"mcpServers": {
"legalize": {
"url": "https://legalize.dev/mcp"
}
}
}
VS Code (GitHub Copilot)
Use o botão acima, ou em .vscode/mcp.json:
{
"servers": {
"legalize": {
"type": "http",
"url": "https://legalize.dev/mcp"
}
}
}
ChatGPT
Configurações → Connectors → Avançado → ative o modo de desenvolvedor, depois crie um conector e cole https://legalize.dev/mcp. Não há link de instalação para este: o ChatGPT só faz deep-link para aplicativos listados em seu próprio diretório, e conectores personalizados ficam atrás do modo de desenvolvedor, nos planos Plus ou Pro.
Gemini CLI e outros clientes
{
"mcpServers": {
"legalize": {
"httpUrl": "https://legalize.dev/mcp"
}
}
}
Qualquer cliente que fale MCP remoto funciona. Se o seu só fala stdio, faça a ponte:
npx mcp-remote https://legalize.dev/mcp
As ferramentas
Nada aqui pode mudar uma lei. O corpus é somente leitura para o conector: nenhuma ferramenta altera um texto, uma versão ou um histórico, porque eles vêm dos repositórios git e este servidor não tem acesso. As descrições completas que o modelo lê, com cada argumento e seu tipo, são publicadas ao vivo pelo servidor em execução em /mcp/tools.json.
| Ferramenta | O que responde |
|---|---|
list_countries | Quais países estão no corpus e quantas leis cada um contém. |
search_laws | Encontre uma norma por palavras no título ou pelo número oficial. Retorna o id que toda outra ferramenta aceita. |
get_law | Leia o que uma norma diz hoje — o texto inteiro, ou um artigo dela. |
law_at_date | O que a norma dizia em um determinado dia, com o SHA git por trás dessa versão. |
diff_law | O que mudou entre duas datas, como um diff unificado dos dois textos. |
reform_history | Quais normas alteraram esta, quando, e o que cada uma diz ter tocado. |
law_stats | O tamanho de um corpus e o quanto ele se move, antes de aprofundar nele. |
O restante gerencia suas próprias assinaturas — a única pergunta que a leitura do corpus não responde, que é me avise quando isso mudar. São as únicas ferramentas que escrevem algo; o que escrevem é a assinatura da sua própria conta, e elas exigem um plano pago.
Uma regra, duas formas de receber. Um webhook publica cada mudança em um servidor que você opera; um resumo lista um dia delas na sua caixa de entrada:
| Ferramenta | O que faz |
|---|---|
preview_webhook | Teste uma regra de assinatura contra os últimos 30 dias sem criar nada: quantos eventos ela teria entregue, e quais. Funciona para qualquer entrega — testa a regra, não o destino. |
create_webhook ✎ | Assine um endpoint HTTPS seu para mudanças de leis. Restrinja a leis específicas, a palavras no título e cabeçalhos de assunto, ou a países. O segredo de assinatura não é retornado: ele pode forjar uma entrega, e qualquer coisa que uma ferramenta retorna fica no transcript. Colete e rotacione no painel. |
list_webhooks | Os endpoints que esta conta tem, e o id que os outros dois aceitam. Segredos nunca são retornados. |
set_webhook_enabled ✎ | Pause um, ou reinicie. O endpoint, a regra e o histórico permanecem. |
delete_webhook ✎ | Remova um. As entregas param, e o histórico vai junto. |
create_email_digest ✎ | A mesma regra, entregue como um e-mail por dia — a versão que você pode receber sem operar nada. lang escolhe o idioma do e-mail, não o das leis. |
list_email_digests | Os resumos que esta conta recebe, com a regra e o idioma de cada um, e o id que os outros dois aceitam. |
set_email_digest_enabled ✎ | Pause o e-mail, ou reinicie. Um resumo pausado mantém seu lugar: o que foi perdido chega no primeiro e-mail após a retomada. |
delete_email_digest ✎ | Pare um de vez. Recriado depois, ele começa daquele dia e a lacuna não é enviada. |
O resumo vai para o endereço da própria conta e não há argumento para outro. Não é uma omissão: um destinatário de texto livre transformaria um conector em uma forma de enviar e-mail para outra pessoa, assinado pelo nosso domínio, por ordem de um modelo.
Restrinja a assinatura ou você vai parar de lê-la. Os filtros se combinam como AND; uma regra que nunca poderia corresponder — um país desconhecido, um id de lei que não está no corpus — é recusada em vez de armazenada; e um filtro de texto alcança um idioma: leis são escritas no seu próprio, então proteccion de datos encontra a lei espanhola e não a portuguesa protecao de dados.
As marcadas com ✎ são declaradas aos clientes com readOnlyHint: false, então um cliente que confirma antes de uma escrita confirmará antes destas. Um plano pago é necessário para criar uma; pausar e excluir nunca são, em qualquer plano, porque a conta que mais precisa desligar suas entregas é aquela cujo plano acabou de terminar. Em um plano sem o recurso, criar responde com um erro estruturado feature_not_available e não cria nada — e nada é entregue também, nem a um endpoint nem a uma caixa de entrada, até que volte. Nenhuma entrega é instantânea: webhooks são assinados e agrupados diariamente (o formato e o verificador), e um resumo é um e-mail por dia — em um dia em que nada correspondeu, nenhum e-mail.
Toda ferramenta retorna o mesmo envelope — data, citation, url, source, note — e todo resultado linka de volta para sua página em legalize.dev. Uma falha em nível de ferramenta é uma chamada bem-sucedida cujo data é um erro estruturado nomeando o que fazer a seguir, para que o modelo possa se corrigir em vez de adivinhar.
Exemplos (pergunte ao seu assistente)
- "O que dizia o artigo 348 bis da Lei das Sociedades Espanholas em março de 2023?"
- "O Código do Trabalho francês mudou neste ponto desde 2020? Mostre-me o diff."
- "Quais normas alteraram esta lei, e quando?"
- "Quanto da legislação letã o Legalize realmente contém?"
- "Envie-me um e-mail toda manhã quando algo sobre proteção de dados mudar na Espanha — em espanhol."
Autenticação
Login obrigatório; não há acesso anônimo. Toda chamada está vinculada a uma conta, e uma solicitação não autenticada recebe 401 com o desafio WWW-Authenticate que inicia o fluxo OAuth.
Seu cliente descobre o servidor de autorização a partir de https://legalize.dev/.well-known/oauth-protected-resource, registra-se dinamicamente e envia você para fazer login uma vez no navegador. Depois disso, ele mantém o token e você nunca mais vê o handshake. Nenhuma chave de API é colada em lugar nenhum.
Limites
Há uma cota mensal gratuita e um limite de rajada por minuto. Nenhum número está escrito aqui de propósito — eles ficariam desatualizados no dia em que mudassem, e um README que mente silenciosamente sobre um limite é pior do que um que aponta para ele. Ambos são informados, ao vivo, em legalize.dev/mcp e legalize.dev/pricing.
O que não muda: passada a cota mensal, o conector responde quota_exceeded e para até o mês virar — nada é cobrado e nada é cortado silenciosamente. Todo país está incluído em todos os planos.
Antes de citar
A maior parte do corpus é consolidada: emendas são incorporadas ao texto, então o que você lê é a lei como está. Parte não é. Um texto publicado como promulgado volta sinalizado, com as normas que o alteram nomeadas, e nunca como a lei em vigor — mas a sinalização só é útil se você a ler antes de colar a citação em uma petição.
Mais três limites que vale saber:
- Uma data resolve para o que foi publicado nela ou antes, não para o que estava em vigor.
- Os limites de artigos são derivados pela correspondência de cabeçalhos no texto, não publicados como estrutura pela fonte. Cite a âncora e verifique o limite antes de confiar nele.
- As contagens são do que o Legalize ingeriu, não do que o diário oficial publicou. Uma lacuna no corpus não é evidência de que uma norma não existe.
Um corpo nunca é truncado: uma lei grande demais para ser enviada inteira volta como seu sumário com instruções para perguntar de novo, porque metade de um artigo se lê exatamente como um inteiro.
Para desenvolvedores
O transporte é Streamable HTTP, sem estado. Todo método JSON-RPC precisa de um token, incluindo initialize e tools/list. Então a primeira coisa a verificar é o catálogo, que é servido ao lado do endpoint como um GET simples e não precisa de nada:
curl -s https://legalize.dev/mcp/tools.json | jq '.tools[] | {name, readOnly}'
Isso é o que um diretório lê, e é onde readOnly por ferramenta é publicado. O próprio endpoint JSON-RPC responde 401, e esse 401 é o handshake — seu cabeçalho WWW-Authenticate é o que diz ao cliente onde está o servidor de autorização:
curl -si -X POST https://legalize.dev/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"list_countries","arguments":{}}}' | head -20
# 401 + WWW-Authenticate: Bearer ... resource_metadata="..." ← correct: that is the handshake
Depois de autenticado, a mesma chamada responde com o payload da ferramenta.
O que está por trás dos dados
O Legalize constrói um repositório git público por país: cada lei é um arquivo Markdown, e cada reforma que ele contém é um commit datado. É daí que vem o SHA em uma resposta — é um commit em um repositório público, não um identificador cunhado para a resposta.
Onde um corpus começa depois do ato que contém — uma fonte que publica seus textos consolidados a partir de 1996, digamos, para um código de 1885 — reform_history diz isso em history, e pedir uma data anterior é um simples "o corpus começa em X", nunca uma nova tentativa.
Pergunte o que a Lei das Sociedades Espanholas dizia em março de 2023 e a resposta carrega o commit
3b9aea8d5 de legalize-dev/legalize-es:
git show 3b9aea8d5:es/BOE-A-2010-10544.md
retorna esse arquivo: o texto que o conector devolve, sob o frontmatter YAML em que o corpus mantém seus metadados. O conector alcança todos os países que o Legalize publica — a lista ao vivo, com o tamanho de cada corpus, está em legalize.dev e na ferramenta list_countries.
Mais
- 🌐 Web: legalize.dev — navegue pelo corpus, grátis, sem conta.
- 🔌 Este conector, online: legalize.dev/mcp
- 🧾 API REST: legalize.dev/api — os mesmos dados via HTTP.
- 💶 Preços: legalize.dev/pricing
- 🛠️ Pipeline e corpus: github.com/legalize-dev/legalize — código aberto.
Sobre o Legalize
Legalize transforma diários oficiais em git: legislação consolidada em Markdown, um commit por reforma, um repositório por país. Este repositório documenta seu conector MCP — a superfície com a qual um assistente de IA conversa.
legalize.dev · licença MIT