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

npm CI license MCP Registry Glama M8ven LobeHub Install in Cursor Install in VS Code

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.

Versão em francês


Instalação

Instalação com um clique

Install in Cursor Install in VS Code

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

FonteArquivoO que descreve
archiveo Internet Archivecópias depositadas, de todos os tipos
loca Library of Congressas coleções nacionais, um catálogo por tipo
bnfa Bibliothèque nationale de Franceobras 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

FerramentaO que faz
search_insidePesquisa as palavras dentro dos documentos digitalizados.
search_itemsPesquisa os catálogos por título, criador, assunto ou palavras simples.
get_itemLê 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.

ArgumentoTipoObrigatórioO que faz
querystring, 2 a 300 caracteressimA frase a procurar dentro dos documentos.
limitinteiro, 1 a 25, padrão 3nãoCorrespondências a manter de cada arquivo.
pageinteiro, 1 a 100, padrão 1nãoQual página de correspondências.
max_excerpt_charsinteiro, 80 a 1200, padrão 300nãoQuanto de uma passagem servir.
max_excerpts_per_matchinteiro, 1 a 10, padrão 2nãoPassagens servidas por documento correspondente.
fan_outbooleano, padrão truenãoPerguntar a todos os arquivos em vez de parar no primeiro que responder.
sourcesmatriz de ids de fontenãoPerguntar 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.

ArgumentoTipoObrigatórioO que faz
querystring, 1 a 300 caracteressimUm título, um criador, um assunto ou palavras simples.
media_typeum tipo que um dos arquivos possuinãoQual tipo de material pesquisar.
year_frominteiro, 1000 a 2100nãoAno mais antigo.
year_tointeiro, 1000 a 2100nãoAno mais recente.
sortrelevance, newest, oldest ou title, padrão relevancenãoComo as linhas são ordenadas.
limitinteiro, 1 a 25, padrão 5nãoLinhas a manter de cada arquivo.
pageinteiro, 1 a 100, padrão 1nãoQual página de linhas.
fan_outbooleano, padrão truenãoPerguntar a todos os arquivos.
sourcesmatriz de ids de fontenãoPerguntar 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.

ArgumentoTipoObrigatórioO que faz
identifierstring, 1 a 500 caracteressimO id que uma linha carrega.
sectionsmatriz de description, subjects, copies, context, padrão ["description"]nãoQuais partes retornar.
max_copiesinteiro, 1 a 50, padrão 10nãoCópias a listar.
text_offsetinteiro, 0 a 1000000, padrão 0nãoOnde retomar o texto.
max_text_charsinteiro, 200 a 8000, padrão 1500nãoQuanto 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ávelPadrãoO que faz
BOOKS_USER_AGENTa identidade do projetoNomeia seu aplicativo para os três arquivos, com um endereço onde uma pessoa pode ser contatada.
BOOKS_MIN_INTERVAL_MSo ritmo de cada arquivoAmplia 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_MS45000Prazo para uma solicitação, de 1000 a 120000.
BOOKS_MAX_RETRIES3Tentativas após uma falha transitória, de 0 a 8.
BOOKS_CACHE_TTL_MS900000Por quanto tempo uma resposta permanece na memória, de 0 a 86400000.
BOOKS_CACHE_MAX_ENTRIES200Respostas mantidas na memória de uma vez, de 1 a 5000.
BOOKS_LOG_LEVELerrorsilent, 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ódigoO que aconteceuO que fazer
not_foundUm arquivo respondeu e não possui tal registro.Verifique o identificador com search_items.
invalid_inputOs argumentos foram recusados antes de qualquer solicitação ser enviada.Leia a mensagem, que nomeia o argumento.
rate_limitedUm arquivo pediu que este cliente diminuísse o ritmo.Aguarde e chame novamente com os mesmos argumentos. O registro ainda está lá.
parse_failureUma resposta chegou em um formato que este cliente não consegue ler.Reporte em o rastreador de problemas.
network_errorA solicitação não foi concluída.Tente novamente em breve.
timeoutA 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)

