Library of Congress

Pesquise em jornais americanos digitalizados e navegue pelo catálogo da Biblioteca do Congresso. Sem chave de API.

Documentação

mcp-libraryofcongress

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

A Biblioteca do Congresso é a biblioteca nacional dos Estados Unidos e publica grande parte de seu acervo online: livros, fotografias, mapas, gravações sonoras, manuscritos e as páginas de jornais americanos que remontam ao século XVIII. As páginas dos jornais foram digitalizadas e submetidas a reconhecimento óptico de caracteres, de modo que as palavras impressas nelas podem ser pesquisadas. Os curadores também reúnem material em coleções digitais, cada uma descrita e publicada como um corpo próprio.

Este servidor conecta um cliente de chat a essa biblioteca. Você pode pesquisar as palavras impressas dentro dos jornais, pesquisar o catálogo por título, criador, assunto, local ou idioma, ler um registro com sua declaração de direitos e onde o original está guardado, e listar as coleções digitais. Ele não exige chave de API nem conta.

Versão francesa


Instalação

Instalação em um clique

Install in Cursor Install in VS Code

Claude Code

claude mcp add libraryofcongress -- npx -y mcp-libraryofcongress

Claude Desktop, Cursor e qualquer cliente que use o formato de configuração padrão

{
  "mcpServers": {
    "libraryofcongress": {
      "command": "npx",
      "args": ["-y", "mcp-libraryofcongress"]
    }
  }
}

Node 24 ou posterior é necessário, e nenhuma variável de ambiente precisa ser definida.

Com Docker

{
  "mcpServers": {
    "libraryofcongress": {
      "command": "docker",
      "args": ["run", "-i", "--rm", "ghcr.io/smeet666/mcp-libraryofcongress:3.0.2"]
    }
  }
}

-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 www.loc.gov e chroniclingamerica.loc.gov, e nada mais: sem volume, sem porta, sem credencial.

Pacote, sem npm

Baixe mcp-libraryofcongress-3.0.2.mcpb de a versão mais recente e abra-o. Um cliente que suporta pacotes MCP o instala por conta própria, sem npm e sem arquivo de configuração para editar. O pacote carrega suas dependências, então nada é baixado no momento da instalação.

O que você pode perguntar

  • "O que os jornais de Oklahoma escreveram sobre a votação da condição de estado em 1907?"
  • "Encontre fotografias de cortiços de Chicago antes de 1920."
  • "Leia esse registro e me diga quem guarda o original."
  • "Que coleções digitais existem sobre a Guerra Civil?"
  • "Posso reutilizar essa fotografia?"

O caminho comum vai de uma pesquisa a um registro: uma linha carrega um identifier, e get_item o lê.

Ferramentas

FerramentaO que faz
search_newspapersPesquisa as palavras impressas dentro das páginas de jornais digitalizadas.
search_itemsPesquisa o catálogo por título, criador, assunto, local ou idioma.
get_itemLê um registro, seus direitos e onde o original está guardado.
list_collectionsLista as coleções digitais publicadas pelos curadores.

search_newspapers

Pesquisa o texto das páginas de jornais digitalizadas, que saiu da página por meio de reconhecimento óptico de caracteres.

ArgumentoTipoObrigatórioO que faz
querystring, 1 a 300 caracteressimAs palavras a procurar nas páginas.
locationstring, até 120 caracteresnãoUm local onde o jornal foi publicado.
publicationstring, até 200 caracteresnãoUm jornal específico.
year_frominteiro, 1000 a 9999nãoAno mais antigo, inclusive.
year_tointeiro, 1000 a 9999nãoAno mais recente, inclusive.
limitinteiro, 1 a 25, padrão 10nãoCorrespondências a servir.
pageinteiro, 1 a 100, padrão 1nãoQual página de correspondências.
max_excerpt_charsinteiro, 80 a 1200, padrão 300nãoQuanto de um trecho servir.
max_excerpts_per_matchinteiro, 1 a 10, padrão 3nãoTrechos servidos por página correspondente.

Em retorno: hits, cada um carregando identifier, que get_item recebe; title; creator, que é a biblioteca que contribuiu com a digitalização; year; page_number, a folha dentro da edição; published_on; publication com os anos em que o jornal circulou; state; excerpts; e excerpt_kind.

excerpt_kind decide o que vale um trecho. Um passage é o texto ao redor das palavras que corresponderam, centrado nelas. Um page_opening é o início da folha, enviado porque o texto que a Biblioteca retornou com a linha para antes dessas palavras aparecerem: ele não carrega a correspondência, então citá-lo cita outra coisa, e source_url abre a folha com a consulta aplicada. total conta folhas de jornais, e pagina: nunca é uma contagem de quantas vezes as palavras ocorrem.

