data.bnf.fr
Busca en el catálogo abierto de la BnF: autores, obras, ediciones y enlaces a lo digitalizado.
Documentación
mcp-databnf
data.bnf.fr es el servicio de datos abiertos de la Bibliothèque nationale de France. Publica los registros de autoridad que mantiene la biblioteca nacional: las personas que cataloga, con sus fechas, sus lugares, sus idiomas y sus campos de actividad; las obras que escribieron, con las ediciones en las que se publicó cada obra; y los enlaces a las copias digitalizadas en Gallica. Un registro indica si la biblioteca lo considera establecido o aún provisional.
Este servidor conecta un cliente de chat con ese servicio. Puedes buscar un autor o una obra por nombre, leer un registro completo, listar lo que escribió un autor, listar las ediciones de una obra y encontrar las copias digitalizadas asociadas a cualquiera de ellos. No necesita clave API ni cuenta.
Instalación
Instalación en un clic
Claude Code
claude mcp add databnf -- npx -y mcp-databnf
Claude Desktop, Cursor y cualquier cliente que use el formato de configuración estándar
{
"mcpServers": {
"databnf": {
"command": "npx",
"args": ["-y", "mcp-databnf"]
}
}
}
Se requiere Node 24 o posterior, y no es necesario establecer ninguna variable de entorno.
Con Docker
{
"mcpServers": {
"databnf": {
"command": "docker",
"args": ["run", "-i", "--rm", "ghcr.io/smeet666/mcp-databnf:2.1.2"]
}
}
}
-i mantiene abierta la entrada estándar, que es por donde viaja el protocolo, y -t se omite
porque una TTY reescribe el flujo. El contenedor necesita HTTPS saliente hacia
data.bnf.fr, y nada más: sin volumen, sin puerto, sin credenciales.
Paquete, sin npm
Descarga mcp-databnf-2.1.2.mcpb desde
la última versión y
ábrelo. Un cliente que admita paquetes MCP lo instala por sí solo, sin npm
y sin archivo de configuración que editar. El paquete incluye sus dependencias, por lo que
no se descarga nada en el momento de la instalación.
Lo que puedes preguntar
- « 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?"
El camino habitual va de una búsqueda a un registro: una fila lleva un id, y
get_author o get_work lo lee.
Herramientas
| Herramienta | Qué hace |
|---|---|
search_authors | Encuentra personas por nombre en los registros de autoridad. |
get_author | Lee el registro completo de una persona. |
search_works | Encuentra obras por título. |
get_work | Lee el registro completo de una obra. |
list_works | Lista las obras atribuidas a una persona. |
list_editions | Lista las ediciones de una obra. |
find_digitised | Encuentra las copias digitalizadas en Gallica de una persona u obra. |
search_authors
Encuentra personas por nombre en los registros de autoridad.
| Argumento | Tipo | Obligatorio | Qué hace |
|---|---|---|---|
name | cadena, de 1 a 200 caracteres | sí | El nombre a buscar. |
limit | entero, de 1 a 50, por defecto 10 | no | Filas a devolver. |
page | entero, de 1 a 100, por defecto 1 | no | Qué página de filas. |
A cambio: authors, cada una con id, que get_author, list_works
y find_digitised toman; name tal como lo escribe el servicio; label, el
encabezamiento de autoridad, normalmente con las fechas; birth_year y death_year, null
cuando el registro no indica ninguno; role; y source_url. words_searched indica
lo que se envió realmente, has_more si existen más páginas, y
index_window_full que el índice ha servido todo lo que servirá para esta
búsqueda.
get_author
Lee el registro completo de una persona.
| Argumento | Tipo | Obligatorio | Qué hace |
|---|---|---|---|
author_id | cadena, de 1 a 200 caracteres | sí | El identificador que lleva una fila. |
include_depictions | booleano, por defecto false | no | Añade los retratos a los que apunta el registro. |
A cambio: la persona con name, label, given_name, family_name,
other_names, birth_date y death_date tal como se publican, birth_year y
death_year como números, birth_place, death_place,
biographical_information, occupation, languages como códigos ISO 639-2,
countries y fields con las palabras del registro. Un campo que el registro deja vacío
es null.
search_works
Encuentra obras por título.
| Argumento | Tipo | Obligatorio | Qué hacer |
|---|---|---|---|
title | cadena, de 1 a 200 caracteres | sí | Las palabras del título a buscar. |
limit | entero, de 1 a 50, por defecto 10 | no | Filas a devolver. |
page | entero, de 1 a 100, por defecto 1 | no | Qué página de filas. |
A cambio: works, cada una con id, que get_work, list_editions y
find_digitised toman; title; date, el año que el registro da para la obra, tal como
se publica; creators; status, que lee established o provisional; y
source_url. El sobre lleva los mismos words_searched, has_more y
index_window_full que una búsqueda de personas.
get_work
Lee el registro completo de una obra.
| Argumento | Tipo | Obligatorio | Qué hacer |
|---|---|---|---|
work_id | cadena, de 1 a 200 caracteres | sí | El identificador que lleva una fila. |
include_depictions | booleano, por defecto false | no | Añade las ilustraciones a las que apunta el registro. |
A cambio: la obra con title, label, date tal como se publica, first_year,
creators como { id, name }, languages, forms, subjects y
dewey_classes con las palabras del registro, expression_count, same_as para los
registros con los que la BnF la alinea, y catalogue_url. status lee
established o provisional, y status_statement indica lo que la biblioteca
quiere decir con ello: un registro provisional es uno que la biblioteca no ha terminado de comprobar.
list_works
Lista las obras atribuidas a una persona.
| Argumento | Tipo | Obligatorio | Qué hace |
|---|---|---|---|
author_id | cadena, de 1 a 200 caracteres | sí | El identificador de la persona. |
limit | entero, de 1 a 50, por defecto 10 | no | Filas a devolver. |
page | entero, de 1 a 100, por defecto 1 | no | Qué página de filas. |
A cambio: works, cada una con id, title, date tal como se publica, year
como número cuando el registro lo tiene, forms, status y source_url, con
has_more para continuar.
list_editions
Lista las ediciones de una obra.
| Argumento | Tipo | Obligatorio | Qué hace |
|---|---|---|---|
work_id | cadena, de 1 a 200 caracteres | sí | El identificador de la obra. |
limit | entero, de 1 a 50, por defecto 10 | no | Filas a devolver. |
page | entero, de 1 a 100, por defecto 1 | no | Qué página de filas. |
A cambio: editions, cada una con su propio id en el catálogo de la BnF, el
title que lleva esta edición, date y year, publisher, place,
edition_statement, extent, isbn, note tal como lo escribió el catalogador,
catalogue_url, digitised y source_url. Un campo que el registro deja vacío es
null.
find_digitised
Encuentra las copias digitalizadas en Gallica asociadas a una persona u obra.
| Argumento | Tipo | Obligatorio | Qué hace |
|---|---|---|---|
id | cadena, de 1 a 200 caracteres | sí | El identificador de una persona o de una obra. |
kind | auto, person o work, por defecto auto | no | Qué representa el identificador. |
limit | entero, de 1 a 200, por defecto 40 | no | Enlaces a devolver. |
A cambio: kind, que indica cómo clasifica el catálogo el registro, y links,
cada una con el ark de Gallica, su url, su rendering y el role que la
persona tiene sobre él. links_returned_by_role los cuenta por función. Este servidor
describe un documento digitalizado y nunca lo abre.
Registros establecidos y provisionales
Un registro lleva un status. established significa que la biblioteca lo ha comprobado;
provisional significa que no ha terminado, y status_statement lo indica con las
palabras de la propia biblioteca. Indica el estado junto con cualquier dato tomado de un
registro provisional.
La licencia y lo que pide
La BnF establece una condición sobre estos metadatos:
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.
El uso es gratuito, siempre que se mencione la fuente y se indique la fecha de
recuperación. Cada respuesta lleva retrieved_at en su contenido y termina su texto con
la fuente y esa fecha. Una respuesta en caché indica el momento en que se leyó
originalmente, ya que fue entonces cuando se recuperó. Repite ambos datos siempre que se muestre
lo que has obtenido.
Configuración
Todas las variables son opcionales. Establécelas en el bloque env de la configuración de tu cliente.
| Variable | Valor por defecto | Qué hace |
|---|---|---|
BNF_USER_AGENT | la identidad del proyecto | Nombra su aplicación ante la BnF, con una dirección donde se pueda contactar a una persona. |
BNF_MIN_INTERVAL_MS | 3000 | Intervalo entre dos solicitudes, de 3000 a 120000. |
BNF_TIMEOUT_MS | 60000 | Plazo para una solicitud, de 1000 a 300000. |
BNF_MAX_RETRIES | 3 | Intentos tras un fallo transitorio, de 0 a 8. |
BNF_CACHE_TTL_MS | 900000 | Cuánto tiempo permanece una respuesta en memoria, de 0 a 86400000. |
BNF_CACHE_MAX_ENTRIES | 200 | Respuestas retenidas en memoria a la vez, de 1 a 5000. |
BNF_LOG_LEVEL | error | silent, error, info o debug, escritos en stderr. |
Un valor fuera de su rango vuelve al valor por defecto, y la razón se escribe en stderr.
Errores
Cada fallo lleva uno de seis códigos, un mensaje y, cuando ayuda, una pista que indica el siguiente paso.
| Código | Qué ocurrió | Qué hacer |
|---|---|---|
not_found | El servicio respondió y no tiene ese registro. | Verifique el identificador con search_authors o search_works. |
invalid_input | Los argumentos fueron rechazados antes de enviar cualquier solicitud. | Lea el mensaje, que nombra el argumento. |
rate_limited | El servicio pidió a este cliente que reduzca la velocidad. | Espere la cantidad de segundos que indica la pista y vuelva a llamar con los mismos argumentos. El registro sigue ahí. |
parse_failure | La respuesta llegó en un formato que este cliente no puede leer. | Repórtelo en el rastreador de incidencias. |
network_error | La solicitud no se completó. | Inténtelo de nuevo en breve. |
timeout | La solicitud superó su plazo. | Aumente BNF_TIMEOUT_MS, o solicite menos filas. |
Como biblioteca
La capa que lee el servicio se publica por separado, con su ritmo, su caché y sus errores, y sin ningún protocolo adjunto.
import { BnfClient } from "mcp-databnf/client";
const client = new BnfClient();
const { data, cached } = await client.getAuthor("cb11907966z");
console.log(data.label, cached);
getAuthor y getWork responden cada una a { data, cached }, y lanzan un error
que lleva uno de los seis códigos. El mínimo de tres segundos entre dos solicitudes
también se aplica aquí.
Ritmo y atribución
Las solicitudes salen de una en una con al menos tres segundos entre ellas, y ese
mínimo se mantiene sin importar cómo esté configurado el servidor. Cada pregunta se responde con una
consulta SPARQL contra un punto de acceso público que la BnF opera a su propio costo, por lo que
el intervalo es amplio y el plazo largo. El User-Agent siempre termina con
la identidad del proyecto y una dirección donde se pueda contactar a una persona.
Cada respuesta lleva la fuente y retrieved_at, que la licencia pide declarar
dondequiera que se muestren los metadatos.
Este servidor MCP es un proyecto no oficial, sin afiliación con la Bibliothèque nationale de France.
Privacidad
Este servidor no recopila nada sobre usted y no envía nada a su autor. Se ejecuta
en su máquina, contacta a data.bnf.fr y nada más, mantiene sus respuestas en memoria
mientras se ejecuta y no escribe nada en el disco.
PRIVACY.md indica qué lleva una solicitud y qué ajustes cambian
cualquier parte de ello.
Desarrollo
npm install
npm run build:fixtures
npm test
npm run check
Las pruebas se ejecutan contra datos de prueba generados y no hacen ninguna solicitud de red. La suite en vivo,
npm run test:live, hace una solicitud por ruta y se ejecuta cada noche contra el
propio servicio.
Contribuciones
Los errores, preguntas e ideas pertenecen a el rastreador de incidencias. Las solicitudes de extracción son bienvenidas; abrir una incidencia primero ayuda a acordar la forma del cambio. Consulte CONTRIBUTING.md.
Licencia
MIT, consulte LICENSE. Los metadatos pertenecen a la Bibliothèque nationale de France, de uso libre siempre que se indiquen la fuente y la fecha de recuperación.
mcp-databnf (francés)
data.bnf.fr es el servicio de datos abiertos de la Bibliothèque nationale de France. Publica los registros de autoridad que la biblioteca nacional mantiene: las personas que cataloga, con sus fechas, lugares, idiomas y áreas de actividad; las obras que han escrito, con las ediciones en las que cada obra ha aparecido; y los enlaces a los ejemplares digitalizados en Gallica. Un registro indica si la biblioteca lo considera establecido o aún provisional.
Este servidor conecta un cliente de conversación a este servicio. Se puede buscar un autor u obra por su nombre, leer un registro completo, listar lo que un autor ha escrito, listar las ediciones de una obra y encontrar los ejemplares digitalizados adjuntos a uno u otro. Sin clave de API, sin cuenta.
Instalación
Instalación en un clic
Claude Code
claude mcp add databnf -- npx -y mcp-databnf
Claude Desktop, Cursor y cualquier cliente con formato de configuración estándar
{
"mcpServers": {
"databnf": {
"command": "npx",
"args": ["-y", "mcp-databnf"]
}
}
}
Se requiere Node 24 o más reciente, y no es necesario configurar ninguna variable de entorno.
Con Docker
{
"mcpServers": {
"databnf": {
"command": "docker",
"args": ["run", "-i", "--rm", "ghcr.io/smeet666/mcp-databnf:2.1.2"]
}
}
}
-i mantiene la entrada estándar abierta, que es el canal del protocolo, y -t se
omite porque un TTY reescribe el flujo. El contenedor necesita acceso HTTPS
saliente a data.bnf.fr, y nada más: sin volúmenes, sin puertos, sin
identificadores.
Bundle, sin npm
Descargue mcp-databnf-2.1.2.mcpb desde
la última publicación
y ábralo. Un cliente que gestiona bundles MCP lo instala solo, sin npm y
sin archivo de configuración que modificar. El bundle incluye sus dependencias, por lo que
nada se descarga en la instalación.
Qué se puede pedir
- «¿Qué dice la BnF sobre Colette?»
- «Lista todo lo que escribió Marguerite Duras.»
- «¿Qué ediciones de esta obra conserva la biblioteca?»
- «¿Hay alguna digitalizada en Gallica?»
- «¿Este registro es establecido o provisional?»
El camino habitual va de una búsqueda a un registro: una línea lleva un id, y
get_author o get_work lo lee.
Las herramientas
| Herramienta | Qué hace |
|---|---|
search_authors | Encuentra personas por su nombre en los registros de autoridad. |
get_author | Lee el registro completo de una persona. |
search_works | Encuentra obras por su título. |
get_work | Lee el registro completo de una obra. |
list_works | Lista las obras atribuidas a una persona. |
list_editions | Lista las ediciones de una obra. |
find_digitised | Encuentra los ejemplares digitalizados en Gallica de una persona o una obra. |
search_authors
Encuentra personas por su nombre en los registros de autoridad.
| Argumento | Tipo | Requerido | Qué hace |
|---|---|---|---|
name | cadena, de 1 a 200 caracteres | sí | El nombre buscado. |
limit | entero, de 1 a 50, por defecto 10 | no | Líneas a servir. |
page | entero, de 1 a 100, por defecto 1 | no | Qué página de líneas. |
En respuesta: authors, cada una con id, que get_author, list_works y
find_digitised retoman; name tal como lo escribe el servicio; label, el
encabezado de autoridad, generalmente con las fechas; birth_year y death_year,
null donde el registro no lo indica; role; y source_url.
words_searched dice qué se envió realmente, has_more si existen
otras páginas, y index_window_full que el índice ha servido todo lo que servirá
para esta búsqueda.
get_author
Lee el registro completo de una persona.
| Argumento | Tipo | Requerido | Qué hace |
|---|---|---|---|
author_id | cadena, de 1 a 200 caracteres | sí | El identificador que lleva una línea. |
include_depictions | booleano, por defecto false | no | Añade los retratos a los que apunta el registro. |
En respuesta: la persona con name, label, given_name, family_name,
other_names, birth_date y death_date tal como se publican, birth_year y
death_year en números, birth_place, death_place,
biographical_information, occupation, languages en códigos ISO 639-2,
countries y fields en las palabras del registro. Un campo que el registro deja
vacío vale null.
search_works
Encuentra obras por su título.
| Argumento | Tipo | Requerido | Qué hace |
|---|---|---|---|
title | cadena, de 1 a 200 caracteres | sí | Las palabras del título buscado. |
limit | entero, de 1 a 50, por defecto 10 | no | Líneas a servir. |
page | entero, de 1 a 100, por defecto 1 | no | Qué página de líneas. |
En respuesta: works, cada una con id, que get_work, list_editions y
find_digitised retoman; title; date, el año que el registro da a la
obra, tal como se publica; creators; status, que vale established o
provisional; y source_url. El envoltorio lleva los mismos words_searched,
has_more y index_window_full que una búsqueda de personas.
get_work
Lee el registro completo de una obra.
| Argumento | Tipo | Requerido | Qué hace |
|---|---|---|---|
work_id | cadena, de 1 a 200 caracteres | sí | El identificador que lleva una línea. |
include_depictions | booleano, por defecto false | no | Añade las ilustraciones a las que apunta el registro. |
En retour : l'œuvre avec title, label, date telle que publiée, | |||
first_year, creators en { id, name }, languages, forms, subjects et | |||
dewey_classes dans les mots de la notice, expression_count, same_as pour | |||
les registres auxquels la BnF l'aligne, et catalogue_url. status vaut | |||
established ou provisional, et status_statement dit ce que la bibliothèque | |||
| entend par là : une notice provisoire est une notice qu'elle n'a pas fini de | |||
| vérifier. |
list_works
Liste les œuvres attribuées à une personne.
| Argument | Type | Requis | Ce qu'il fait |
|---|---|---|---|
author_id | chaîne, 1 à 200 caractères | oui | L'identifiant de la personne. |
limit | entier, 1 à 50, défaut 10 | non | Lignes à servir. |
page | entier, 1 à 100, défaut 1 | non | Quelle page de lignes. |
En retour : works, chacune portant id, title, date telle que publiée,
year en nombre quand la notice en a un, forms, status et source_url, avec
has_more pour poursuivre.
list_editions
Liste les éditions d'une œuvre.
| Argument | Type | Requis | Ce qu'il fait |
|---|---|---|---|
work_id | chaîne, 1 à 200 caractères | oui | L'identifiant de l'œuvre. |
limit | entier, 1 à 50, défaut 10 | non | Lignes à servir. |
page | entier, 1 à 100, défaut 1 | non | Quelle page de lignes. |
En retour : editions, chacune portant son propre id au catalogue de la
BnF, le title que cette édition porte, date et year, publisher, place,
edition_statement, extent, isbn, note telle que le catalogueur l'a
écrite, catalogue_url, digitised et source_url. Un champ que la notice
laisse vide vaut null.
find_digitised
Trouve les exemplaires numérisés dans Gallica attachés à une personne ou à une œuvre.
| Argument | Type | Requis | Ce qu'il fait |
|---|---|---|---|
id | chaîne, 1 à 200 caractères | oui | L'identifiant d'une personne ou d'une œuvre. |
kind | auto, person ou work, défaut auto | non | Ce que l'identifiant désigne. |
limit | entier, 1 à 200, défaut 40 | non | Liens à servir. |
En retour : kind, qui dit de quel type le catalogue tient la notice, et
links, chacun portant l'ark Gallica, son url, son rendering et le role
que la personne y tient. links_returned_by_role les compte par rôle. Ce serveur
décrit un document numérisé et n'en ouvre jamais aucun.
Notices établies et provisoires
Une notice porte un status. established signifie que la bibliothèque l'a
vérifiée ; provisional qu'elle ne l'a pas terminée, et status_statement le
dit dans ses propres mots. Rapportez ce statut à côté de tout ce qui vient d'une
notice provisoire.
La licence, et ce qu'elle demande
La BnF pose une condition sur ces métadonnées :
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.
Chaque réponse porte retrieved_at dans sa charge utile et termine son texte par
la source et cette date. Une réponse servie depuis le cache rapporte le moment où
elle a été lue à l'origine, puisque c'est sa date de récupération. Redonnez les
deux partout où ce que vous avez obtenu est montré.
Configuration
Chaque variable est facultative. Elles se posent dans le bloc env de la
configuration du client.
| Variable | Défaut | Ce qu'elle fait |
|---|---|---|
BNF_USER_AGENT | l'identité du projet | Nomme votre application auprès de la BnF, avec une adresse où joindre une personne. |
BNF_MIN_INTERVAL_MS | 3000 | Écart entre deux requêtes, de 3000 à 120000. |
BNF_TIMEOUT_MS | 60000 | Délai d'une requête, de 1000 à 300000. |
BNF_MAX_RETRIES | 3 | Tentatives après un échec passager, de 0 à 8. |
BNF_CACHE_TTL_MS | 900000 | Durée pendant laquelle une réponse reste en mémoire, de 0 à 86400000. |
BNF_CACHE_MAX_ENTRIES | 200 | Réponses gardées en mémoire à la fois, de 1 à 5000. |
BNF_LOG_LEVEL | error | silent, error, info ou debug, écrit sur la sortie d'erreur. |
Une valeur hors de sa plage retombe sur le défaut, et la raison est écrite sur la sortie d'erreur.
Erreurs
Chaque échec porte un des six codes, un message, et quand cela aide une indication du geste suivant.
| Code | Ce qui s'est passé | Que faire |
|---|---|---|
not_found | Le service a répondu, et n'a pas cette notice. | Vérifiez l'identifiant avec search_authors ou search_works. |
invalid_input | Les arguments ont été refusés avant toute requête. | Lisez le message, qui nomme l'argument. |
rate_limited | Le service demande à ce client de ralentir. | Attendez les secondes indiquées et rappelez avec les mêmes arguments. La notice est toujours là. |
parse_failure | La réponse est arrivée dans une forme illisible ici. | Signalez-le sur le suivi d'incidents. |
network_error | La requête n'a pas abouti. | Réessayez sous peu. |
timeout | La requête a dépassé son délai. | Augmentez BNF_TIMEOUT_MS, ou demandez moins de lignes. |
Comme bibliothèque
La couche qui lit le service est publiée seule, avec son rythme, son cache et ses erreurs, sans protocole attaché.
import { BnfClient } from "mcp-databnf/client";
const client = new BnfClient();
const { data, cached } = await client.getAuthor("cb11907966z");
console.log(data.label, cached);
getAuthor et getWork répondent chacun { data, cached }, et lèvent une
erreur portant un des six codes. Le plancher de trois secondes entre deux
requêtes tient également ici.
Rythme et attribution
Les requêtes partent une à une avec au moins trois secondes entre elles, et ce
plancher tient quelle que soit la configuration. Chaque question se résout par
une requête SPARQL contre un point d'accès public que la BnF fait tourner à ses
frais, d'où un intervalle large et un délai long. Le User-Agent se termine
toujours par l'identité du projet et une adresse où joindre une personne.
Chaque réponse porte la source et retrieved_at, que la licence demande
d'indiquer partout où les métadonnées sont montrées.
Ce MCP est un projet non officiel, sans affiliation à la Bibliothèque nationale de France.
Confidentialité
Ce serveur ne collecte rien sur vous et n'envoie rien à son auteur. Il tourne sur
votre machine, ne joint que data.bnf.fr, garde ses réponses en mémoire le temps qu'il
tourne, et n'écrit rien sur le disque. PRIVACY.md dit ce qu'une
requête emporte et quels réglages changent cela.
Développement
npm install
npm run build:fixtures
npm test
npm run check
Les tests s'exécutent sur des fixtures engendrées et n'émettent aucune requête.
La suite en direct, npm run test:live, émet une requête par route et tourne
chaque nuit contre le service lui-même.
Contribuer
Les anomalies, les questions et les idées ont leur place dans le suivi d'incidents. Les propositions de modification sont bienvenues ; ouvrir un ticket d'abord aide à s'accorder sur la forme du changement. Voir CONTRIBUTING.md.
Licence
MIT, voir LICENSE. Les métadonnées appartiennent à la Bibliothèque nationale de France, d'usage libre sous réserve d'indiquer la source et la date de récupération.