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.

MCP Corpus read-only Auth License: MIT Web

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/mcp

Requer 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:

Add to Claude Add to Cursor Add to VS Code Add to ChatGPT

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 → ConnectorsAdicionar 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 → ConnectorsAvanç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.

FerramentaO que responde
list_countriesQuais países estão no corpus e quantas leis cada um contém.
search_lawsEncontre uma norma por palavras no título ou pelo número oficial. Retorna o id que toda outra ferramenta aceita.
get_lawLeia o que uma norma diz hoje — o texto inteiro, ou um artigo dela.
law_at_dateO que a norma dizia em um determinado dia, com o SHA git por trás dessa versão.
diff_lawO que mudou entre duas datas, como um diff unificado dos dois textos.
reform_historyQuais normas alteraram esta, quando, e o que cada uma diz ter tocado.
law_statsO 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:

FerramentaO que faz
preview_webhookTeste 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_webhookAssine 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_webhooksOs endpoints que esta conta tem, e o id que os outros dois aceitam. Segredos nunca são retornados.
set_webhook_enabledPause um, ou reinicie. O endpoint, a regra e o histórico permanecem.
delete_webhookRemova um. As entregas param, e o histórico vai junto.
create_email_digestA 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_digestsOs 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_enabledPause 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_digestPare 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

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