search_items

Pesquisa o catálogo, um tipo de coisa por vez.

ArgumentoTipoObrigatórioO que faz
querystring, 1 a 300 caracteressimPalavras a procurar.
media_typebooks, photos, maps, audio, manuscripts ou newspapersnãoO catálogo a ler.
year_frominteiro, 1000 a 9999nãoAno mais antigo, inclusive.
year_tointeiro, 1000 a 9999nãoAno mais recente, inclusive.
subjectstring, até 120 caracteresnãoUm cabeçalho de assunto.
locationstring, até 120 caracteresnãoUm local.
languagestring, até 120 caracteresnãoUm idioma, escrito em inglês.
collectionstring, até 160 caracteresnãoUma coleção, como list_collections a nomeia.
online_onlybooleano, padrão truenãoManter os registros disponíveis online.
sortrelevance, newest, oldest ou title, padrão relevancenãoComo as linhas são ordenadas.
limitinteiro, 1 a 50, padrão 10nãoLinhas a servir.
pageinteiro, 1 a 100, padrão 1nãoQual página de linhas.

Em retorno: items, cada um carregando identifier, title, creator, year, date como publicado, que muitas vezes é um intervalo, is_collection e source_url. A Biblioteca mantém um catálogo por tipo de coisa, então uma pesquisa sem media_type lê o geral, e total conta os registros correspondentes ali.

get_item

Lê um registro. As partes mais pesadas são solicitadas em vez de servidas por padrão, e uma descrição longa é paginada.

ArgumentoTipoObrigatórioO que faz
identifierstring, 1 a 300 caracteressimO identificador que uma linha carrega.
sectionsarray de basic, citations, resources, full_metadata, padrão ["basic"]nãoQuais partes retornar.
offsetinteiro, 0 ou mais, padrão 0nãoOnde retomar a descrição.
max_description_charsinteiro, 200 a 20000, padrão 2000nãoQuanto da descrição servir.

Em retorno: o registro com seu title, creator, year, date, format e source_url, além de description, subjects, location, language, part_of para as coleções e divisões em que se encontra, repository nomeando onde o original está guardado, call_number e rights. Um campo que o registro deixa vazio é null. next_offset continua uma descrição longa e é null no final. Um identificador pode conter barras: uma única edição de jornal é nomeada por seu jornal, sua data e sua edição juntas.

list_collections

Lista as coleções digitais, corpos de material que um curador escolheu, descritos e publicados juntos.

ArgumentoTipoObrigatórioO que faz
limitinteiro, 1 a 50, padrão 20nãoColeções a servir.
pageinteiro, 1 a 100, padrão 1nãoQual página de coleções.
searchable_onlybooleano, padrão falsenãoManter as coleções às quais uma pesquisa pode ser restringida.
max_description_charsinteiro, 80 a 2000, padrão 300nãoQuanto de cada descrição servir.

Em retorno: collections, cada um carregando identifier, o slug pelo qual é endereçado; title; collection_filter, a redação que search_items assume; searchable_media_types; description; item_count; subjects; formats para os tipos de coisa que guarda; e source_url. total conta as coleções que a Biblioteca publica, que é mais do que o número retornado.

O que vale o texto digitalizado

As palavras dentro de uma página de jornal saíram da página por meio de reconhecimento óptico de caracteres, então um trecho carrega as leituras incorretas desse processo. Ele é servido como foi lido, em vez de corrigido. Cite-o como texto digitalizado e vincule a página para que um leitor possa olhar a própria folha.

Direitos

Um registro declara seus próprios direitos em rights, e os termos da Biblioteca diferem de um depósito para o outro. Leia essa declaração antes de reutilizar qualquer coisa e repita-a junto ao que for exibido.

Configuração

Toda variável é opcional. Defina-as no bloco env da configuração do seu cliente.

VariávelPadrãoO que faz
LOC_USER_AGENTa identidade do projetoNomeia seu aplicativo para a Biblioteca, com um endereço onde uma pessoa pode ser contatada.
LOC_MIN_INTERVAL_MS6000Intervalo entre duas solicitações, de 3000 a 60000.
LOC_TIMEOUT_MS30000Prazo para uma solicitação, de 1000 a 120000.
LOC_NEWSPAPER_TIMEOUT_MS90000Prazo para uma busca em jornais, de 1000 a 300000.
LOC_MAX_RETRIES3Tentativas após uma falha transitória, de 0 a 8.
LOC_CACHE_TTL_MS900000Por quanto tempo uma resposta permanece na memória, de 0 a 86400000.
LOC_CACHE_MAX_ENTRIES200Respostas mantidas na memória de uma vez, de 1 a 5000.
LOC_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

