Books and Archives
Pesquise no Internet Archive, na Biblioteca do Congresso e no data.bnf.fr de uma só vez, em uma única resposta.
Documentação
mcp-books
Três grandes arquivos guardam o registro digitalizado do que foi publicado, e cada um o descreve em suas próprias palavras. O Internet Archive mantém livros, filmes, gravações e softwares depositados por qualquer pessoa e submeteu milhões deles ao reconhecimento óptico de caracteres. A Library of Congress publica as coleções nacionais dos Estados Unidos, um catálogo por tipo de material. O data.bnf.fr publica os registros de autoridade da Bibliothèque nationale de France, que descrevem obras e as pessoas que as escreveram, em vez de cópias.
Este servidor consulta os três com uma única pergunta. Você pode pesquisar as palavras dentro dos documentos digitalizados, pesquisar os catálogos e ler um registro em um único formato, independentemente de qual arquivo o contenha. Ele não exige chave de API nem conta.
Instalação
Instalação com um clique
Claude Code
claude mcp add books -- npx -y mcp-books
Claude Desktop, Cursor e qualquer cliente que use o formato de configuração padrão
{
"mcpServers": {
"books": {
"command": "npx",
"args": ["-y", "mcp-books"]
}
}
}
É necessário o Node 24 ou posterior, e nenhuma variável de ambiente precisa ser definida.
Com Docker
{
"mcpServers": {
"books": {
"command": "docker",
"args": ["run", "-i", "--rm", "ghcr.io/smeet666/mcp-books:2.0.1"]
}
}
}
-i mantém o stdin aberto, que é por onde o protocolo trafega, e -t é omitido
porque um TTY reescreve o fluxo. O contêiner precisa de HTTPS de saída para
archive.org, openlibrary.org, www.loc.gov e data.bnf.fr, e nada
mais: sem volume, sem porta, sem credencial.
Pacote, sem npm
Baixe o mcp-books-2.0.1.mcpb em
a versão mais recente e
abra-o. Um cliente que suporte pacotes MCP o instala por conta própria, sem npm
e sem arquivo de configuração para editar. O pacote carrega suas dependências, portanto
nada é baixado no momento da instalação.
O que você pode perguntar
- "Quais livros mencionam o farol de Beaumont?"
- "Encontre qualquer coisa sobre o terremoto de São Francisco de 1906."
- "Leia esse registro para mim e diga quem detém o original."
- "O que a BnF tem sobre esse autor?"
- "Pesquise nas fotografias em vez dos livros."
Uma resposta leva vários segundos: três arquivos são consultados, cada um no seu próprio ritmo.
As três fontes
| Fonte | Arquivo | O que descreve |
|---|---|---|
archive | o Internet Archive | cópias depositadas, de todos os tipos |
loc | a Library of Congress | as coleções nacionais, um catálogo por tipo |
bnf | a Bibliothèque nationale de France | obras e as pessoas que as escreveram |
O id de uma linha identifica seu arquivo, portanto um identificador lido em uma resposta retorna
ao arquivo correto. Contagens nunca são somadas entre arquivos, e um arquivo que
falhou é relatado como tendo falhado, em vez de como não tendo encontrado nada.
Ferramentas
| Ferramenta | O que faz |
|---|---|
search_inside | Pesquisa as palavras dentro dos documentos digitalizados. |
search_items | Pesquisa os catálogos por título, criador, assunto ou palavras simples. |
get_item | Lê um registro em um único formato, independentemente de qual arquivo o contenha. |
search_inside
Pesquisa o texto dentro dos documentos digitalizados, que foi extraído da página por meio do reconhecimento óptico de caracteres.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
query | string, 2 a 300 caracteres | sim | A frase a procurar dentro dos documentos. |
limit | inteiro, 1 a 25, padrão 3 | não | Correspondências a manter de cada arquivo. |
page | inteiro, 1 a 100, padrão 1 | não | Qual página de correspondências. |
max_excerpt_chars | inteiro, 80 a 1200, padrão 300 | não | Quanto de uma passagem servir. |
max_excerpts_per_match | inteiro, 1 a 10, padrão 2 | não | Passagens servidas por documento correspondente. |
fan_out | booleano, padrão true | não | Perguntar a todos os arquivos em vez de parar no primeiro que responder. |
sources | matriz de ids de fonte | não | Perguntar apenas a estes arquivos. |
Em retorno: hits, cada um carregando id, que get_item recebe e que identifica
seu arquivo; source e source_name; o identifier do próprio arquivo, sem
o prefixo; title, creator e year; page_number quando o arquivo declara
um; excerpts; e excerpt_kind.
excerpt_kind decide o valor de um trecho. Um passage é o texto
ao redor das palavras que corresponderam. Um page_opening é o início da página, enviado
porque o texto lido por máquina que o arquivo retornou termina antes de essas palavras
aparecerem: ele não contém a correspondência, portanto citá-lo cita outra coisa. Todos os
trechos de uma correspondência são de um mesmo tipo.
search_items
Pesquisa os catálogos.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
query | string, 1 a 300 caracteres | sim | Um título, um criador, um assunto ou palavras simples. |
media_type | um tipo que um dos arquivos possui | não | Qual tipo de material pesquisar. |
year_from | inteiro, 1000 a 2100 | não | Ano mais antigo. |
year_to | inteiro, 1000 a 2100 | não | Ano mais recente. |
sort | relevance, newest, oldest ou title, padrão relevance | não | Como as linhas são ordenadas. |
limit | inteiro, 1 a 25, padrão 5 | não | Linhas a manter de cada arquivo. |
page | inteiro, 1 a 100, padrão 1 | não | Qual página de linhas. |
fan_out | booleano, padrão true | não | Perguntar a todos os arquivos. |
sources | matriz de ids de fonte | não | Perguntar apenas a estes arquivos. |
Os três arquivos dividem seu material de maneiras diferentes. O Internet Archive
pesquisa todos os tipos de uma vez quando nenhum é nomeado; a Library of Congress tem uma
rota por tipo, portanto uma pesquisa sem tipo nomeado informa qual foi lida; e a pesquisa
da BnF lê obras. Um media_type que um arquivo não tem noção de deixa esse
arquivo de fora, e a resposta assim o declara.
Em retorno: linhas no formato que uma correspondência carrega, com per_source dando um
relatório por arquivo: seu status, o count que ele contribuiu, seu
reported_total e reported_total_means, que diz o que esse número conta
ali.
get_item
Lê um registro em um único formato, independentemente de qual arquivo o contenha.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
identifier | string, 1 a 500 caracteres | sim | O id que uma linha carrega. |
sections | matriz de description, subjects, copies, context, padrão ["description"] | não | Quais partes retornar. |
max_copies | inteiro, 1 a 50, padrão 10 | não | Cópias a listar. |
text_offset | inteiro, 0 a 1000000, padrão 0 | não | Onde retomar o texto. |
max_text_chars | inteiro, 200 a 8000, padrão 1500 | não | Quanto texto servir. |
Em retorno: o registro com seu id, source e source_name, o
identifier do próprio arquivo, title, creator, date exatamente como publicado, e
year ao lado de year_means, que diz do que aquele ano é o ano, já que os
três arquivos datam um registro de maneiras diferentes. attribution é o que aquele arquivo pede
para ser creditado, e identifier_provisional diz quando o identificador foi
construído em vez de lido, para que um chamador saiba que ele pode não resolver.
O que uma resposta declara sobre os arquivos
Toda resposta presta contas de cada arquivo separadamente. Um que falhou, um que ninguém consultou e um que respondeu com nada são três coisas diferentes, e elas são relatadas como três. Um total permanece ao lado do arquivo que o publicou, com o que aquele arquivo conta quando o declara: um conta documentos, outro conta folhas de jornal.
O valor do texto digitalizado
As palavras dentro de um documento digitalizado foram extraídas da página por meio do reconhecimento óptico de caracteres. Um trecho carrega os erros de leitura desse processo, e é servido como foi lido, em vez de corrigido. Cite-o como texto digitalizado e vincule o registro para que um leitor possa ver a página.
Configuração
Toda variável é opcional. Defina-as no bloco env da configuração do seu cliente.
| Variável | Padrão | O que faz |
|---|---|---|
BOOKS_USER_AGENT | a identidade do projeto | Nomeia seu aplicativo para os três arquivos, com um endereço onde uma pessoa pode ser contatada. |
BOOKS_MIN_INTERVAL_MS | o ritmo de cada arquivo | Amplia o intervalo entre duas solicitações a um arquivo, de 500 a 60000. Se não definido, cada arquivo mantém o ritmo que publica, e um valor definido aqui se aplica apenas onde for mais amplo. |
BOOKS_TIMEOUT_MS | 45000 | Prazo para uma solicitação, de 1000 a 120000. |
BOOKS_MAX_RETRIES | 3 | Tentativas após uma falha transitória, de 0 a 8. |
BOOKS_CACHE_TTL_MS | 900000 | Por quanto tempo uma resposta permanece na memória, de 0 a 86400000. |
BOOKS_CACHE_MAX_ENTRIES | 200 | Respostas mantidas na memória de uma vez, de 1 a 5000. |
BOOKS_LOG_LEVEL | error | silent, error, info ou debug, gravado em stderr. |
Um valor fora do intervalo retorna ao padrão, e o motivo é gravado em stderr.
Erros
Cada falha carrega um dos seis códigos, uma mensagem e, quando ajuda, uma dica indicando o próximo passo.
| Código | O que aconteceu | O que fazer |
|---|---|---|
not_found | Um arquivo respondeu e não possui tal registro. | Verifique o identificador com search_items. |
invalid_input | Os argumentos foram recusados antes de qualquer solicitação ser enviada. | Leia a mensagem, que nomeia o argumento. |
rate_limited | Um arquivo pediu que este cliente diminuísse o ritmo. | Aguarde e chame novamente com os mesmos argumentos. O registro ainda está lá. |
parse_failure | Uma resposta chegou em um formato que este cliente não consegue ler. | Reporte em o rastreador de problemas. |
network_error | A solicitação não foi concluída. | Tente novamente em breve. |
timeout | A solicitação passou do prazo. | Aumente BOOKS_TIMEOUT_MS, ou peça menos linhas. |
Um arquivo que falhou é reportado por arquivo, em vez de falhar toda a resposta, então um arquivo silencioso nunca esconde os outros.
Como biblioteca
A camada que lê os três arquivos é publicada separadamente, com seu ritmo, seu cache e seus erros, e sem protocolo anexado.
import { BooksClient } from "mcp-books/client";
const client = new BooksClient();
const read = await client.searchItems({ query: "beaumont light-house", limit: 3 });
console.log(read.data.rows.length);
Cada leitura responde { data, cached }, e lança um erro carregando um dos seis
códigos. Cada arquivo mantém seu próprio ritmo, e seu piso também se aplica aqui.
Ritmo e atribuição
Cada arquivo é ritmado separadamente, uma solicitação por vez, e o mais amplo entre
seu próprio piso e o intervalo configurado governa: a Biblioteca do Congresso publica
o mais lento, e perguntar aos três de uma vez custa a cada um deles uma
solicitação em vez de três. O User-Agent sempre termina com a identidade do projeto
e um endereço onde uma pessoa pode ser contatada.
Cada registro carrega o endereço de sua página e o attribution que seu arquivo
solicita. Os itens do Internet Archive pertencem aos seus depositantes, os
registros da Biblioteca do Congresso declaram seus próprios direitos, e a BnF pede
que a fonte e a data de recuperação sejam declaradas onde quer que seus metadados sejam exibidos.
Este servidor MCP é um projeto não oficial, sem afiliação a nenhum dos arquivos que lê.
Privacidade
Este servidor não coleta nada sobre você e não envia nada ao seu autor. Ele roda
na sua máquina, contata archive.org, openlibrary.org, www.loc.gov e
data.bnf.fr e nada mais, mantém suas respostas na memória enquanto roda, e
não grava nada em disco. PRIVACY.md declara o que uma solicitação carrega
e quais configurações alteram qualquer parte disso.
Desenvolvimento
npm install
npm run build:fixtures
npm test
npm run check
Os testes rodam contra fixtures gerados e não fazem nenhuma solicitação de rede. A suíte ao vivo,
npm run test:live, faz uma solicitação por rota e roda todas as noites contra os
próprios arquivos.
Contribuindo
Bugs, perguntas e ideias pertencem a o rastreador de problemas. Pull requests são bem-vindos; abrir um problema primeiro ajuda a concordar sobre a forma da mudança. Veja CONTRIBUTING.md.
Licença
MIT, veja LICENSE. Os registros pertencem aos arquivos que os publicaram e aos seus depositantes.
mcp-books (francês)
Três grandes arquivos preservam o rastro digitalizado do que foi publicado, e cada um o descreve em suas próprias palavras. O Internet Archive guarda os livros, filmes, gravações e softwares que cada um deposita, e passou milhões deles por reconhecimento óptico de caracteres. A Library of Congress publica as coleções nacionais dos Estados Unidos, um catálogo por tipo de documento. data.bnf.fr publica os registros de autoridade da Biblioteca Nacional da França, que descrevem obras e aqueles que as escreveram, em vez de exemplares.
Este servidor lê os três com uma única pergunta. Pode-se buscar nas palavras contidas nos documentos digitalizados, buscar nos catálogos, e ler um registro em uma forma única, independentemente do arquivo que o detém. Sem chave de API, sem conta.
Instalação
Instalação em um clique
Claude Code
claude mcp add books -- npx -y mcp-books
Claude Desktop, Cursor, e qualquer cliente no formato de configuração padrão
{
"mcpServers": {
"books": {
"command": "npx",
"args": ["-y", "mcp-books"]
}
}
}
Node 24 ou mais recente é necessário, e nenhuma variável de ambiente precisa ser preenchida.
Com Docker
{
"mcpServers": {
"books": {
"command": "docker",
"args": ["run", "-i", "--rm", "ghcr.io/smeet666/mcp-books:2.0.1"]
}
}
}
-i mantém a entrada padrão aberta, que é o canal do protocolo, e -t é
omitido porque um TTY reescreve o fluxo. O contêiner precisa de acesso HTTPS
de saída para archive.org, openlibrary.org, www.loc.gov e data.bnf.fr, e
nada mais: nenhum volume, nenhuma porta, nenhum identificador.
Bundle, sem npm
Baixe mcp-books-2.0.1.mcpb de
a última publicação
e abra-o. Um cliente que gerencia bundles MCP o instala sozinho, sem npm e
sem arquivo de configuração para modificar. O bundle carrega suas dependências, então
nada é baixado na instalação.
O que se pode pedir
- « Quais livros mencionam o farol de Beaumont ? »
- « Encontre o que há sobre o terremoto de São Francisco em 1906. »
- « Leia este registro para mim e diga quem guarda o original. »
- « O que a BnF tem sobre este autor ? »
- « Busque nas fotografias em vez dos livros. »
Uma resposta leva vários segundos: três arquivos são consultados, cada um no seu ritmo.
As três fontes
| Fonte | Arquivo | O que descreve |
|---|---|---|
archive | o Internet Archive | os exemplares depositados, de qualquer tipo |
loc | a Library of Congress | as coleções nacionais, um catálogo por tipo |
bnf | a Biblioteca Nacional da França | as obras e aqueles que as escreveram |
O id de uma linha nomeia seu arquivo, então um identificador lido em uma resposta
retorna para o correto. Os totais nunca são somados entre
arquivos, e um arquivo que falhou é reportado como tendo falhado, em vez
de como não tendo encontrado nada.
As ferramentas
| Ferramenta | O que faz |
|---|---|
search_inside | Busca nas palavras contidas nos documentos digitalizados. |
search_items | Busca nos catálogos por título, autor, assunto ou palavras simples. |
get_item | Lê um registro em uma forma única, independentemente do arquivo. |
search_inside
Busca no texto contido nos documentos digitalizados, texto proveniente do reconhecimento óptico de caracteres.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
query | string, 2 a 300 caracteres | sim | A frase a buscar nos documentos. |
limit | inteiro, 1 a 25, padrão 3 | não | Correspondências a manter de cada arquivo. |
page | inteiro, 1 a 100, padrão 1 | não | Qual página de correspondências. |
max_excerpt_chars | inteiro, 80 a 1200, padrão 300 | não | O comprimento do trecho a servir. |
max_excerpts_per_match | inteiro, 1 a 10, padrão 2 | não | Trechos servidos por documento correspondente. |
fan_out | booleano, padrão true | não | Consultar cada arquivo em vez de parar no primeiro que responder. |
sources | array de identificadores de fonte | não | Consultar apenas esses arquivos. |
Em retorno: hits, cada um carregando id, que get_item retoma e que nomeia
seu arquivo ; source e source_name ; o identifier próprio do arquivo, sem
o prefixo ; title, creator e year ; page_number onde o arquivo
indica um ; excerpts ; e excerpt_kind.
excerpt_kind decide o que vale um trecho. Um passage é o texto
ao redor das palavras encontradas. Um page_opening é o início da página, enviado porque
o texto lido por máquina que o arquivo retornou termina antes que essas palavras
apareçam: ele não carrega a correspondência, então citá-lo cita outra coisa.
Todos os trechos de uma correspondência são de um único tipo.
search_items
Busca nos catálogos.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
query | string, 1 a 300 caracteres | sim | Um título, um autor, um assunto ou palavras simples. |
media_type | um tipo que um dos arquivos possui | não | O tipo de documento a buscar. |
year_from | inteiro, 1000 a 2100 | não | Ano mais antigo. |
year_to | inteiro, 1000 a 2100 | não | Ano mais recente. |
sort | relevance, newest, oldest ou title, padrão relevance | não | A ordem das linhas. |
limit | inteiro, 1 a 25, padrão 5 | não | Linhas a manter de cada arquivo. |
page | inteiro, 1 a 100, padrão 1 | não | Qual página de linhas. |
fan_out | booleano, padrão true | não | Consultar cada arquivo. |
sources | array de identificadores de fonte | não | Consultar apenas esses arquivos. |
Os três arquivos dividem seus acervos de maneiras diferentes. O Internet Archive busca
em todos os tipos ao mesmo tempo quando nenhum é nomeado; a Library of Congress tem uma
rota por tipo, então uma busca que não nomeia nenhum recebe a informação de qual foi
lido; e a busca da BnF lê obras. Um media_type que um
arquivo não reconhece o exclui da resposta, e a resposta informa isso.
Em retorno: linhas na forma de um hit, com per_source que fornece
um relatório por arquivo: seu status, o count que ele forneceu, seu
reported_total e reported_total_means, que diz o que esse número conta
lá.
get_item
Lê um registro em um formato único, independentemente do arquivo que o possui.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
identifier | string, 1 a 500 caracteres | sim | O id que uma linha carrega. |
sections | array de description, subjects, copies, context, padrão ["description"] | não | As partes a retornar. |
max_copies | inteiro, 1 a 50, padrão 10 | não | Exemplares a listar. |
text_offset | inteiro, 0 a 1000000, padrão 0 | não | Onde retomar o texto. |
max_text_chars | inteiro, 200 a 8000, padrão 1500 | não | O comprimento do texto a servir. |
Em retorno: o registro com seu id, source e source_name,
o identifier específico do arquivo, title, creator, date exatamente como
publicado, e year acompanhado de year_means, que diz do que esse ano
é o ano, já que os três arquivos datam um registro de maneiras diferentes. attribution é
o que esse arquivo pede que seja creditado a ele, e identifier_provisional diz
quando o identificador foi construído em vez de lido, para que um chamador saiba
que ele pode não resolver.
O que uma resposta diz sobre os arquivos
Cada resposta presta contas de cada arquivo separadamente. Um que falhou, um que ninguém consultou e um que respondeu vazio são três coisas diferentes, e são relatados como três. Um total permanece ao lado do arquivo que o publicou, com o que esse arquivo conta ao dizê-lo: um conta documentos, outro conta folhas de jornais.
O que vale um texto digitalizado
As palavras contidas em um documento digitalizado vêm do reconhecimento óptico de caracteres. Um trecho carrega os erros de leitura desse processo, e é servido como foi lido, em vez de corrigido. Cite-o como um texto digitalizado e vincule o registro para que um leitor possa ver a página.
Configuração
Cada variável é opcional. Elas são definidas no bloco env da
configuração do cliente.
| Variável | Padrão | O que faz |
|---|---|---|
BOOKS_USER_AGENT | a identidade do projeto | Nomeia seu aplicativo junto aos três arquivos, com um endereço para contato. |
BOOKS_MIN_INTERVAL_MS | o ritmo próprio de cada arquivo | Amplia o intervalo entre duas requisições ao mesmo arquivo, de 500 a 60000. Se não definida, cada arquivo mantém o ritmo que publica, e um valor definido aqui só se aplica onde for mais amplo. |
BOOKS_TIMEOUT_MS | 45000 | Tempo limite de uma requisição, de 1000 a 120000. |
BOOKS_MAX_RETRIES | 3 | Tentativas após uma falha temporária, de 0 a 8. |
BOOKS_CACHE_TTL_MS | 900000 | Duração durante a qual uma resposta permanece em memória, de 0 a 86400000. |
BOOKS_CACHE_MAX_ENTRIES | 200 | Respostas mantidas em memória por vez, de 1 a 5000. |
BOOKS_LOG_LEVEL | error | silent, error, info ou debug, escrito na saída de erro. |
Um valor fora do intervalo cai no padrão, e o motivo é escrito na saída de erro.
Erros
Cada falha carrega um dos seis códigos, uma mensagem e, quando ajuda, uma indicação do próximo passo.
| Código | O que aconteceu | O que fazer |
|---|---|---|
not_found | Um arquivo respondeu e não tem esse registro. | Verifique o identificador com search_items. |
invalid_input | Os argumentos foram recusados antes de qualquer requisição. | Leia a mensagem, que nomeia o argumento. |
rate_limited | Um arquivo pede que este cliente desacelere. | Aguarde e chame novamente com os mesmos argumentos. O registro ainda está lá. |
parse_failure | Uma resposta chegou em um formato ilegível aqui. | Reporte em o rastreador de problemas. |
network_error | A requisição não foi concluída. | Tente novamente em breve. |
timeout | A requisição excedeu seu tempo limite. | Aumente BOOKS_TIMEOUT_MS, ou peça menos linhas. |
Um arquivo que falha é relatado arquivo por arquivo, em vez de fazer toda a resposta falhar, então um arquivo silencioso nunca esconde outros.
Como biblioteca
A camada que lê os três arquivos é publicada sozinha, com seu ritmo, seu cache e seus erros, sem protocolo anexado.
import { BooksClient } from "mcp-books/client";
const client = new BooksClient();
const read = await client.searchItems({ query: "beaumont light-house", limit: 3 });
console.log(read.data.rows.length);
Cada leitura responde { data, cached } e levanta um erro com um dos seis
códigos. Cada arquivo mantém seu próprio ritmo, e seu piso também se aplica
aqui.
Ritmo e atribuição
Cada arquivo é limitado por si mesmo, uma requisição por vez, e é o
mais amplo entre seu próprio piso e o intervalo configurado que governa: a
Library of Congress publica o mais lento, e consultar os três ao mesmo tempo custa
portanto a cada um uma requisição, em vez de três. O User-Agent termina sempre
com a identidade do projeto e um endereço para contato.
Cada registro carrega o endereço de sua página e o attribution que seu arquivo
pede. Os documentos do Internet Archive pertencem àqueles que os
depositaram, os registros da Library of Congress declaram seus próprios direitos, e
a BnF pede que a fonte e a data de recuperação sejam indicadas em todos os lugares
onde suas metadados são exibidos.
Este MCP é um projeto não oficial, sem afiliação a nenhum dos arquivos que lê.
Privacidade
Este servidor não coleta nada sobre você e não envia nada ao seu autor. Ele roda na
sua máquina, junta apenas archive.org, openlibrary.org, www.loc.gov e
data.bnf.fr, mantém suas respostas em memória enquanto roda, e não escreve
nada no disco. PRIVACY.md diz o que uma requisição carrega e
quais configurações mudam isso.
Desenvolvimento
npm install
npm run build:fixtures
npm test
npm run check
Os testes são executados em fixtures geradas e não emitem nenhuma requisição.
A suíte ao vivo, npm run test:live, emite uma requisição por rota e roda
todas as noites contra os próprios arquivos.
Contribuindo
Anomalias, perguntas e ideias têm seu lugar em o rastreador de problemas. As propostas de modificação são bem-vindas; abrir um ticket primeiro ajuda a concordar sobre a forma da mudança. Veja CONTRIBUTING.md.
Licença
MIT, veja LICENSE. Os registros pertencem aos arquivos que os publicaram e àqueles que os depositaram neles.