Gallica/BnF MCP Server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Gallica/BnF MCP Serversearch for documents by Victor Hugo"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Node.js MCP Server for Gallica/BnF
A high-quality TypeScript/Node.js MCP (Model Context Protocol) server for accessing the Gallica digital library of the Bibliothèque nationale de France (BnF). This server faithfully reproduces all functionality from the Python MCP server and extends it with additional features for IIIF images, OCR text, and item metadata.
Features
Core Search Tools (8 tools - matching Python)
search_by_title - Search documents by title with exact match option
search_by_author - Search documents by author with exact match option
search_by_subject - Search documents by subject with exact match option
search_by_date - Search documents by date (YYYY, YYYY-MM, or YYYY-MM-DD)
search_by_document_type - Search by document type (monographie, periodique, image, etc.)
advanced_search - Custom CQL query syntax for complex searches
natural_language_search - Natural language search across all fields
sequential_reporting - Multi-step sequential report generation with source management
Extended Tools (4 new tools)
get_item_details - Get full metadata for an item by ARK identifier
get_item_pages - Enumerate pages of a document with IIIF URLs
get_page_image - Generate IIIF image URLs for specific pages
get_page_text - Retrieve OCR/text content (ALTO, plain text)
Related MCP server: swiss-academic-libraries-mcp
Installation
Prerequisites
Node.js 18.0 or higher
npm or yarn
Steps
Clone or download this repository
Install dependencies:
cd node-mcp-bnf npm installBuild the project:
npm run build
Usage
Local Development
Option 1: HTTP Server (Recommended for Development)
Run the server on a local HTTP port for testing:
npm run dev:httpThis starts the server on http://localhost:3000 (or the port specified in PORT environment variable).
The server will:
Listen on the specified port
Accept MCP requests via HTTP/SSE
Log all activity to the console
You can test it by connecting an MCP client to http://localhost:3000/message.
Option 2: STDIO Mode (For MCP Clients)
The server can be used locally with Claude Desktop or Cursor MCP via STDIO.
Run in STDIO mode:
npm run devClaude Desktop Configuration
Add to your Claude Desktop configuration file (usually ~/Library/Application Support/Claude/claude_desktop_config.json on macOS):
{
"mcpServers": {
"gallica-bnf": {
"command": "node",
"args": ["/path/to/node-mcp-bnf/dist/index.js"],
"cwd": "/path/to/node-mcp-bnf"
}
}
}Cursor MCP Configuration
Add to your Cursor MCP settings:
{
"mcpServers": {
"gallica-bnf": {
"command": "node",
"args": ["/path/to/node-mcp-bnf/dist/index.js"]
}
}
}Development Scripts
npm run dev- Run in STDIO mode (for MCP clients like Cursor/Claude Desktop)npm run dev:http- Run HTTP server on local port (default: 3000)npm start- Run compiled STDIO versionnpm run start:http- Run compiled HTTP server version
Environment Variables for HTTP Server:
PORT- Port to listen on (default: 3000)LOG_LEVEL- Logging level (error, warn, info, debug)
Deployment on Vercel
Prerequisites
Vercel account
Vercel CLI installed (
npm i -g vercel)
Steps
Create
vercel.jsonin project root:{ "functions": { "src/httpServer.ts": { "runtime": "nodejs18.x" } }, "routes": [ { "src": "/(.*)", "dest": "src/httpServer.ts" } ] }Set environment variables in Vercel dashboard:
GALLICA_BASE_URL(optional, default:https://gallica.bnf.fr)GALLICA_SRU_URL(optional, default:https://gallica.bnf.fr/SRU)LOG_LEVEL(optional, default:info)MCP_ICON_URL(optional, absolute URL to icon - defaults to/icon.svgrelative to server URL)
Deploy:
vercel deployConfigure Cursor/Claude Desktop to use HTTP endpoint:
{ "mcpServers": { "gallica-bnf": { "url": "https://your-vercel-app.vercel.app" } } }
API Documentation
Search Tools
search_by_title
Search for documents by title.
Parameters:
title(string, required): The title to search forexact_match(boolean, optional): If true, search for exact titlemax_results(number, optional, default: 10): Maximum results (1-50)start_record(number, optional, default: 1): Starting record for pagination
Example:
{
"title": "Les Misérables",
"exact_match": false,
"max_results": 10
}search_by_author
Search for documents by author.
Parameters:
author(string, required): The author nameexact_match(boolean, optional): If true, search for exact author namemax_results(number, optional, default: 10)start_record(number, optional, default: 1)
search_by_subject
Search for documents by subject/keywords.
Parameters:
subject(string, required): The subject to search forexact_match(boolean, optional)max_results(number, optional, default: 10)start_record(number, optional, default: 1)
search_by_date
Search for documents by publication date.
Parameters:
date(string, required): Date in format YYYY, YYYY-MM, or YYYY-MM-DDmax_results(number, optional, default: 10)start_record(number, optional, default: 1)
Example:
{
"date": "1862",
"max_results": 20
}search_by_document_type
Search for documents by type.
Parameters:
doc_type(string, required): Document type (monographie, periodique, image, manuscrit, carte, musique, etc.)max_results(number, optional, default: 10)start_record(number, optional, default: 1)
advanced_search
Perform advanced search with custom CQL query.
Parameters:
query(string, required): CQL query stringmax_results(number, optional, default: 10)start_record(number, optional, default: 1)
Example:
{
"query": "dc.creator all \"Victor Hugo\" and dc.type all \"monographie\""
}natural_language_search
Natural language search across all fields.
Parameters:
query(string, required): Natural language search querymax_results(number, optional, default: 10)start_record(number, optional, default: 1)
Extended Tools
get_item_details
Get full metadata for an item.
Parameters:
ark(string, required): ARK identifier (e.g., "ark:/12148/bpt6k123456" or "bpt6k123456")
Returns:
Bibliographic data (title, creator, date, etc.)
Available formats (iiif, image, text, alto)
IIIF manifest URL
Gallica URL
get_item_pages
Enumerate pages of a document.
Parameters:
ark(string, required): ARK identifierpage(number, optional): Get specific page numberpage_size(number, optional): Get first N pagespage_range(array, optional): Get pages in range [start, end]
Returns:
Array of page info with:
Page number
Label
IIIF image URL
Text availability flag
Thumbnail URL
get_page_image
Get IIIF image URL for a specific page.
Parameters:
ark(string, required): ARK identifierpage(number, required): Page numbersize(string, optional): Image size (e.g., "full", "200,", "500,500")region(string, optional): Image region (e.g., "full", "x,y,w,h")
Returns:
IIIF image URL
Thumbnail URL
get_page_text
Retrieve OCR/text content for a page.
Parameters:
ark(string, required): ARK identifierpage(number, required): Page numberformat(string, optional): Text format ("plain", "alto", "tei")
Returns:
Text content (or null if not available)
Availability flag
Sequential Reporting Tool
sequential_reporting
Generate research reports in a sequential, step-by-step manner.
Workflow:
Initialize:
{ "topic": "Impressionnisme en France", "page_count": 4, "source_count": 10, "include_graphics": true }Search sources:
{ "search_sources": true }Create bibliography:
{ "section_number": 1, "total_sections": 8, "title": "Bibliography", "content": "...", "is_bibliography": true, "sources_used": [1, 2, 3], "next_section_needed": true }Write sections sequentially:
{ "section_number": 2, "total_sections": 8, "title": "Introduction", "content": "...", "sources_used": [1, 2], "next_section_needed": true }Complete report:
{ "section_number": 8, "total_sections": 8, "title": "Conclusion", "content": "...", "sources_used": [5, 6], "next_section_needed": false }
Configuration
Environment Variables
GALLICA_BASE_URL- Base URL for Gallica API (default:https://gallica.bnf.fr)GALLICA_SRU_URL- SRU search endpoint (default:https://gallica.bnf.fr/SRU)LOG_LEVEL- Logging level:error,warn,info,debug(default:info)HTTP_TIMEOUT- HTTP request timeout in milliseconds (default: 30000)HTTP_RETRIES- Maximum number of retry attempts (default: 3)DEFAULT_MAX_RECORDS- Default maximum search results (default: 10)DEFAULT_START_RECORD- Default starting record for pagination (default: 1)
Development
Project Structure
node-mcp-bnf/
├── src/
│ ├── index.ts # STDIO entry point
│ ├── httpServer.ts # HTTP entry point
│ ├── mcpServer.ts # MCP server setup
│ ├── config.ts # Configuration
│ ├── logging.ts # Logging utility
│ ├── tools/ # MCP tools
│ └── gallica/ # Gallica API clients
├── docs/ # Documentation
├── tests/ # Unit tests
└── package.jsonBuilding
npm run buildTesting
npm testDevelopment Mode
npm run devDocumentation
Python Architecture Analysis - Analysis of the original Python server
Gallica API Notes - Detailed API documentation
Node.js Architecture - Architecture and design of this server
License
MIT
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
Acknowledgments
Based on the Python MCP server by Kryzo
Uses the Model Context Protocol SDK
Built for the Gallica digital library of the Bibliothèque nationale de France
Available Tools
12 toolsadvanced_searchC
Perform an advanced search using custom CQL query syntax. Examples: dc.creator all "Victor Hugo" and dc.type all "monographie", dc.subject all "Paris" and dc.type all "carte", dc.language all "eng".
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Custom CQL query string | |
| max_results | No | Maximum number of results to return (1-50) | |
| start_record | No | Starting record for pagination |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It mentions 'advanced search' and provides CQL examples, but doesn't disclose important behavioral traits: whether this is read-only or has side effects, authentication requirements, rate limits, error handling, or what the search results contain. For a search tool with no annotation coverage, this leaves significant gaps in understanding its behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is appropriately concise with two sentences: a clear purpose statement followed by helpful examples. The examples are relevant and illustrate the tool's capability without being verbose. However, the structure could be improved by front-loading more critical information about when to use this versus other search tools.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (advanced search with custom query syntax), no annotations, and no output schema, the description is incomplete. It doesn't explain what the search returns, how results are structured, error conditions, or performance characteristics. For a tool that presumably returns search results, the lack of output information combined with minimal behavioral context makes this inadequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters thoroughly. The description doesn't add any parameter semantics beyond what's in the schema - it mentions CQL query syntax generally but doesn't provide additional details about the 'query' parameter format, constraints, or examples that go beyond the schema's 'Custom CQL query string' description. Baseline 3 is appropriate when schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the purpose: 'Perform an advanced search using custom CQL query syntax.' It specifies the verb ('perform an advanced search') and resource (search functionality), but doesn't explicitly differentiate from sibling tools like 'natural_language_search' or other search_by_* tools. The examples help illustrate the scope but don't provide explicit differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. With multiple sibling search tools (natural_language_search, search_by_author, search_by_date, etc.), there's no indication of when this advanced CQL search is preferred over simpler, more specific search tools. The examples show CQL syntax but don't establish usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_item_detailsA
Get full metadata for a Gallica item by its ARK identifier. Returns bibliographic data, available formats, and helpful URLs.
| Name | Required | Description | Default |
|---|---|---|---|
| ark | Yes | ARK identifier (e.g., "ark:/12148/bpt6k123456" or "bpt6k123456") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses the tool's behavior by specifying it returns 'bibliographic data, available formats, and helpful URLs', which gives useful context about output content. However, it doesn't mention potential limitations like rate limits, error conditions, or authentication needs, leaving gaps for a read operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose in the first sentence and adds specific return details in the second. Every sentence earns its place by providing essential information without waste, making it highly efficient and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's low complexity (single parameter, no output schema, no annotations), the description is mostly complete. It covers purpose, parameter context, and return types adequately. However, without annotations or output schema, it could benefit from more behavioral details like error handling or response structure to achieve full completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds meaning by clarifying the ARK identifier's role and providing example formats ('ark:/12148/bpt6k123456' or 'bpt6k123456'), which enhances the schema's 100% coverage. Since there's only one parameter, the baseline is 4, and the description effectively complements the schema without redundancy.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('Get full metadata'), resource ('a Gallica item'), and key identifier ('by its ARK identifier'). It distinguishes from siblings like get_item_pages or get_page_image by focusing on metadata rather than content or search operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when you have an ARK identifier and need metadata, but doesn't explicitly state when to use this tool versus alternatives like search tools (e.g., search_by_title) or when not to use it (e.g., for content retrieval). It provides basic context but lacks explicit guidance on alternatives or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_item_pagesB
Enumerate pages of a document. Returns logical page numbers, IIIF image URLs, and text availability flags.
| Name | Required | Description | Default |
|---|---|---|---|
| ark | Yes | ARK identifier | |
| page | No | Get specific page number | |
| page_size | No | Get first N pages | |
| page_range | No | Get pages in range [start, end] |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden for behavioral disclosure. While it states what the tool returns, it doesn't cover important aspects like whether this is a read-only operation (implied but not stated), potential rate limits, authentication requirements, error conditions, or pagination behavior for large documents. The description adds minimal behavioral context beyond the basic return statement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise with just two sentences that efficiently convey the core functionality and return values. Every word earns its place - the first sentence states the action and resource, the second specifies the return data structure. There's no wasted verbiage or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 4 parameters, no annotations, and no output schema, the description provides adequate but incomplete context. It explains what the tool does and what it returns, but lacks behavioral details (permissions, limits, errors) and parameter usage guidance. Given the complexity of having multiple pagination options (page, page_size, page_range) and no output schema, the description should do more to help an agent understand how to use it effectively.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage, so all parameters are documented in the schema. The description doesn't add any parameter-specific information beyond what's in the schema - it doesn't explain parameter interactions (e.g., that page, page_size, and page_range are mutually exclusive options) or provide usage examples. The baseline of 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('Enumerate pages'), the resource ('of a document'), and the return data ('logical page numbers, IIIF image URLs, and text availability flags'). It distinguishes from siblings like get_page_image (which fetches a single image) and get_page_text (which retrieves text content) by focusing on page-level metadata enumeration.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention when to choose get_item_pages over get_item_details (which might include page info) or get_page_image/get_page_text (for specific page content), nor does it specify prerequisites or exclusions for usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_page_imageA
Get IIIF image URL for a specific page. Returns URL and metadata, not binary data.
| Name | Required | Description | Default |
|---|---|---|---|
| ark | Yes | ARK identifier | |
| page | Yes | Page number | |
| size | No | Image size (e.g., "full", "200,", "500,500", "pct:50") | |
| region | No | Image region (e.g., "full", "x,y,w,h") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden. It discloses the return format (URL and metadata, not binary data) which is valuable behavioral context. However, it lacks details on authentication needs, rate limits, error conditions, or whether this is a read-only operation, leaving significant gaps in behavioral understanding.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise with just two sentences that are front-loaded with essential information. Every word earns its place, with no redundant or unnecessary content, making it efficient for agent comprehension.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations and no output schema, the description provides basic purpose and output format but lacks sufficient context for a tool with 4 parameters. It doesn't explain what metadata is returned, how errors are handled, or provide examples of typical use cases, leaving the agent with incomplete operational understanding.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so parameters are fully documented in the schema. The description adds no additional parameter semantics beyond what the schema provides, such as explaining the relationship between ark and page or providing examples beyond those in schema descriptions. Baseline 3 is appropriate when schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('Get IIIF image URL'), resource ('for a specific page'), and output type ('Returns URL and metadata, not binary data'). It distinguishes from potential sibling tools like get_page_text by specifying image retrieval rather than text extraction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when needing image URLs for pages, but provides no explicit guidance on when to use this tool versus alternatives like get_item_pages or get_item_details. No exclusions or prerequisites are mentioned, leaving usage context partially ambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_page_textA
Retrieve OCR or TEI text for a specific page when available. Returns null if text is not available.
| Name | Required | Description | Default |
|---|---|---|---|
| ark | Yes | ARK identifier | |
| page | Yes | Page number | |
| format | No | Text format (default: plain) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses that the tool may return null if text is unavailable, which is a key behavioral trait. However, it lacks details on permissions, rate limits, or error handling, leaving gaps for a tool that interacts with external data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences with zero waste. It front-loads the core purpose and follows with important behavioral context (null returns), making it efficiently structured and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations and no output schema, the description is minimal but covers the essential behavior (retrieving text and handling unavailability). For a tool with 3 parameters and external dependencies, it could benefit from more context on error cases or output structure, but it meets the minimum viable threshold.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters (ark, page, format). The description adds no additional meaning beyond what the schema provides, such as explaining ARK identifiers or format differences. Baseline 3 is appropriate as the schema handles the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Retrieve' and the resource 'OCR or TEI text for a specific page', specifying what the tool does. It distinguishes from siblings like get_page_image (which retrieves images) and get_item_pages (which likely lists pages), making the purpose specific and differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by noting 'when available' and 'Returns null if text is not available', suggesting it's for pages with text content. However, it doesn't explicitly state when to use this tool versus alternatives like get_page_image for images or advanced_search for broader queries, leaving some ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
natural_language_searchB
Search the Gallica digital library using natural language. This is a simplified search that uses the "gallica all" operator to search across all fields.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Natural language search query | |
| max_results | No | Maximum number of results to return (1-50) | |
| start_record | No | Starting record for pagination |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It adds some context: it describes the search as 'simplified' and mentions the 'gallica all' operator, which gives insight into how the search works. However, it doesn't cover important behavioral aspects like rate limits, authentication needs, error handling, or what the results look like (since there's no output schema). The description provides basic operational context but lacks depth for a tool with no annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded, with two sentences that directly state the tool's purpose and key operational detail. There's no wasted text, and it efficiently conveys the essential information. It could be slightly improved by structuring it more explicitly (e.g., separating purpose from constraints), but it's well-sized and clear.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (a search function with 3 parameters), lack of annotations, and no output schema, the description is minimally adequate. It covers the basic purpose and method but lacks details on behavioral traits, result format, or explicit differentiation from siblings. For a search tool in a context with many sibling tools, more completeness would be helpful to guide the agent effectively, but it meets the minimum viable threshold.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage, with clear documentation for all three parameters (query, max_results, start_record). The description doesn't add any parameter-specific information beyond what's in the schema, such as examples of natural language queries or details on pagination behavior. Given the high schema coverage, the baseline score of 3 is appropriate, as the description doesn't compensate but also doesn't need to since the schema is comprehensive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Search the Gallica digital library using natural language.' It specifies the verb ('search'), resource ('Gallica digital library'), and method ('natural language'). However, it doesn't explicitly distinguish this from sibling tools like 'advanced_search' or 'search_by_title' beyond mentioning it's 'simplified' and uses a specific operator, leaving some ambiguity about when to choose this over other search tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides some usage context by stating this is a 'simplified search' and uses the 'gallica all' operator to search across all fields, which implies it's a broad, general-purpose search. However, it doesn't explicitly state when to use this tool versus alternatives like 'advanced_search' or field-specific searches (e.g., 'search_by_title'), nor does it mention any exclusions or prerequisites. The guidance is implied but not comprehensive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_by_authorC
Search for documents in the Gallica digital library by author.
| Name | Required | Description | Default |
|---|---|---|---|
| author | Yes | The author name to search for | |
| exact_match | No | If true, search for the exact author name; otherwise, search for author containing the words | |
| max_results | No | Maximum number of results to return (1-50) | |
| start_record | No | Starting record for pagination |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states the basic function but doesn't mention important behavioral aspects like rate limits, authentication requirements, pagination behavior (beyond what's implied by parameters), error conditions, or what format the results will be returned in. For a search tool with no annotation coverage, this is a significant gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that states the core purpose without any unnecessary words. It's appropriately sized for a straightforward search tool and gets directly to the point with zero waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has no annotations, no output schema, and multiple sibling tools, the description is insufficiently complete. It doesn't explain what the search returns (document metadata? full text? URLs?), how results are ordered, or how this tool differs from other search options. For a search tool in a library with 11 sibling tools, more context is needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage, the input schema already documents all 4 parameters thoroughly. The description doesn't add any parameter-specific information beyond what's in the schema. According to the scoring rules, when schema_description_coverage is high (>80%), the baseline is 3 even with no param info in the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Search for documents') and target resource ('in the Gallica digital library by author'), providing a specific verb+resource combination. However, it doesn't distinguish this tool from its sibling 'search_by_title', 'search_by_date', etc., which follow the same pattern but with different search criteria.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like 'natural_language_search' or 'advanced_search'. It mentions the search criteria ('by author') but doesn't explain when author-based searching is preferable or what limitations this approach might have compared to other search methods available.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_by_dateC
Search for documents in the Gallica digital library by date. Accepts YYYY, YYYY-MM, or YYYY-MM-DD format.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | The date to search for (format: YYYY or YYYY-MM or YYYY-MM-DD) | |
| max_results | No | Maximum number of results to return (1-50) | |
| start_record | No | Starting record for pagination |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden for behavioral disclosure. It mentions the date format but doesn't describe what happens when no results are found, whether the search is case-sensitive, what types of documents are returned, or any rate limits or authentication requirements. For a search tool with zero annotation coverage, this is insufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise with just two sentences that directly communicate the tool's purpose and key constraint. Every word earns its place with no wasted text, making it easy to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a search tool with 3 parameters, no annotations, and no output schema, the description is inadequate. It doesn't explain what kind of results are returned, how they're structured, whether there's pagination behavior (beyond the start_record parameter), or any error conditions. The agent would have significant gaps in understanding how to use this tool effectively.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters thoroughly. The description adds the date format information which is already in the schema's parameter description, providing minimal additional value beyond what's already structured.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Search for documents') and resource ('Gallica digital library') with a specific scope ('by date'). It distinguishes from some siblings like search_by_author or search_by_title, but doesn't explicitly differentiate from advanced_search or natural_language_search which might also support date filtering.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like advanced_search, natural_language_search, or other search_by_* tools. It mentions the date format but doesn't explain when date-based searching is preferable to other search methods.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_by_document_typeB
Search for documents in the Gallica digital library by document type (e.g., monographie, periodique, image, manuscrit, carte, musique, etc.).
| Name | Required | Description | Default |
|---|---|---|---|
| doc_type | Yes | The document type to search for | |
| max_results | No | Maximum number of results to return (1-50) | |
| start_record | No | Starting record for pagination |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It mentions searching but doesn't disclose behavioral traits like whether it's read-only, rate limits, authentication needs, or what the return format looks like. For a search tool with zero annotation coverage, this leaves significant gaps in understanding how it behaves.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that front-loads the purpose and provides helpful examples. Every word earns its place with no redundancy or unnecessary elaboration.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations and no output schema, the description is incomplete. It doesn't explain what the tool returns (e.g., list of documents, metadata), error conditions, or behavioral constraints. For a search tool with three parameters, more context is needed to understand its full operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters (doc_type, max_results, start_record). The description adds no additional parameter semantics beyond what's in the schema, such as explaining the document type examples or pagination behavior. Baseline 3 is appropriate when schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches for documents in the Gallica digital library by document type, providing specific examples like monographie, periodique, image, etc. It distinguishes from siblings like search_by_author or search_by_title by focusing on document type, though it doesn't explicitly contrast with natural_language_search or advanced_search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when searching by document type, but doesn't specify when to use this versus alternatives like advanced_search or natural_language_search. It provides context (Gallica digital library) but lacks explicit exclusions or comparisons to sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_by_subjectC
Search for documents in the Gallica digital library by subject.
| Name | Required | Description | Default |
|---|---|---|---|
| subject | Yes | The subject to search for | |
| exact_match | No | If true, search for the exact subject; otherwise, search for subject containing the words | |
| max_results | No | Maximum number of results to return (1-50) | |
| start_record | No | Starting record for pagination |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It mentions searching but doesn't disclose behavioral traits like rate limits, authentication needs, pagination behavior beyond the parameters, or what the return format looks like (e.g., list of documents with metadata). For a search tool with zero annotation coverage, this leaves significant gaps in understanding how it behaves.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that front-loads the core purpose. There is zero waste or redundancy, making it highly concise and well-structured for quick understanding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of a search tool with 4 parameters, no annotations, and no output schema, the description is incomplete. It doesn't explain what the tool returns (e.g., document list, metadata), how results are ordered, or error conditions. For a tool with rich input schema but missing output and behavioral context, more detail is needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents all 4 parameters. The description adds no additional meaning beyond what the schema provides (e.g., it doesn't explain subject format, Gallica's subject taxonomy, or how exact_match interacts with subject terms). Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('Search for') and resource ('documents in the Gallica digital library'), specifying the search dimension ('by subject'). It distinguishes from siblings like search_by_author or search_by_title by indicating the subject-based filtering, but doesn't explicitly contrast with natural_language_search or advanced_search which might also handle subjects differently.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention when to prefer search_by_subject over natural_language_search, advanced_search, or other subject-related tools, nor does it specify prerequisites or exclusions for usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_by_titleC
Search for documents in the Gallica digital library by title.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | The title to search for | |
| exact_match | No | If true, search for the exact title; otherwise, search for title containing the words | |
| max_results | No | Maximum number of results to return (1-50) | |
| start_record | No | Starting record for pagination |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It only states the basic action ('search') without mentioning any behavioral traits like pagination handling, rate limits, authentication needs, error conditions, or what the search results look like. For a search tool with no annotation coverage, this leaves significant gaps in understanding how the tool behaves.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that directly states the tool's purpose without any wasted words. It's appropriately sized and front-loaded, making it easy to parse quickly. Every part of the sentence earns its place by conveying essential information about the tool's function.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of annotations and output schema, the description is incomplete for a search tool with multiple parameters. It doesn't explain what the search returns (e.g., result format, metadata), how pagination works beyond the schema, or any limitations like rate limits. For a tool with 4 parameters and no structured output documentation, the description should provide more context about the search behavior and results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds no parameter-specific information beyond what's already in the input schema, which has 100% coverage with clear descriptions for all four parameters. Since the schema fully documents parameters like 'title', 'exact_match', 'max_results', and 'start_record', the description doesn't need to compensate, but it also doesn't provide additional context about how parameters interact or search semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Search for documents in the Gallica digital library by title.' It specifies the verb ('search'), resource ('documents'), and scope ('by title'), making it easy to understand what the tool does. However, it doesn't explicitly differentiate from sibling tools like 'search_by_author' or 'natural_language_search', which prevents a perfect score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. With multiple sibling search tools available (e.g., 'search_by_author', 'natural_language_search'), there's no indication of when title-based searching is preferred or what distinguishes this from other search methods. This lack of contextual guidance makes it harder for an agent to choose correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sequential_reportingB
Generate a research report in a sequential, step-by-step manner using Gallica BnF sources.
This tool follows a sequential approach to report generation:
Initialize with a topic
Search for sources
Create bibliography
Create content sections in order
Parameters:
topic: Research topic (only needed for initialization)
page_count: Number of pages for the report (default: 4)
source_count: Number of sources to find (default: 10)
search_sources: Set to true to search for sources after initialization
section_number: Current section number (1-based)
total_sections: Total number of sections in the report
title: Title of the current section
content: Content for the current section
is_bibliography: Whether this section is the bibliography
sources_used: List of source IDs used in this section
next_section_needed: Whether another section is needed
include_graphics: Whether to include images and maps in the report
| Name | Required | Description | Default |
|---|---|---|---|
| topic | No | Research topic for the report (only needed for initialization) | |
| page_count | No | Number of pages to generate | |
| source_count | No | Number of sources to find | |
| search_sources | No | Set to true to search for sources after initialization | |
| section_number | Yes | Current section number | |
| total_sections | Yes | Total sections in the report | |
| title | Yes | Title of the current section | |
| content | Yes | Content of the current section | |
| is_bibliography | No | Whether this section is the bibliography | |
| sources_used | No | List of source IDs used in this section | |
| next_section_needed | Yes | Whether another section is needed | |
| include_graphics | No | Whether to include graphics in the report |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It describes the sequential process flow, which is valuable context beyond basic functionality. However, it doesn't mention important behavioral aspects like whether this is a read-only or write operation, potential rate limits, authentication requirements, or what happens if the process is interrupted mid-sequence. The description adds some process context but leaves significant behavioral gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is reasonably structured with a clear purpose statement followed by sequential steps and parameter list. However, the parameter list is somewhat redundant given the comprehensive schema descriptions. The description could be more concise by focusing on process flow rather than repeating parameter names. Still, it's not excessively verbose and maintains focus on the tool's purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 12-parameter tool with no annotations and no output schema, the description provides adequate basic context about the sequential process. However, it doesn't explain what the tool returns (no output schema), doesn't cover error conditions, and doesn't provide enough guidance on how to orchestrate the multi-step process effectively. Given the complexity, more complete usage guidance would be helpful.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 12 parameters thoroughly. The description lists all parameters but doesn't add meaningful semantic context beyond what's in the schema descriptions. It provides a parameter list but no additional guidance on how parameters interact in the sequential process or which parameters are needed at which steps. Baseline 3 is appropriate when schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Generate a research report in a sequential, step-by-step manner using Gallica BnF sources.' It specifies the verb ('generate'), resource ('research report'), and approach ('sequential, step-by-step'). However, it doesn't explicitly differentiate from sibling tools like 'advanced_search' or 'natural_language_search' which are search-focused rather than report generation tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage through its sequential step explanation (initialize, search, create bibliography, create sections), suggesting this tool should be used for multi-step report generation. However, it doesn't provide explicit guidance on when to use this vs. simpler search tools or when not to use it (e.g., for quick lookups). No alternative tools are mentioned for similar tasks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
12 tool updates
v1.0.0- First observed
advanced_search - First observed
get_item_details - First observed
get_item_pages - First observed
get_page_image - First observed
get_page_text - First observed
natural_language_search - First observed
search_by_author - First observed
search_by_date - First observed
search_by_document_type - First observed
search_by_subject - First observed
search_by_title - First observed
sequential_reporting
TDQS
Scored across 12 tools
Most tools have distinct purposes, but there is significant overlap between the six specific search tools (search_by_author, search_by_title, etc.) and the general natural_language_search and advanced_search tools, which could cause confusion about when to use each. The sequential_reporting tool stands out as a high-level workflow tool that might be misapplied instead of using the underlying search and retrieval tools directly.
The naming is mostly consistent with a verb_noun pattern (e.g., get_item_details, search_by_author), but there are minor deviations: advanced_search uses an adjective instead of a verb, and sequential_reporting uses an adjective rather than a verb, breaking the pattern slightly. Overall, the naming is readable and follows a clear convention.
With 12 tools, the count is reasonable for a digital library server, covering search, retrieval, and reporting functions. It is slightly on the higher side but well-scoped for the domain, as it includes multiple search facets and detailed item handling, without being overwhelming.
The tool set provides strong coverage for searching and retrieving documents, including metadata, pages, images, and text. However, there are minor gaps: no tools for user account management (e.g., saving favorites or history) or batch operations (e.g., downloading multiple items), which might be useful for advanced research workflows but are not essential for core functionality.
Maintenance
Related MCP Connectors
Resolve, search and verify legal citations against the official sources, with provenance.
Federated search of books and papers, BibTeX/RIS citations, open-access retrieval and reading.
Academic literature search, retrieval, and private library management on top of OpenAlex.
Search books and authors, fetch editions, browse subjects, and resolve cover images.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceA Model-Client-Protocol server that enables users to search the Gallica digital library of the National Library of France and generate structured sequential research reports with formatted citations and relevant images.12-
- AlicenseAqualityAmaintenanceEnables AI models to search and retrieve bibliographic and digitized records from Swiss academic libraries (swisscovery, e-rara, e-periodica, e-manuscripta) via open protocols without requiring API keys.161MIT
- AlicenseAqualityBmaintenanceEnables searching and accessing OCR text from millions of digitized documents in Gallica, the digital library of the Bibliothèque nationale de France, through MCP tools for text search, snippet retrieval, and full-text download.31Apache 2.0
- FlicenseNot gradedqualityDmaintenanceEnables searching documents in Gallica, the digital library of the Bibliothèque nationale de France, and generating structured research reports with citations and images.-