Toda 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_foundA Biblioteca 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_limitedA Biblioteca pediu que este cliente diminuísse o ritmo.Aguarde o número de segundos que a dica indica e chame novamente com os mesmos argumentos. O registro ainda está lá.
parse_failureA 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 LOC_TIMEOUT_MS, ou LOC_NEWSPAPER_TIMEOUT_MS para uma busca em jornais.

Como biblioteca

A camada que lê a Biblioteca é publicada por conta própria, com seu ritmo, seu cache e seus erros, e sem protocolo anexado.

import { LocClient } from "mcp-libraryofcongress/client";

const client = new LocClient();
const { data, cached } = await client.searchItems({ query: "tenement", mediaType: "photos" });
console.log(data.total, cached);

Cada leitura responde com { data, cached } e lança um erro carregando um dos seis códigos. O intervalo mínimo entre duas solicitações também se aplica aqui.

Ritmo e atribuição

A Biblioteca publica um limite de 20 solicitações por minuto para sua API e 10 para o site como um todo, e o menor dos dois prevalece: as solicitações saem uma de cada vez com pelo menos seis segundos entre elas, e o intervalo mínimo de três segundos se mantém independentemente de como o servidor está configurado. O User-Agent sempre termina com a identidade do projeto e um endereço onde uma pessoa pode ser contatada.

Todo resultado carrega o endereço da página de onde foi lido. A Biblioteca do Congresso é uma instituição pública, e seus registros declaram seus próprios direitos.

Este servidor MCP é um projeto não oficial, sem afiliação com a Biblioteca do Congresso.

Privacidade

Este servidor não coleta nada sobre você e não envia nada ao seu autor. Ele roda na sua máquina, contata www.loc.gov e chroniclingamerica.loc.gov 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 a própria Biblioteca.

Contribuindo

Bugs, perguntas e ideias pertencem ao rastreador de problemas. Pull requests são bem-vindos; abrir uma issue primeiro ajuda a concordar sobre o formato da mudança. Veja CONTRIBUTING.md.

Licença

MIT, veja LICENSE. Os registros pertencem à Biblioteca do Congresso e aos depositantes que ela nomeia, sob os direitos que cada registro declara.


mcp-libraryofcongress (français)

Versão em inglês

A Biblioteca do Congresso é a biblioteca nacional dos Estados Unidos, e ela publica online uma grande parte de seus acervos: livros, fotografias, mapas, gravações sonoras, manuscritos e as páginas dos jornais americanos desde o século XVIII. Essas páginas de jornais foram digitalizadas e depois passaram por reconhecimento óptico de caracteres, de modo que as palavras nelas impressas são pesquisáveis. Curadores também reúnem documentos em coleções digitais, cada uma descrita e publicada como um conjunto completo.

Este servidor conecta um cliente de conversa a essa biblioteca. Pode-se buscar nas palavras impressas dentro dos jornais, buscar no catálogo por título, autor, assunto, local ou idioma, ler um registro com suas condições de direitos e o local onde o original é conservado, e listar as coleções digitais. Nenhuma chave de API, nenhuma conta.

Instalação

Instalação em um clique

Install in Cursor Install in VS Code

Claude Code

claude mcp add libraryofcongress -- npx -y mcp-libraryofcongress

Claude Desktop, Cursor e qualquer cliente no formato de configuração padrão

{
  "mcpServers": {
    "libraryofcongress": {
      "command": "npx",
      "args": ["-y", "mcp-libraryofcongress"]
    }
  }
}

Node 24 ou mais recente é necessário, e nenhuma variável de ambiente precisa ser preenchida.

Com Docker

{
  "mcpServers": {
    "libraryofcongress": {
      "command": "docker",
      "args": ["run", "-i", "--rm", "ghcr.io/smeet666/mcp-libraryofcongress:3.0.2"]
    }
  }
}

-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 www.loc.gov e chroniclingamerica.loc.gov, e nada mais: nenhum volume, nenhuma porta, nenhum identificador.

Bundle, sem npm

Baixe mcp-libraryofcongress-3.0.2.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, portanto nada é baixado na instalação.

