Skip to main content
Glama
ukicar

Gallica/BnF MCP Server

by ukicar

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

  1. Clone or download this repository

  2. Install dependencies:

    cd node-mcp-bnf
    npm install
  3. Build the project:

    npm run build

Usage

Local Development

Run the server on a local HTTP port for testing:

npm run dev:http

This 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 dev

Claude 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 version

  • npm 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

  1. Create vercel.json in project root:

    {
      "functions": {
        "src/httpServer.ts": {
          "runtime": "nodejs18.x"
        }
      },
      "routes": [
        {
          "src": "/(.*)",
          "dest": "src/httpServer.ts"
        }
      ]
    }
  2. 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.svg relative to server URL)

  3. Deploy:

    vercel deploy
  4. Configure 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 for

  • exact_match (boolean, optional): If true, search for exact title

  • max_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 name

  • exact_match (boolean, optional): If true, search for exact author name

  • max_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 for

  • exact_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-DD

  • max_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)

Perform advanced search with custom CQL query.

Parameters:

  • query (string, required): CQL query string

  • max_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 across all fields.

Parameters:

  • query (string, required): Natural language search query

  • max_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 identifier

  • page (number, optional): Get specific page number

  • page_size (number, optional): Get first N pages

  • page_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 identifier

  • page (number, required): Page number

  • size (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 identifier

  • page (number, required): Page number

  • format (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:

  1. Initialize:

    {
      "topic": "Impressionnisme en France",
      "page_count": 4,
      "source_count": 10,
      "include_graphics": true
    }
  2. Search sources:

    {
      "search_sources": true
    }
  3. Create bibliography:

    {
      "section_number": 1,
      "total_sections": 8,
      "title": "Bibliography",
      "content": "...",
      "is_bibliography": true,
      "sources_used": [1, 2, 3],
      "next_section_needed": true
    }
  4. Write sections sequentially:

    {
      "section_number": 2,
      "total_sections": 8,
      "title": "Introduction",
      "content": "...",
      "sources_used": [1, 2],
      "next_section_needed": true
    }
  5. 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.json

Building

npm run build

Testing

npm test

Development Mode

npm run dev

Documentation

License

MIT

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

Acknowledgments

Available Tools

12 tools
get_item_detailsA

Get full metadata for a Gallica item by its ARK identifier. Returns bibliographic data, available formats, and helpful URLs.

ParametersJSON Schema
NameRequiredDescriptionDefault
arkYesARK identifier (e.g., "ark:/12148/bpt6k123456" or "bpt6k123456")

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
arkYesARK identifier
pageNoGet specific page number
page_sizeNoGet first N pages
page_rangeNoGet pages in range [start, end]

TDQS

B3.3/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
arkYesARK identifier
pageYesPage number
sizeNoImage size (e.g., "full", "200,", "500,500", "pct:50")
regionNoImage region (e.g., "full", "x,y,w,h")

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
arkYesARK identifier
pageYesPage number
formatNoText format (default: plain)

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

search_by_authorC

Search for documents in the Gallica digital library by author.

ParametersJSON Schema
NameRequiredDescriptionDefault
authorYesThe author name to search for
exact_matchNoIf true, search for the exact author name; otherwise, search for author containing the words
max_resultsNoMaximum number of results to return (1-50)
start_recordNoStarting record for pagination

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateYesThe date to search for (format: YYYY or YYYY-MM or YYYY-MM-DD)
max_resultsNoMaximum number of results to return (1-50)
start_recordNoStarting record for pagination

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.).

ParametersJSON Schema
NameRequiredDescriptionDefault
doc_typeYesThe document type to search for
max_resultsNoMaximum number of results to return (1-50)
start_recordNoStarting record for pagination

TDQS

B3.2/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
subjectYesThe subject to search for
exact_matchNoIf true, search for the exact subject; otherwise, search for subject containing the words
max_resultsNoMaximum number of results to return (1-50)
start_recordNoStarting record for pagination

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYesThe title to search for
exact_matchNoIf true, search for the exact title; otherwise, search for title containing the words
max_resultsNoMaximum number of results to return (1-50)
start_recordNoStarting record for pagination

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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:

  1. Initialize with a topic

  2. Search for sources

  3. Create bibliography

  4. 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

ParametersJSON Schema
NameRequiredDescriptionDefault
topicNoResearch topic for the report (only needed for initialization)
page_countNoNumber of pages to generate
source_countNoNumber of sources to find
search_sourcesNoSet to true to search for sources after initialization
section_numberYesCurrent section number
total_sectionsYesTotal sections in the report
titleYesTitle of the current section
contentYesContent of the current section
is_bibliographyNoWhether this section is the bibliography
sources_usedNoList of source IDs used in this section
next_section_neededYesWhether another section is needed
include_graphicsNoWhether to include graphics in the report

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

  1. 12 tool updatesv1.0.0
    • First observedadvanced_search
    • First observedget_item_details
    • First observedget_item_pages
    • First observedget_page_image
    • First observedget_page_text
    • First observednatural_language_search
    • First observedsearch_by_author
    • First observedsearch_by_date
    • First observedsearch_by_document_type
    • First observedsearch_by_subject
    • First observedsearch_by_title
    • First observedsequential_reporting

TDQS

B3.3/5.0

Scored across 12 tools

Disambiguation3/5

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.

Naming Consistency4/5

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.

Tool Count4/5

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.

Completeness4/5

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

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    A 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
    -
  • A
    license
    A
    quality
    A
    maintenance
    Enables 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.
    16
    1
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Enables 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.
    3
    1
    Apache 2.0
  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables searching documents in Gallica, the digital library of the Bibliothèque nationale de France, and generating structured research reports with citations and images.
    -