Versão em inglê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

Install in Cursor Install in VS Code

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

FonteArquivoO que descreve
archiveo Internet Archiveos exemplares depositados, de qualquer tipo
loca Library of Congressas coleções nacionais, um catálogo por tipo
bnfa Biblioteca Nacional da Françaas 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

FerramentaO que faz
search_insideBusca nas palavras contidas nos documentos digitalizados.
search_itemsBusca nos catálogos por título, autor, assunto ou palavras simples.
get_itemLê 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.

ArgumentoTipoObrigatórioO que faz
querystring, 2 a 300 caracteressimA frase a buscar nos documentos.
limitinteiro, 1 a 25, padrão 3nãoCorrespondências a manter de cada arquivo.
pageinteiro, 1 a 100, padrão 1nãoQual página de correspondências.
max_excerpt_charsinteiro, 80 a 1200, padrão 300nãoO comprimento do trecho a servir.
max_excerpts_per_matchinteiro, 1 a 10, padrão 2nãoTrechos servidos por documento correspondente.
fan_outbooleano, padrão truenãoConsultar cada arquivo em vez de parar no primeiro que responder.
sourcesarray de identificadores de fontenãoConsultar 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.

ArgumentoTipoObrigatórioO que faz
querystring, 1 a 300 caracteressimUm título, um autor, um assunto ou palavras simples.
media_typeum tipo que um dos arquivos possuinãoO tipo de documento a buscar.
year_frominteiro, 1000 a 2100nãoAno mais antigo.
year_tointeiro, 1000 a 2100nãoAno mais recente.
sortrelevance, newest, oldest ou title, padrão relevancenãoA ordem das linhas.
limitinteiro, 1 a 25, padrão 5nãoLinhas a manter de cada arquivo.
pageinteiro, 1 a 100, padrão 1nãoQual página de linhas.
fan_outbooleano, padrão truenãoConsultar cada arquivo.
sourcesarray de identificadores de fontenãoConsultar 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.

ArgumentoTipoObrigatórioO que faz
identifierstring, 1 a 500 caracteressimO id que uma linha carrega.
sectionsarray de description, subjects, copies, context, padrão ["description"]nãoAs partes a retornar.
max_copiesinteiro, 1 a 50, padrão 10nãoExemplares a listar.
text_offsetinteiro, 0 a 1000000, padrão 0nãoOnde retomar o texto.
max_text_charsinteiro, 200 a 8000, padrão 1500nãoO 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ávelPadrãoO que faz
BOOKS_USER_AGENTa identidade do projetoNomeia seu aplicativo junto aos três arquivos, com um endereço para contato.
BOOKS_MIN_INTERVAL_MSo ritmo próprio de cada arquivoAmplia 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_MS45000Tempo limite de uma requisição, de 1000 a 120000.
BOOKS_MAX_RETRIES3Tentativas após uma falha temporária, de 0 a 8.
BOOKS_CACHE_TTL_MS900000Duração durante a qual uma resposta permanece em memória, de 0 a 86400000.
BOOKS_CACHE_MAX_ENTRIES200Respostas mantidas em memória por vez, de 1 a 5000.
BOOKS_LOG_LEVELerrorsilent, 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ódigoO que aconteceuO que fazer
not_foundUm arquivo respondeu e não tem esse registro.Verifique o identificador com search_items.
invalid_inputOs argumentos foram recusados antes de qualquer requisição.Leia a mensagem, que nomeia o argumento.
rate_limitedUm arquivo pede que este cliente desacelere.Aguarde e chame novamente com os mesmos argumentos. O registro ainda está lá.
parse_failureUma resposta chegou em um formato ilegível aqui.Reporte em o rastreador de problemas.
network_errorA requisição não foi concluída.Tente novamente em breve.
timeoutA 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.