O que se pode pedir

  • « O que os jornais de Oklahoma escreveram sobre o voto de adesão de 1907? »
  • « Encontre-me fotografias de prédios de aluguel em Chicago antes de 1920. »
  • « Leia este registro e diga-me quem conserva o original. »
  • « Quais coleções digitais existem sobre a Guerra de Secessão? »
  • « Posso reutilizar esta fotografia? »

O caminho comum vai de uma busca a um registro: uma linha carrega um identifier, e get_item o lê.

As ferramentas

FerramentaO que faz
search_newspapersBusca nas palavras impressas das páginas de jornais digitalizadas.
search_itemsBusca no catálogo por título, autor, assunto, local ou idioma.
get_itemLê um registro, seus direitos e o local de conservação do original.
list_collectionsLista as coleções digitais publicadas pelos curadores.

search_newspapers

Busca no texto das páginas de jornais digitalizadas, texto proveniente do reconhecimento óptico de caracteres.

ArgumentoTipoObrigatórioO que faz
querystring, 1 a 300 caracteressimAs palavras a buscar nas páginas.
locationstring, até 120 caracteresnãoUm local de publicação do jornal.
publicationstring, até 200 caracteresnãoUm jornal em particular.
year_frominteiro, 1000 a 9999nãoAno mais antigo, incluído.
year_tointeiro, 1000 a 9999nãoAno mais recente, incluído.
limitinteiro, 1 a 25, padrão 10nãoCorrespondências a servir.
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 3nãoTrechos servidos por página correspondente.

Em retorno: hits, cada um carregando identifier, que get_item retoma; title ; creator, que é a biblioteca que forneceu a digitalização; year ; page_number, o fólio no número; published_on ; publication com os anos de publicação do jornal; state ; excerpts ; e excerpt_kind.

excerpt_kind decide o que vale um trecho. Um passage é o texto ao redor das palavras encontradas, centrado nelas. Um page_opening é o início do fólio, enviado porque o texto fornecido pela biblioteca com a linha para antes de essas palavras aparecerem: ele não carrega a correspondência, portanto citá-lo cita outra coisa, e source_url abre o fólio com a consulta aplicada. total conta fólios de jornais, e ele pagina: nunca é uma contagem do número de vezes que as palavras aparecem.

search_items

Busca no catálogo, um tipo de coisa por vez.

ArgumentoTipoObrigatórioO que faz
querystring, 1 a 300 caracteressimAs palavras a pesquisar.
media_typebooks, photos, maps, audio, manuscripts ou newspapersnãoO catálogo a consultar.
year_frominteiro, 1000 a 9999nãoAno mais antigo, incluído.
year_tointeiro, 1000 a 9999nãoAno mais recente, incluído.
subjectstring, até 120 caracteresnãoUm assunto.
locationstring, até 120 caracteresnãoUm local.
languagestring, até 120 caracteresnãoUm idioma, escrito em inglês.
collectionstring, até 160 caracteresnãoUma coleção, como list_collections a nomeia.
online_onlybooleano, padrão truenãoManter apenas os registros online.
sortrelevance, newest, oldest ou title, padrão relevancenãoA ordem das linhas.
limitinteiro, 1 a 50, padrão 10nãoLinhas a servir.
pageinteiro, 1 a 100, padrão 1nãoQual página de linhas.

Em retorno: items, cada um com identifier, title, creator, year, date como publicado, frequentemente um intervalo, is_collection e source_url. A biblioteca mantém um catálogo por tipo de coisa, então uma pesquisa sem media_type lê o catálogo geral, e total conta os registros correspondentes.

get_item

Lê um registro. As partes pesadas são solicitadas em vez de servidas por padrão, e uma descrição longa é paginada.

ArgumentoTipoObrigatórioO que faz
identifierstring, 1 a 300 caracteressimO identificador que uma linha carrega.
sectionsarray de basic, citations, resources, full_metadata, padrão ["basic"]nãoAs partes a renderizar.
offsetinteiro, 0 ou mais, padrão 0nãoOnde retomar a descrição.
max_description_charsinteiro, 200 a 20000, padrão 2000nãoO comprimento da descrição a servir.

Em retorno: o registro com seu title, creator, year, date, format e source_url, mais description, subjects, location, language, part_of para as coleções e divisões onde ele se classifica, repository que nomeia o local de preservação do original, call_number e rights. Um campo que o registro deixa vazio vale null. next_offset continua uma descrição longa e vale null no final. Um identificador pode conter barras: um número de jornal é nomeado por seu título, data e edição juntos.

