data.bnf.fr
Pesquise no catálogo aberto da BnF: autores, obras, edições e links para o que está digitalizado.
Documentação
mcp-databnf
data.bnf.fr é o serviço de dados abertos da Bibliothèque nationale de France. Ele publica os registros de autoridade que a biblioteca nacional mantém: as pessoas que ela cataloga, com suas datas, seus locais, suas línguas e seus campos de atividade; as obras que escreveram, com as edições em que cada obra foi publicada; e os links para as cópias digitalizadas na Gallica. Um registro indica se a biblioteca o considera estabelecido ou ainda provisório.
Este servidor conecta um cliente de chat a esse serviço. Você pode pesquisar um autor ou uma obra pelo nome, ler um registro completo, listar o que um autor escreveu, listar as edições de uma obra e encontrar as cópias digitalizadas anexadas a qualquer um deles. Não requer chave de API nem conta.
Instalação
Instalação em um clique
Claude Code
claude mcp add databnf -- npx -y mcp-databnf
Claude Desktop, Cursor e qualquer cliente que use o formato de configuração padrão
{
"mcpServers": {
"databnf": {
"command": "npx",
"args": ["-y", "mcp-databnf"]
}
}
}
Node 24 ou posterior é necessário, e nenhuma variável de ambiente precisa ser definida.
Com Docker
{
"mcpServers": {
"databnf": {
"command": "docker",
"args": ["run", "-i", "--rm", "ghcr.io/smeet666/mcp-databnf:2.1.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
data.bnf.fr, e nada mais: sem volume, sem porta, sem credencial.
Pacote, sem npm
Baixe mcp-databnf-2.1.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
- « Que dit la BnF de Colette ? »
- "List everything Marguerite Duras wrote."
- "Which editions of that work does the library hold?"
- "Are any of them digitised in Gallica?"
- "When was that record last established?"
O caminho comum vai de uma pesquisa a um registro: uma linha carrega um id, e
get_author ou get_work o lê.
Ferramentas
| Ferramenta | O que faz |
|---|---|
search_authors | Encontra pessoas pelo nome nos registros de autoridade. |
get_author | Lê o registro completo de uma pessoa. |
search_works | Encontra obras pelo título. |
get_work | Lê o registro completo de uma obra. |
list_works | Lista as obras atribuídas a uma pessoa. |
list_editions | Lista as edições de uma obra. |
find_digitised | Encontra as cópias digitalizadas na Gallica para uma pessoa ou uma obra. |
search_authors
Encontra pessoas pelo nome nos registros de autoridade.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
name | string, 1 a 200 caracteres | sim | O nome a procurar. |
limit | inteiro, 1 a 50, padrão 10 | não | Linhas a fornecer. |
page | inteiro, 1 a 100, padrão 1 | não | Qual página de linhas. |
Em retorno: authors, cada uma carregando id, que get_author, list_works
e find_digitised aceitam; name como o serviço o escreve; label, o
cabeçalho de autoridade, geralmente com as datas; birth_year e death_year, null
onde o registro não declara nenhum; role; e source_url. words_searched diz
o que foi realmente enviado, has_more se existem mais páginas, e
index_window_full que o índice forneceu tudo o que fornecerá para esta
pesquisa.
get_author
Lê o registro completo de uma pessoa.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
author_id | string, 1 a 200 caracteres | sim | O identificador que uma linha carrega. |
include_depictions | booleano, padrão false | não | Adiciona os retratos aos quais o registro aponta. |
Em retorno: a pessoa com name, label, given_name, family_name,
other_names, birth_date e death_date como publicados, birth_year e
death_year como números, birth_place, death_place,
biographical_information, occupation, languages como códigos ISO 639-2,
countries e fields nas palavras do registro. Um campo que o registro deixa vazio
é null.
search_works
Encontra obras pelo título.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
title | string, 1 a 200 caracteres | sim | As palavras do título a procurar. |
limit | inteiro, 1 a 50, padrão 10 | não | Linhas a fornecer. |
page | inteiro, 1 a 100, padrão 1 | não | Qual página de linhas. |
Em retorno: works, cada uma carregando id, que get_work, list_editions e
find_digitised aceitam; title; date, o ano que o registro dá para a obra, como
publicado; creators; status, lendo established ou provisional; e
source_url. O envelope carrega os mesmos words_searched, has_more e
index_window_full que uma pesquisa de pessoas retorna.
get_work
Lê o registro completo de uma obra.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
work_id | string, 1 a 200 caracteres | sim | O identificador que uma linha carrega. |
include_depictions | booleano, padrão false | não | Adiciona as ilustrações às quais o registro aponta. |
Em retorno: a obra com title, label, date como publicados, first_year,
creators como { id, name }, languages, forms, subjects e
dewey_classes nas palavras do registro, expression_count, same_as para os
registros com os quais a BnF a alinha, e catalogue_url. status lê
established ou provisional, e status_statement diz o que a biblioteca
quer dizer com isso: um registro provisório é um que a biblioteca ainda não terminou de verificar.
list_works
Lista as obras atribuídas a uma pessoa.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
author_id | string, 1 a 200 caracteres | sim | O identificador da pessoa. |
limit | inteiro, 1 a 50, padrão 10 | não | Linhas a fornecer. |
page | inteiro, 1 a 100, padrão 1 | não | Qual página de linhas. |
Em retorno: works, cada uma carregando id, title, date como publicados, year
como um número onde o registro tem um, forms, status e source_url, com
has_more para continuar.
list_editions
Lista as edições de uma obra.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
work_id | string, 1 a 200 caracteres | sim | O identificador da obra. |
limit | inteiro, 1 a 50, padrão 10 | não | Linhas a fornecer. |
page | inteiro, 1 a 100, padrão 1 | não | Qual página de linhas. |
Em retorno: editions, cada uma carregando seu próprio id no catálogo da BnF, o
title que esta edição carrega, date e year, publisher, place,
edition_statement, extent, isbn, note como o catalogador o escreveu,
catalogue_url, digitised e source_url. Um campo que o registro deixa vazio é
null.
find_digitised
Encontra as cópias digitalizadas na Gallica anexadas a uma pessoa ou a uma obra.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
id | string, 1 a 200 caracteres | sim | O identificador de uma pessoa ou de uma obra. |
kind | auto, person ou work, padrão auto | não | O que o identificador representa. |
limit | inteiro, 1 a 200, padrão 40 | não | Links a fornecer. |
Em retorno: kind, dizendo como o catálogo classifica o registro, e links,
cada uma carregando o ark da Gallica, seu url, seu rendering e o role que a
pessoa detém sobre ele. links_returned_by_role os conta por função. Este servidor
descreve um documento digitalizado e nunca abre um.
Registros estabelecidos e provisórios
Um registro carrega um status. established significa que a biblioteca o verificou;
provisional significa que ela não terminou, e status_statement diz isso nas
próprias palavras da biblioteca. Informe o status junto com qualquer coisa retirada de um
registro provisório.
A licença e o que ela pede
A BnF estabelece uma condição sobre estes metadados:
L'utilisation de ces métadonnées est libre et gratuite sous réserve du maintien de la mention de leur source et de l'indication de leur date de récupération.
O uso é gratuito, desde que a fonte seja nomeada e a data de recuperação seja
declarada. Cada resposta carrega retrieved_at em seu payload e termina seu texto com
a fonte e essa data. Uma resposta em cache informa o momento em que foi originalmente
lida, pois é quando foi recuperada. Repita ambos sempre que o que você obteve for
exibido.
Configuração
Toda variável é opcional. Defina-as no bloco env da configuração do seu cliente.
| Variável | Padrão | O que faz |
|---|---|---|
BNF_USER_AGENT | a identidade do projeto | Nomeia seu aplicativo para a BnF, com um endereço onde uma pessoa pode ser contatada. |
BNF_MIN_INTERVAL_MS | 3000 | Intervalo entre duas solicitações, de 3000 a 120000. |
BNF_TIMEOUT_MS | 60000 | Prazo para uma solicitação, de 1000 a 300000. |
BNF_MAX_RETRIES | 3 | Tentativas após uma falha transitória, de 0 a 8. |
BNF_CACHE_TTL_MS | 900000 | Por quanto tempo uma resposta permanece na memória, de 0 a 86400000. |
BNF_CACHE_MAX_ENTRIES | 200 | Respostas mantidas na memória de uma vez, de 1 a 5000. |
BNF_LOG_LEVEL | error | silent, error, info ou debug, escritos em stderr. |
Um valor fora do intervalo cai para o padrão, e o motivo é escrito em stderr.
Erros
Cada falha carrega um de 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 | O serviço respondeu e não possui tal registro. | Verifique o identificador com search_authors ou search_works. |
invalid_input | Os argumentos foram recusados antes de qualquer solicitação ser enviada. | Leia a mensagem, que nomeia o argumento. |
rate_limited | O serviço 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_failure | A 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 BNF_TIMEOUT_MS, ou peça menos linhas. |
Como biblioteca
A camada que lê o serviço é publicada separadamente, com seu ritmo, seu cache e seus erros, e sem protocolo anexado.
import { BnfClient } from "mcp-databnf/client";
const client = new BnfClient();
const { data, cached } = await client.getAuthor("cb11907966z");
console.log(data.label, cached);
getAuthor e getWork cada um responde a { data, cached }, e lançam um erro
carregando um dos seis códigos. O piso de três segundos entre duas solicitações também
vale aqui.
Ritmo e atribuição
As solicitações saem uma de cada vez com pelo menos três segundos entre elas, e esse
piso vale independentemente de como o servidor está configurado. Cada pergunta é respondida por uma
consulta SPARQL contra um endpoint público que a BnF opera às suas próprias custas, por isso
o intervalo é amplo e o prazo longo. O User-Agent sempre termina com
a identidade do projeto e um endereço onde uma pessoa pode ser contatada.
Cada resposta carrega a fonte e retrieved_at, que a licença pede que sejam
declarados onde quer que os metadados sejam exibidos.
Este servidor MCP é um projeto não oficial, sem afiliação com a Bibliothèque nationale de France.
Privacidade
Este servidor não coleta nada sobre você e não envia nada ao autor. Ele roda
na sua máquina, contata 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 o
próprio serviço.
Contribuindo
Bugs, perguntas e ideias pertencem a o rastreador de problemas. Pull requests são bem-vindos; abrir uma issue primeiro ajuda a concordar sobre a forma da mudança. Veja CONTRIBUTING.md.
Licença
MIT, veja LICENSE. Os metadados pertencem à Bibliothèque nationale de France, livres para uso desde que a fonte e a data de recuperação sejam declaradas.
mcp-databnf (francês)
data.bnf.fr é o serviço de dados abertos da Bibliothèque nationale de France. Ele publica os registros de autoridade que a biblioteca nacional mantém: as pessoas que ela cataloga, com suas datas, seus lugares, suas línguas e seus domínios de atividade; as obras que elas escreveram, com as edições em que cada obra apareceu; e os links para os exemplares digitalizados na Gallica. Um registro indica se a biblioteca o considera estabelecido ou ainda provisório.
Este servidor conecta um cliente de conversa a esse serviço. Pode-se buscar um autor ou uma obra pelo nome, ler um registro inteiro, listar o que um autor escreveu, listar as edições de uma obra e encontrar os exemplares digitalizados ligados a um ou outro. Nenhuma chave de API, nenhuma conta.
Instalação
Instalação em um clique
Claude Code
claude mcp add databnf -- npx -y mcp-databnf
Claude Desktop, Cursor e qualquer cliente no formato de configuração padrão
{
"mcpServers": {
"databnf": {
"command": "npx",
"args": ["-y", "mcp-databnf"]
}
}
}
Node 24 ou mais recente é necessário, e nenhuma variável de ambiente precisa ser preenchida.
Com Docker
{
"mcpServers": {
"databnf": {
"command": "docker",
"args": ["run", "-i", "--rm", "ghcr.io/smeet666/mcp-databnf:2.1.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 data.bnf.fr, e nada mais: nenhum volume, nenhuma porta, nenhum
identificador.
Bundle, sem npm
Baixe mcp-databnf-2.1.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, então
nada é baixado na instalação.
O que se pode pedir
- « O que a BnF diz sobre Colette? »
- « Liste tudo o que Marguerite Duras escreveu. »
- « Quais edições desta obra a biblioteca conserva? »
- « Há alguma digitalizada na Gallica? »
- « Este registro é estabelecido ou provisório? »
O caminho comum vai de uma busca a um registro: uma linha carrega um id, e
get_author ou get_work a lê.
As ferramentas
| Ferramenta | O que faz |
|---|---|
search_authors | Encontra pessoas pelo nome nos registros de autoridade. |
get_author | Lê o registro de uma pessoa inteiro. |
search_works | Encontra obras pelo título. |
get_work | Lê o registro de uma obra inteiro. |
list_works | Lista as obras atribuídas a uma pessoa. |
list_editions | Lista as edições de uma obra. |
find_digitised | Encontra os exemplares digitalizados na Gallica de uma pessoa ou de uma obra. |
search_authors
Encontra pessoas pelo nome nos registros de autoridade.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
name | string, 1 a 200 caracteres | sim | O nome procurado. |
limit | inteiro, 1 a 50, padrão 10 | não | Linhas a servir. |
page | inteiro, 1 a 100, padrão 1 | não | Qual página de linhas. |
Em retorno: authors, cada um carregando id, que get_author, list_works e
find_digitised retomam; name tal como o serviço o escreve; label, o
cabeçalho de autoridade, geralmente com as datas; birth_year e death_year,
null onde o registro não indica; role; e source_url.
words_searched diz o que foi realmente enviado, has_more se existem
outras páginas, e index_window_full que o índice serviu tudo o que servirá
para esta busca.
get_author
Lê o registro de uma pessoa inteiro.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
author_id | string, 1 a 200 caracteres | sim | O identificador que uma linha carrega. |
include_depictions | booleano, padrão false | não | Adiciona os retratos para os quais o registro aponta. |
Em retorno: a pessoa com name, label, given_name, family_name,
other_names, birth_date e death_date tais como publicados, birth_year e
death_year em números, birth_place, death_place,
biographical_information, occupation, languages em códigos ISO 639-2,
countries e fields nas palavras do registro. Um campo que o registro deixa
vazio vale null.
search_works
Encontra obras pelo título.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
title | string, 1 a 200 caracteres | sim | As palavras do título procurado. |
limit | inteiro, 1 a 50, padrão 10 | não | Linhas a servir. |
page | inteiro, 1 a 100, padrão 1 | não | Qual página de linhas. |
Em retorno: works, cada uma carregando id, que get_work, list_editions e
find_digitised retomam; title; date, o ano que o registro dá à
obra, tal como publicado; creators; status, valendo established ou
provisional; e source_url. O envelope carrega os mesmos words_searched,
has_more e index_window_full que uma busca de pessoas.
get_work
Lê o registro de uma obra inteiro.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
work_id | string, 1 a 200 caracteres | sim | O identificador que uma linha carrega. |
include_depictions | booleano, padrão false | não | Adiciona as ilustrações para as quais o registro aponta. |
Em retorno: a obra com title, label, date tal como publicada, | |||
first_year, creators em { id, name }, languages, forms, subjects e | |||
dewey_classes nas palavras do registro, expression_count, same_as para | |||
os registros aos quais a BnF a alinha, e catalogue_url. status vale | |||
established ou provisional, e status_statement diz o que a biblioteca | |||
| entende por isso: um registro provisório é um registro que ela não terminou de | |||
| verificar. |
list_works
Lista as obras atribuídas a uma pessoa.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
author_id | string, 1 a 200 caracteres | sim | O identificador da pessoa. |
limit | inteiro, 1 a 50, padrão 10 | não | Linhas a servir. |
page | inteiro, 1 a 100, padrão 1 | não | Qual página de linhas. |
Em retorno: works, cada uma com id, title, date tal como publicada,
year em número quando o registro tem um, forms, status e source_url, com
has_more para continuar.
list_editions
Lista as edições de uma obra.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
work_id | string, 1 a 200 caracteres | sim | O identificador da obra. |
limit | inteiro, 1 a 50, padrão 10 | não | Linhas a servir. |
page | inteiro, 1 a 100, padrão 1 | não | Qual página de linhas. |
Em retorno: editions, cada uma com seu próprio id no catálogo da
BnF, o title que essa edição carrega, date e year, publisher, place,
edition_statement, extent, isbn, note tal como o catalogador a
escreveu, catalogue_url, digitised e source_url. Um campo que o registro
deixa vazio vale null.
find_digitised
Encontra os exemplares digitalizados na Gallica ligados a uma pessoa ou a uma obra.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
id | string, 1 a 200 caracteres | sim | O identificador de uma pessoa ou de uma obra. |
kind | auto, person ou work, padrão auto | não | O que o identificador designa. |
limit | inteiro, 1 a 200, padrão 40 | não | Links a servir. |
Em retorno: kind, que diz de que tipo o catálogo considera o registro, e
links, cada um com o ark Gallica, seu url, seu rendering e o role
que a pessoa tem nele. links_returned_by_role os conta por papel. Este servidor
descreve um documento digitalizado e nunca abre nenhum.
Registros estabelecidos e provisórios
Um registro carrega um status. established significa que a biblioteca o
verificou; provisional que ela não o terminou, e status_statement o
diz em suas próprias palavras. Relate esse status ao lado de tudo o que vier de um
registro provisório.
A licença, e o que ela pede
A BnF impõe uma condição sobre estes metadados:
O uso destes metadados é livre e gratuito, desde que seja mantida a menção de sua fonte e a indicação de sua data de recuperação.
Cada resposta carrega retrieved_at em sua carga útil e termina seu texto com
a fonte e essa data. Uma resposta servida do cache reporta o momento em que
foi lida originalmente, já que essa é sua data de recuperação. Reproduza os
dois em todos os lugares onde o que você obteve for exibido.
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 |
|---|---|---|
BNF_USER_AGENT | a identidade do projeto | Nomeia sua aplicação junto à BnF, com um endereço para contato. |
BNF_MIN_INTERVAL_MS | 3000 | Intervalo entre duas requisições, de 3000 a 120000. |
BNF_TIMEOUT_MS | 60000 | Tempo limite de uma requisição, de 1000 a 300000. |
BNF_MAX_RETRIES | 3 | Tentativas após uma falha temporária, de 0 a 8. |
BNF_CACHE_TTL_MS | 900000 | Duração durante a qual uma resposta permanece em memória, de 0 a 86400000. |
BNF_CACHE_MAX_ENTRIES | 200 | Respostas mantidas em memória por vez, de 1 a 5000. |
BNF_LOG_LEVEL | error | silent, error, info ou debug, escrito na saída de erro. |
Um valor fora de sua faixa recai 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 | O serviço respondeu e não tem esse registro. | Verifique o identificador com search_authors ou search_works. |
invalid_input | Os argumentos foram recusados antes de qualquer requisição. | Leia a mensagem, que nomeia o argumento. |
rate_limited | O serviço pede que este cliente desacelere. | Aguarde os segundos indicados e chame novamente com os mesmos argumentos. O registro continua lá. |
parse_failure | A resposta chegou em um formato ilegível aqui. | Reporte em o rastreador de incidentes. |
network_error | A requisição não foi concluída. | Tente novamente em breve. |
timeout | A requisição excedeu seu tempo limite. | Aumente BNF_TIMEOUT_MS, ou peça menos linhas. |
Como biblioteca
A camada que lê o serviço é publicada sozinha, com seu ritmo, seu cache e seus erros, sem protocolo anexado.
import { BnfClient } from "mcp-databnf/client";
const client = new BnfClient();
const { data, cached } = await client.getAuthor("cb11907966z");
console.log(data.label, cached);
getAuthor e getWork respondem cada um { data, cached }, e levantam um
erro com um dos seis códigos. O piso de três segundos entre duas
requisições também vale aqui.
Ritmo e atribuição
As requisições saem uma a uma com pelo menos três segundos entre elas, e esse
piso vale independentemente da configuração. Cada pergunta se resolve com
uma requisição SPARQL contra um ponto de acesso público que a BnF mantém às suas
custas, daí um intervalo amplo e um tempo limite longo. O User-Agent termina
sempre com a identidade do projeto e um endereço para contato.
Cada resposta carrega a fonte e retrieved_at, que a licença pede
para indicar em todos os lugares onde os metadados são exibidos.
Este MCP é um projeto não oficial, sem afiliação à Bibliothèque nationale de France.
Privacidade
Este servidor não coleta nada sobre você e não envia nada ao autor. Ele roda na
sua máquina, junta apenas data.bnf.fr, mantém suas respostas em memória enquanto roda,
e não grava nada no disco. PRIVACY.md diz o que uma
requisição carrega e quais ajustes mudam isso.
Desenvolvimento
npm install
npm run build:fixtures
npm test
npm run check
Os testes rodam sobre 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 o próprio serviço.
Contribuir
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. Os metadados pertencem à Bibliothèque nationale de France, de uso livre desde que a fonte e a data de recuperação sejam indicadas.