list_collections

Lista as coleções digitais, conjuntos de documentos que um curador escolheu, descreveu e publicou juntos.

ArgumentoTipoObrigatórioO que faz
limitinteiro, 1 a 50, padrão 20nãoColeções a servir.
pageinteiro, 1 a 100, padrão 1nãoQual página de coleções.
searchable_onlybooleano, padrão falsenãoManter apenas aquelas às quais se pode restringir uma pesquisa.
max_description_charsinteiro, 80 a 2000, padrão 300nãoO comprimento de cada descrição a servir.

Em retorno: collections, cada uma com identifier, o slug que a endereça; title; collection_filter, a formulação que search_items retoma; searchable_media_types; description; item_count; subjects; formats para os tipos de coisas que ela contém; e source_url. total conta as coleções que a biblioteca publica, o que excede o número renderizado.

O valor de um texto digitalizado

As palavras contidas em uma página de jornal vêm do reconhecimento óptico de caracteres, portanto um trecho carrega os erros de leitura desse processo. Ele é servido como foi lido, em vez de corrigido. Cite-o como um texto digitalizado e vincule a página para que um leitor possa ver o folheto em si.

Os direitos

Um registro declara seus próprios direitos em rights, e as condições da biblioteca diferem de um repositório para outro. Leia essa menção antes de qualquer reutilização e repita-a ao lado do que é mostrado.

Configuração

Cada variável é opcional. Elas são definidas no bloco env da configuração do cliente.

VariávelPadrãoO que faz
LOC_USER_AGENTa identidade do projetoNomeia seu aplicativo junto à biblioteca, com um endereço para contato.
LOC_MIN_INTERVAL_MS6000Intervalo entre duas requisições, de 3000 a 60000.
LOC_TIMEOUT_MS30000Tempo limite de uma requisição, de 1000 a 120000.
LOC_NEWSPAPER_TIMEOUT_MS90000Tempo limite de uma pesquisa nos jornais, de 1000 a 300000.
LOC_MAX_RETRIES3Tentativas após uma falha temporária, de 0 a 8.
LOC_CACHE_TTL_MS900000Duração durante a qual uma resposta permanece em memória, de 0 a 86400000.
LOC_CACHE_MAX_ENTRIES200Respostas mantidas em memória por vez, de 1 a 5000.
LOC_LOG_LEVELerrorsilent, error, info ou debug, escrito na saída de erro.

Um valor fora de seu 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_foundA biblioteca 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_limitedA biblioteca pede que este cliente desacelere.Aguarde os segundos indicados e chame novamente com os mesmos argumentos. O registro ainda está lá.
parse_failureA resposta chegou em uma forma ilegível aqui.Reporte em o rastreador de incidentes.
network_errorA requisição não foi concluída.Tente novamente em breve.
timeoutA requisição excedeu seu tempo limite.Aumente LOC_TIMEOUT_MS, ou LOC_NEWSPAPER_TIMEOUT_MS para uma pesquisa nos jornais.

Como biblioteca

A camada que lê a biblioteca é publicada sozinha, com seu ritmo, seu cache e seus erros, sem protocolo anexado.

import { LocClient } from "mcp-libraryofcongress/client";

const client = new LocClient();
const { data, cached } = await client.searchItems({ query: "tenement", mediaType: "photos" });
console.log(data.total, cached);

Cada leitura responde { data, cached } e levanta um erro com um dos seis códigos. O piso entre duas requisições também se aplica aqui.

Ritmo e atribuição

A biblioteca publica um limite de 20 requisições por minuto para sua API e de 10 para todo o site, e é o mais baixo que governa: as requisições partem uma a uma com pelo menos seis segundos entre elas, e o piso de três segundos se mantém independentemente da configuração. O User-Agent termina sempre com a identidade do projeto e um endereço para contato.

Cada resultado carrega o endereço da página de onde foi lido. A Library of Congress é uma instituição pública, e seus registros declaram seus próprios direitos.

Este MCP é um projeto não oficial, sem afiliação à Library of Congress.

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 www.loc.gov e chroniclingamerica.loc.gov, 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 a própria biblioteca.

Contribuindo

Anomalias, perguntas e ideias têm seu lugar em o rastreador de incidentes. Propostas de modificação são bem-vindas; abrir um ticket primeiro ajuda a alinhar a forma da mudança. Veja CONTRIBUTING.md.

Licença

MIT, veja LICENSE. As notícias pertencem à Library of Congress e aos depositantes por ela designados, sob os direitos que cada notícia estabelece.