Skip to main content
Glama

IIIF MCP Server v1.1.0

MCP (Model Context Protocol) server for IIIF (International Image Interoperability Framework) integration.

What's New in v1.1.0

  • iiif-image-fetch: Fetch actual IIIF image data with size constraints and region support

  • iiif-manifest-canvases: List all canvases within a manifest with filtering options

  • iiif-canvas-info: Get detailed information about specific canvases

  • Single-file bundling: New distribution option using esbuild for npm-free deployment

Related MCP server: mtl-c2pa-mcp

Implementation Status

Core Features

  • Search: Content Search API integration for searching within IIIF resources

    • ✅ Full-text search within IIIF documents

    • ✅ Support for Search API v0, v1, and v2

    • ✅ Tested with NC State University's IIIF collections

    • ✅ Successfully deployed to Claude Desktop

  • Metadata Retrieval: Get manifest and collection metadata via Presentation API

    • ✅ Support for both IIIF Presentation API v2 and v3 formats

    • ✅ Flexible property selection

    • ✅ Multilingual label support

    • ✅ Handles complex metadata structures (HTML, nested properties)

  • Image Operations: Retrieve images with specified regions, sizes, and rotations via Image API

    • ✅ URL building with all IIIF Image API parameters

    • ✅ Parameter validation (region, size, rotation, quality, format)

    • ✅ Image info retrieval with v2/v3 support

    • ✅ Comprehensive error handling

Extended Features

Image Data Operations (v1.1.0)

  • Fetch Image Data: Retrieve actual image content as Base64

    • ✅ Full IIIF Image API parameter support

    • ✅ Automatic size constraints (max 1500px, 1M pixels)

    • ✅ Region extraction with percentage coordinates

  • Canvas Navigation: Enhanced manifest exploration

    • ✅ List all canvases with filtering options

    • ✅ Detailed canvas information retrieval

    • ✅ Support for multi-image canvases

Extended Features (Planned)

Collection Management

  • List Collections: Retrieve all available collections

    • ✅ Support for both IIIF Presentation API v2 and v3 formats

    • ✅ Hierarchical navigation of nested collections

    • ✅ Detailed listing of sub-collections and manifests

  • Collection Contents: List manifests within a collection

    • ✅ Separate grouping of collections and manifests

    • ✅ Optional detailed item listing

    • ✅ Navigation date support for temporal organization

  • Hierarchical Navigation: Navigate nested collection structures

    • ✅ Part-of relationships for parent collections

    • ✅ Support for v2 collections/manifests/members arrays

    • ✅ Support for v3 items array with type detection

Annotation Operations

  • Search Annotations: Find annotations by content or type

    • ✅ Support for IIIF v2 AnnotationLists and v3 AnnotationPages

    • ✅ Filter by motivation (painting, commenting, transcribing, etc.)

    • ✅ Direct annotation URL or manifest-based extraction

  • Extract Text: Get all text annotations from a resource

    • ✅ Automatic text extraction from annotation bodies

    • ✅ Support for various text formats (ContentAsText, TextualBody)

    • ✅ Full text aggregation with proper spacing

  • Multilingual Support: Handle annotations in multiple languages

    • ✅ Language detection and filtering

    • ✅ Group annotations by language

    • ✅ Separate text extraction per language

Structure Navigation

  • Get Ranges: Retrieve chapter/section structures

  • Page Sequences: Navigate page order and sequences

  • Generate TOC: Create table of contents from range structures

Content State Management

  • Save Views: Store specific resource views using Content State API

  • Bookmarks: Create and manage bookmarks

  • Citation Links: Generate shareable reference links

Change Tracking

  • Monitor Updates: Track resource changes via Change Discovery API

    • ✅ Support for IIIF Change Discovery API 1.0

    • ✅ Process OrderedCollection and OrderedCollectionPage types

    • ✅ Navigate paginated activity streams

  • Activity Stream Navigation: Navigate through change activities

    • ✅ Fetch main activity stream collections

    • ✅ Retrieve specific activity pages

    • ✅ Support for next/previous page navigation

  • Activity Processing: Extract and format change information

    • ✅ Parse Create, Update, Delete, and other activity types

    • ✅ Extract object references and canonical URIs

    • ✅ Display timestamps and summaries

Access Control

  • Full Authentication Support: Complete IIIF Authorization Flow API implementation

    • ✅ Cookie-based authentication flow

    • ✅ Token-based authentication flow

    • ✅ External authentication detection

    • ✅ Session management with automatic expiry handling

    • ✅ Probe service for access verification

    • ✅ Protected resource access with auth headers

    • ✅ Logout functionality with session cleanup

    • ✅ Support for both Auth API v1 and v2 formats

    • ✅ Compatible with IIIF Auth Demonstrator for testing

Media Processing

  • AV Content: Support audio/video resources

    • ✅ Extract audio and video items from IIIF manifests

    • ✅ Support for both IIIF v2 and v3 A/V content

    • ✅ Duration calculation and formatting

  • Media Information: Extract technical metadata

    • ✅ Video dimensions (width/height)

    • ✅ Audio/video formats and codecs

    • ✅ Duration for individual items and total runtime

  • Chapter Navigation: Support for time-based ranges

    • ✅ Extract structural ranges from manifests

    • ✅ Chapter/segment identification

    • ✅ Time-based navigation support

  • 3D Models: Handle 3D content types

  • PDF Export: Generate PDF from IIIF resources

Installation

Standard Installation

npm install
npm run build

Single-file Bundle (v1.1.0+)

npm run bundle
# Creates iiif-mcp-bundle.js - no npm install needed for deployment

Usage

As MCP Server

Add to your MCP client configuration:

Standard Installation

{
  "mcpServers": {
    "iiif": {
      "command": "node",
      "args": ["/path/to/mcp_iiif/dist/index.js"]
    }
  }
}

Single-file Bundle (v1.1.0+)

{
  "mcpServers": {
    "iiif": {
      "command": "node",
      "args": ["/path/to/iiif-mcp-bundle.js"]
    }
  }
}

Structured Output Support

All tools now support a structured parameter that returns JSON data instead of formatted text. This enables better integration with other MCP servers and programmatic processing.

Benefits of Structured Output

  1. Integration with Download Tools: Structured URLs and metadata can be easily passed to file download MCP servers

  2. Batch Processing: Extract multiple image URLs or search results for automated workflows

  3. Data Analysis: Parse and analyze IIIF metadata programmatically

  4. Custom Formatting: Build your own presentation layer using the raw data

Example: Image Download Workflow

// 1. Get structured image URL from IIIF MCP Server
const imageResult = await iiifServer.callTool('iiif-image', {
  imageUrl: 'https://iiif.lib.ncsu.edu/iiif/technician-basketballpreview-1997-11-10_0001',
  region: 'pct:25,25,50,50',
  size: '500,',
  quality: 'gray',
  format: 'png',
  structured: true
});

// 2. Parse the structured result
const imageData = JSON.parse(imageResult);
// {
//   "url": "https://iiif.lib.ncsu.edu/iiif/.../pct:25,25,50,50/500,/0/gray.png",
//   "metadata": {
//     "suggested_filename": "technician_preview_crop_gray.png",
//     "original_id": "technician-basketballpreview-1997-11-10_0001"
//   }
// }

// 3. Pass to download MCP server
const downloadResult = await downloadServer.callTool('download_image', {
  url: imageData.url,
  filename: imageData.metadata.suggested_filename
});

Available Tools

✅ iiif-image-fetch (v1.1.0)

Fetch actual IIIF image data with automatic size constraints.

Parameters:

  • imageUrl (string, required): Image API base URL (e.g., "https://example.org/iiif/image123")

  • region (string, optional): Image region - "full" (default), "square", "x,y,w,h", or "pct:x,y,w,h"

  • size (string, optional): Image size - "max" (default), "w,", ",h", "pct:n", "w,h", or "!w,h"

  • rotation (string, optional): Rotation - "0" (default) to "359", optionally prefixed with "!" for mirroring

  • quality (string, optional): Image quality - "default", "color", "gray", or "bitonal"

  • format (string, optional): Output format - "jpg" (default), "png", "webp", "tif", "gif", or "pdf"

  • maxDimension (number, optional): Maximum dimension constraint (default: 1500)

  • maxPixels (number, optional): Maximum total pixels (default: 1000000)

Example:

{
  "tool": "iiif-image-fetch",
  "arguments": {
    "imageUrl": "https://iiif.lib.ncsu.edu/iiif/technician-basketballpreview-1997-11-10_0001",
    "region": "pct:25,25,50,50",
    "size": "800,",
    "format": "png"
  }
}

Response: Returns image data as Base64-encoded blob with MIME type and original URL.

✅ iiif-manifest-canvases (v1.1.0)

List all canvases within a IIIF manifest.

Parameters:

  • manifestUrl (string, required): The URL of the IIIF manifest

  • filter (object, optional): Filtering options

    • hasImage (boolean): Only include canvases with images

    • hasAnnotation (boolean): Only include canvases with annotations

    • labelPattern (string): Regular expression to filter by label

  • includeMetadata (boolean, optional): Include canvas metadata (default: false)

  • includeThumbnail (boolean, optional): Include thumbnail URLs (default: true)

  • structured (boolean, optional): Return structured JSON data

Example:

{
  "tool": "iiif-manifest-canvases",
  "arguments": {
    "manifestUrl": "https://d.lib.ncsu.edu/collections/catalog/technician-basketballpreview-1997-11-10/manifest.json",
    "filter": {
      "hasAnnotation": true
    }
  }
}

✅ iiif-canvas-info (v1.1.0)

Get detailed information about a specific canvas.

Parameters:

  • manifestUrl (string, required): The URL of the IIIF manifest

  • canvasId (string, optional): Canvas ID (if omitted, returns first canvas)

  • canvasIndex (number, optional): Canvas index (0-based)

  • includeAnnotations (boolean, optional): Include annotation details (default: true)

  • includeImageInfo (boolean, optional): Fetch Image API info.json (default: false)

  • includeStructures (boolean, optional): Include structural information (default: false)

  • structured (boolean, optional): Return structured JSON data

Example:

{
  "tool": "iiif-canvas-info",
  "arguments": {
    "manifestUrl": "https://d.lib.ncsu.edu/collections/catalog/technician-basketballpreview-1997-11-10/manifest.json",
    "canvasIndex": 0,
    "includeImageInfo": true
  }
}

Response: Returns detailed canvas information including dimensions, associated images, annotations, and metadata.

Available Tools

Search within IIIF resources using the Content Search API.

Parameters:

  • searchServiceUrl (string, required): The URL of the IIIF Content Search service endpoint

  • query (string, required): The search query string

  • structured (boolean, optional): Return structured JSON data instead of formatted text

Example:

{
  "tool": "iiif-search",
  "arguments": {
    "searchServiceUrl": "https://iiif.lib.harvard.edu/manifests/drs:48309543/svc/searchwithin",
    "query": "Paris"
  }
}

Response: Returns formatted search results including:

  • Total number of hits

  • Resource labels and IDs

  • Match contexts with surrounding text

  • Annotation references

✅ iiif-manifest

Retrieve manifest metadata from IIIF Presentation API.

Parameters:

  • manifestUrl (string, required): The URL of the IIIF manifest

  • properties (array, optional): Specific properties to retrieve. Options include:

    • label: Title of the resource

    • id: Unique identifier

    • type: Resource type

    • summary: Description (v3) or description (v2)

    • metadata: Descriptive metadata pairs

    • rights: Rights/license information

    • provider: Provider information

    • viewingDirection: Reading direction

    • items: Canvas/page information

    • structures: Table of contents

    • thumbnail: Thumbnail image URL

  • structured (boolean, optional): Return structured JSON data instead of formatted text

✅ iiif-collection

Retrieve and navigate IIIF collections with support for hierarchical structures.

Parameters:

  • collectionUrl (string, required): The URL of the IIIF collection

  • includeItems (boolean, optional): Include detailed list of collection items (default: true)

  • structured (boolean, optional): Return structured JSON data instead of formatted text

Example:

{
  "tool": "iiif-collection",
  "arguments": {
    "collectionUrl": "https://iiif.bodleian.ox.ac.uk/iiif/collection/top",
    "includeItems": true
  }
}

Response:

  • Formatted view includes collection metadata, item counts, and hierarchical listing

  • Structured output provides arrays of sub-collections and manifests with metadata

✅ iiif-image

Build IIIF Image API URLs and retrieve image information.

Parameters:

  • imageUrl (string, required): Base URL of the IIIF image (without parameters)

  • region (string, optional): Image region (full, square, x,y,w,h, or pct:x,y,w,h)

  • size (string, optional): Image size (max, w,h, w,, ,h, pct:n, or !w,h)

  • rotation (string, optional): Rotation in degrees (0-360, optionally prefixed with ! for mirroring)

  • quality (string, optional): Image quality (default, color, gray, bitonal)

  • format (string, optional): Image format (jpg, tif, png, gif, jp2, pdf, webp)

  • info (boolean, optional): If true, retrieve image information instead of building URL

  • structured (boolean, optional): Return structured JSON data instead of formatted text

Example:

{
  "tool": "iiif-image",
  "arguments": {
    "imageUrl": "https://ids.lib.harvard.edu/ids/iiif/47174896",
    "region": "1000,2000,3000,4000",
    "size": "500,",
    "rotation": "90",
    "quality": "gray",
    "format": "jpg"
  }
}

Response:

  • When building URLs: Returns the complete IIIF Image API URL with parameters

  • When info: true: Returns formatted image information including dimensions, available sizes, tile information, and supported features

✅ iiif-annotation

Extract and analyze annotations from IIIF resources, including text transcriptions, translations, and commentary.

Parameters:

  • source (string, required): Either an annotation URL or a manifest URL to extract annotations from

  • language (string, optional): Filter annotations by language code (e.g., "en", "fr")

  • groupByCanvas (boolean, optional): Group annotations by their target canvas

  • includeNonText (boolean, optional): Include non-text annotations in the results

  • structured (boolean, optional): Return structured JSON data instead of formatted text

Example:

{
  "tool": "iiif-annotation",
  "arguments": {
    "source": "https://example.org/manifest.json",
    "language": "en",
    "groupByCanvas": true
  }
}

Response:

  • Formatted view includes annotation counts, languages, motivations, and full text extraction

  • Structured output provides detailed annotation data with text content organized by language

  • Automatically detects and extracts text from various annotation formats (v2/v3)

✅ iiif-activity

Track changes and updates to IIIF resources using the Change Discovery API.

Parameters:

  • activityStreamUrl (string): The URL of the IIIF Activity Stream (OrderedCollection)

  • pageUrl (string): The URL of a specific activity page (OrderedCollectionPage)

  • structured (boolean, optional): Return structured JSON data instead of formatted text

Note: Either activityStreamUrl or pageUrl must be provided.

Example:

{
  "tool": "iiif-activity",
  "arguments": {
    "activityStreamUrl": "https://example.org/activity-stream"
  }
}

Response:

  • For OrderedCollection: Shows total activities and links to first/last pages

  • For OrderedCollectionPage: Displays activities with type, object references, timestamps, and summaries

  • Structured output provides detailed activity data with pagination info

✅ iiif-av

Extract and analyze audio/video content from IIIF manifests.

Parameters:

  • manifestUrl (string, required): The URL of the IIIF manifest containing A/V content

  • includeRanges (boolean, optional): Include structural ranges/chapters in the output

  • structured (boolean, optional): Return structured JSON data instead of formatted text

Example:

{
  "tool": "iiif-av",
  "arguments": {
    "manifestUrl": "https://example.org/av-manifest.json",
    "includeRanges": true
  }
}

Response:

  • Lists all audio/video items with format, duration, and dimensions

  • Calculates total runtime for multi-part content

  • Shows chapter/range information when available

  • Structured output provides detailed media metadata and canvas associations

✅ iiif-auth

Full authentication support for IIIF resources with session management and protected content access.

Parameters:

  • action (string, required): The authentication action to perform

    • info: Get authentication requirements without logging in

    • authenticate: Perform authentication with credentials

    • probe: Check access to a resource

    • logout: End authentication session

    • get-protected: Fetch protected resource with active session

  • resourceUrl (string, required): The URL of the IIIF resource

  • username (string, optional): Username for authentication (when action is authenticate)

  • password (string, optional): Password for authentication (when action is authenticate)

  • token (string, optional): Manually provide an access token (when action is authenticate)

  • sessionId (string, optional): Manually provide a session ID (when action is authenticate)

  • interactive (boolean, optional): Use interactive browser-based authentication (when action is authenticate)

  • structured (boolean, optional): Return structured JSON data instead of formatted text

Examples:

  1. Check authentication requirements:

{
  "tool": "iiif-auth",
  "arguments": {
    "action": "info",
    "resourceUrl": "https://example.org/protected-manifest.json"
  }
}
  1. Authenticate with credentials:

{
  "tool": "iiif-auth",
  "arguments": {
    "action": "authenticate",
    "resourceUrl": "https://example.org/protected-manifest.json",
    "username": "testuser",
    "password": "testpass"
  }
}
  1. Authenticate with browser (interactive):

{
  "tool": "iiif-auth",
  "arguments": {
    "action": "authenticate",
    "resourceUrl": "https://example.org/protected-manifest.json",
    "interactive": true
  }
}
  1. Authenticate with manual token/session:

{
  "tool": "iiif-auth",
  "arguments": {
    "action": "authenticate",
    "resourceUrl": "https://example.org/protected-manifest.json",
    "token": "your-access-token-here"
  }
}
  1. Check access to resource:

{
  "tool": "iiif-auth",
  "arguments": {
    "action": "probe",
    "resourceUrl": "https://example.org/protected-manifest.json"
  }
}
  1. Get protected content:

{
  "tool": "iiif-auth",
  "arguments": {
    "action": "get-protected",
    "resourceUrl": "https://example.org/protected-manifest.json"
  }
}

Features:

  • Cookie-based authentication with session management

  • Token-based authentication with Bearer token support

  • External authentication with browser-based flow

  • Interactive authentication via local callback server

  • Automatic browser opening for login pages

  • Automatic session expiry handling

  • Probe service integration for access verification

  • Secure credential handling

  • Support for both IIIF Auth API v1 and v2

⚠️ CLI Authentication Limitations:

Due to the nature of command-line environments, browser-based authentication has inherent limitations:

  1. Cookie Isolation: Browser authentication sessions cannot be shared with the CLI process

    • When you log in via browser, cookies are stored in the browser's context

    • The CLI (Node.js) process cannot access these browser cookies

    • This is a security feature of modern browsers and operating systems

  2. IIIF Authentication Design: The IIIF Auth API was designed for browser-based viewers

    • Relies on postMessage API and iframes for secure token exchange

    • These browser APIs are not available in Node.js CLI environments

Recommended Authentication Methods for CLI:

  1. Direct Authentication (Preferred for CLI):

    {
      "action": "authenticate",
      "resourceUrl": "https://example.org/protected-manifest.json",
      "username": "your-username",
      "password": "your-password"
    }
  2. Manual Token Authentication:

    {
      "action": "authenticate",
      "resourceUrl": "https://example.org/protected-manifest.json",
      "token": "your-access-token"
    }
  3. Interactive Browser Authentication (Limited Support):

    • Opens browser for login

    • ⚠️ Cannot automatically capture the session

    • Suitable only for services that provide visible tokens after login

Testing with IIIF Auth Demonstrator:

  • Base URL: https://iiifauth.digtest.co.uk/

  • Test credentials: username=username, password=password

  • Example protected manifest: https://iiifauth.digtest.co.uk/manifestcookie.json

For Full Authentication Support: Consider using browser-based IIIF viewers (Mirador, Universal Viewer) which can properly handle the complete IIIF authentication flow with cookies and postMessage.

🚧 iiif-range (Coming Soon)

Navigate structural ranges (chapters, sections) within IIIF resources.

Planned Parameters:

  • manifestUrl (string, required): URL of the manifest

  • rangeId (string, optional): Specific range to retrieve

Development

npm run dev  # Run in development mode
npm test     # Run tests

Authentication and Protected Resources

// Check if a resource requires authentication
const authInfo = await client.callTool('iiif-auth', {
  action: 'info',
  resourceUrl: 'https://iiifauth.digtest.co.uk/manifestcookie.json'
});

// Authenticate with credentials
const session = await client.callTool('iiif-auth', {
  action: 'authenticate',
  resourceUrl: 'https://iiifauth.digtest.co.uk/manifestcookie.json',
  username: 'username',
  password: 'password'
});

// Check access to protected resource
const access = await client.callTool('iiif-auth', {
  action: 'probe',
  resourceUrl: 'https://iiifauth.digtest.co.uk/manifestcookie.json'
});

// Get protected content after authentication
const protectedData = await client.callTool('iiif-auth', {
  action: 'get-protected',
  resourceUrl: 'https://iiifauth.digtest.co.uk/manifestcookie.json'
});

// Logout when done
await client.callTool('iiif-auth', {
  action: 'logout',
  resourceUrl: 'https://iiifauth.digtest.co.uk/manifestcookie.json'
});

Usage Examples

Search within a IIIF resource

// Search for "Paris" in a Harvard manuscript
const result = await client.callTool('iiif-search', {
  searchServiceUrl: 'https://iiif.lib.harvard.edu/manifests/drs:48309543/svc/searchwithin',
  query: 'Paris'
});

// Search in NC State University collections
const result = await client.callTool('iiif-search', {
  searchServiceUrl: 'https://ocr.lib.ncsu.edu/search/technician-basketballpreview-1997-11-10',
  query: 'basketball'
});

// Get structured search results for processing
const structuredResult = await client.callTool('iiif-search', {
  searchServiceUrl: 'https://ocr.lib.ncsu.edu/search/technician-basketballpreview-1997-11-10',
  query: 'basketball',
  structured: true
});
// Returns JSON with results array, total count, etc.

Get manifest metadata

// Retrieve all metadata for a specific manifest
const manifest = await client.callTool('iiif-manifest', {
  manifestUrl: 'https://d.lib.ncsu.edu/collections/catalog/technician-basketballpreview-1997-11-10/manifest.json'
});

// Retrieve specific properties only
const manifest = await client.callTool('iiif-manifest', {
  manifestUrl: 'https://iiif.bodleian.ox.ac.uk/iiif/manifest/e32a277e-91e2-4a6d-8ba6-cc4bad230410.json',
  properties: ['label', 'metadata', 'items']
});

// Get structured manifest data for processing
const structuredManifest = await client.callTool('iiif-manifest', {
  manifestUrl: 'https://d.lib.ncsu.edu/collections/catalog/technician-basketballpreview-1997-11-10/manifest.json',
  structured: true
});
// Returns JSON with images array, metadata, thumbnail URL, etc.

Retrieve a specific image region

// Get a 500px wide crop of a specific region
const image = await client.callTool('iiif-image', {
  imageUrl: 'https://ids.lib.harvard.edu/ids/iiif/47174896',
  region: '1000,2000,3000,4000',
  size: '500,',
  format: 'jpg'
});

// Get image information
const info = await client.callTool('iiif-image', {
  imageUrl: 'https://ids.lib.harvard.edu/ids/iiif/47174896',
  info: true
});

// Get structured image URL with metadata
const structuredImage = await client.callTool('iiif-image', {
  imageUrl: 'https://ids.lib.harvard.edu/ids/iiif/47174896',
  region: '1000,2000,3000,4000',
  size: '500,',
  format: 'jpg',
  structured: true
});
// Returns JSON with URL, suggested filename, parameters, etc.

Navigate IIIF collections

// Get top-level collection
const collection = await client.callTool('iiif-collection', {
  collectionUrl: 'https://iiif.bodleian.ox.ac.uk/iiif/collection/top'
});

// Get collection without detailed item listing
const summary = await client.callTool('iiif-collection', {
  collectionUrl: 'https://iiif.bodleian.ox.ac.uk/iiif/collection/top',
  includeItems: false
});

// Get structured collection data for processing
const structuredCollection = await client.callTool('iiif-collection', {
  collectionUrl: 'https://digital.library.yale.edu/collections/iiif',
  structured: true
});
// Returns JSON with sub-collections and manifests arrays

Extract text annotations

// Extract all text annotations from a manifest
const annotations = await client.callTool('iiif-annotation', {
  source: 'https://example.org/manifest-with-transcriptions.json'
});

// Filter annotations by language
const frenchAnnotations = await client.callTool('iiif-annotation', {
  source: 'https://gallica.bnf.fr/iiif/ark:/12148/btv1b8449691v/manifest.json',
  language: 'fr'
});

// Get structured annotation data for processing
const structuredAnnotations = await client.callTool('iiif-annotation', {
  source: 'https://example.org/annotations/list1.json',
  structured: true
});
// Returns JSON with full text, language breakdown, and annotation metadata

Track resource changes

// Get activity stream overview
const activities = await client.callTool('iiif-activity', {
  activityStreamUrl: 'https://example.org/activity-stream'
});

// Fetch a specific page of activities
const page = await client.callTool('iiif-activity', {
  pageUrl: 'https://example.org/activity-stream/page/1'
});

// Get structured activity data for processing
const structuredActivities = await client.callTool('iiif-activity', {
  pageUrl: 'https://example.org/activity-stream/page/1',
  structured: true
});
// Returns JSON with activities array, pagination info, etc.

Process audio/video content

// Extract A/V content from a manifest
const avContent = await client.callTool('iiif-av', {
  manifestUrl: 'https://example.org/av-manifest.json'
});

// Include chapter/range information
const avWithChapters = await client.callTool('iiif-av', {
  manifestUrl: 'https://example.org/lecture-recording.json',
  includeRanges: true
});

// Get structured A/V data for processing
const structuredAV = await client.callTool('iiif-av', {
  manifestUrl: 'https://example.org/video-collection.json',
  structured: true
});
// Returns JSON with media items, durations, dimensions, etc.

API Specifications

This server implements tools based on the following IIIF specifications:

Structured Output Examples

Search Results

{
  "url": "https://ocr.lib.ncsu.edu/search/...",
  "service_url": "https://ocr.lib.ncsu.edu/search/...",
  "query": "basketball",
  "total_results": 24,
  "api_version": "http://iiif.io/api/search/0/context.json",
  "results": [
    {
      "id": "urn:ocracoke:...",
      "type": "oa:Annotation",
      "label": "Page 1",
      "matches": [
        {
          "text": "basketball",
          "context": "NC State [basketball] team..."
        }
      ]
    }
  ]
}

Manifest Structure

{
  "url": "https://d.lib.ncsu.edu/.../manifest",
  "id": "https://d.lib.ncsu.edu/.../manifest",
  "type": "sc:Manifest",
  "label": "Technician Basketball Preview",
  "thumbnail": "https://iiif.lib.ncsu.edu/.../thumbnail.jpg",
  "images": [
    {
      "id": "https://d.lib.ncsu.edu/.../canvas/page_0001",
      "label": "[1]",
      "width": 3573,
      "height": 4425
    }
  ],
  "metadata": [
    {
      "label": "Creator",
      "value": "Technician (Raleigh, N.C.)"
    }
  ]
}

Image URL Structure

{
  "url": "https://iiif.lib.ncsu.edu/.../pct:25,25,50,50/500,/0/gray.png",
  "base_url": "https://iiif.lib.ncsu.edu/.../image_0001",
  "parameters": {
    "region": "pct:25,25,50,50",
    "size": "500,",
    "rotation": "0",
    "quality": "gray",
    "format": "png"
  },
  "metadata": {
    "suggested_filename": "image_0001_crop_gray.png",
    "original_id": "image_0001"
  }
}

Collection Structure

{
  "url": "https://iiif.bodleian.ox.ac.uk/iiif/collection/top",
  "id": "https://iiif.bodleian.ox.ac.uk/iiif/collection/top",
  "type": "Collection",
  "label": "Bodleian Libraries: Top Collection",
  "total_items": 25,
  "collections": [
    {
      "id": "https://iiif.bodleian.ox.ac.uk/.../medieval",
      "type": "Collection",
      "label": "Medieval Manuscripts"
    }
  ],
  "manifests": [
    {
      "id": "https://iiif.bodleian.ox.ac.uk/.../ms-canon-misc-213",
      "type": "Manifest",
      "label": "MS. Canon. Misc. 213",
      "navDate": "1450-01-01"
    }
  ],
  "partOf": [
    {
      "id": "https://iiif.bodleian.ox.ac.uk/.../parent",
      "label": "Parent Collection"
    }
  ]
}

Annotation Structure

{
  "url": "https://example.org/annotations/list1",
  "total_annotations": 15,
  "languages": ["en", "fr"],
  "motivations": ["painting", "commenting", "transcribing"],
  "annotations": [
    {
      "id": "https://example.org/annotation/1",
      "type": "Annotation",
      "motivation": ["transcribing"],
      "text": "This is the transcribed text from the manuscript",
      "language": "en",
      "format": "text/plain",
      "target": "https://example.org/canvas/1#xywh=100,100,500,300"
    }
  ],
  "text_content": {
    "full_text": "This is the transcribed text from the manuscript...",
    "by_language": {
      "en": ["This is the transcribed text..."],
      "fr": ["Ceci est le texte transcrit..."]
    }
  }
}

Activity Stream Structure

{
  "url": "https://example.org/activity-stream/page/1",
  "type": "OrderedCollectionPage",
  "page_info": {
    "current_page": "https://example.org/activity-stream/page/1",
    "next_page": "https://example.org/activity-stream/page/2",
    "prev_page": "https://example.org/activity-stream/page/0",
    "part_of": "https://example.org/activity-stream",
    "start_index": 0
  },
  "activities": [
    {
      "id": "https://example.org/activity/1",
      "type": "Update",
      "object_id": "https://example.org/manifest/1",
      "object_type": "Manifest",
      "canonical_uri": "https://example.org/iiif/manifest/1",
      "timestamp": "2024-01-15T10:00:00Z",
      "summary": "Manifest metadata updated"
    },
    {
      "id": "https://example.org/activity/2",
      "type": "Create",
      "object_id": "https://example.org/collection/1",
      "object_type": "Collection",
      "timestamp": "2024-01-14T15:30:00Z"
    }
  ]
}

A/V Content Structure

{
  "url": "https://example.org/av-manifest",
  "id": "https://example.org/av-manifest",
  "type": "Manifest",
  "label": "Lecture Recording",
  "total_duration": 3600,
  "media_items": [
    {
      "id": "https://example.org/lecture-part1.mp4",
      "type": "Video",
      "format": "video/mp4",
      "label": "Part 1: Introduction",
      "duration": 1200,
      "dimensions": {
        "width": 1920,
        "height": 1080
      },
      "canvas_id": "https://example.org/canvas/1"
    },
    {
      "id": "https://example.org/lecture-part2.mp4",
      "type": "Video",
      "format": "video/mp4",
      "label": "Part 2: Main Content",
      "duration": 2400,
      "dimensions": {
        "width": 1920,
        "height": 1080
      },
      "canvas_id": "https://example.org/canvas/2"
    }
  ],
  "ranges": [
    {
      "id": "https://example.org/range/intro",
      "label": "Introduction",
      "start_time": 0,
      "end_time": 300,
      "items": ["https://example.org/canvas/1"]
    },
    {
      "id": "https://example.org/range/main",
      "label": "Main Presentation",
      "start_time": 300,
      "end_time": 3600,
      "items": ["https://example.org/canvas/1", "https://example.org/canvas/2"]
    }
  ]
}

Authentication Structure

Auth Info Response

{
  "resource_url": "https://example.org/protected-manifest.json",
  "requires_auth": true,
  "auth_api_version": "v2",
  "login_services": [
    {
      "id": "https://example.org/auth/login",
      "profile": "http://iiif.io/api/auth/2/login",
      "label": "Login to Example Library",
      "header": "Please authenticate",
      "description": "Access requires institutional login",
      "confirm_label": "Login",
      "auth_api_version": "v2"
    }
  ],
  "token_services": [
    {
      "id": "https://example.org/auth/token",
      "profile": "http://iiif.io/api/auth/2/token",
      "auth_api_version": "v2"
    }
  ],
  "logout_services": [
    {
      "id": "https://example.org/auth/logout",
      "profile": "http://iiif.io/api/auth/2/logout",
      "label": "Logout",
      "auth_api_version": "v2"
    }
  ],
  "probe_services": [],
  "auth_services": [
    // Complete list of all auth-related services
  ]
}

Authentication Session Response

{
  "success": true,
  "session": {
    "resourceUrl": "https://example.org/protected-manifest.json",
    "authType": "cookie",
    "expiresAt": "2024-01-15T11:00:00Z",
    "hasToken": false,
    "hasCookie": true
  }
}

Probe Access Response

{
  "resourceUrl": "https://example.org/protected-manifest.json",
  "hasAccess": true
}

Contributing

When implementing new features:

  1. Update the implementation status in this README

  2. Add detailed parameter documentation

  3. Include usage examples

  4. Write tests for the new functionality

  5. Support both formatted text and structured JSON output

Future Enhancements

For detailed information about planned improvements and architectural enhancements, see FUTURE_ENHANCEMENTS.md.

Key areas under consideration:

  • Full browser-based authentication support via local proxy server

  • Enhanced cookie management for CLI environments

  • Additional IIIF API features

License

MIT

Available Tools

11 tools
iiif-activityB

Retrieve and process IIIF Change Discovery API activity streams

ParametersJSON Schema
NameRequiredDescriptionDefault
activityStreamUrlNoThe URL of the IIIF Activity Stream (OrderedCollection)
pageUrlNoThe URL of a specific activity page (OrderedCollectionPage)
structuredNoReturn structured JSON data instead of formatted text

TDQS

B3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description must convey behavioral traits. It mentions 'process' but does not specify read-only nature, side effects, authentication needs, or pagination behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence is concise but lacks details; it is generic and does not fully earn its place.

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?

Description is too brief for a tool interacting with IIIF Change Discovery API. No output schema; 'process' is vague. Incomplete given domain complexity.

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?

Input schema covers 100% of parameters. Description does not add meaning beyond schema; baseline 3 is appropriate.

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 process' and the resource 'IIIF Change Discovery API activity streams'. It is specific and distinct from sibling IIIF tools.

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?

No guidance on when to use this tool versus alternatives (e.g., other IIIF tools). No context about use cases or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

iiif-annotationC

Extract and analyze annotations from IIIF resources

ParametersJSON Schema
NameRequiredDescriptionDefault
sourceYesEither an annotation URL or a manifest URL to extract annotations from
languageNoFilter annotations by language code (e.g., "en", "fr")
groupByCanvasNoGroup annotations by their target canvas
includeNonTextNoInclude non-text annotations in the results
structuredNoReturn structured JSON data instead of formatted text

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description is the sole source of behavioral info. It only says 'extract and analyze' but does not disclose side effects (e.g., network calls), permissions, or whether it is read-only.

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?

One sentence, no wasted words. However, it is almost too brief; could be slightly expanded without losing conciseness.

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 5 parameters and no output schema, the description is inadequate. It does not explain return format, the effect of parameters like groupByCanvas, or how annotations are extracted.

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 coverage is 100%, so baseline is 3. The description adds no additional meaning beyond the parameter descriptions in the schema. Parameters are well-documented in schema but tool description does not reference them.

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 'Extract and analyze annotations from IIIF resources' clearly states the verb and resource, distinguishing it from sibling tools like iiif-manifest or iiif-image. However, 'analyze' is somewhat vague.

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?

No guidance on when to use this tool versus alternatives (e.g., iiif-search for searching annotations). The description does not provide any context on usage scenarios.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

iiif-authB

Authenticate with IIIF resources and access protected content

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesThe authentication action to perform
resourceUrlYesThe URL of the IIIF resource
usernameNoUsername for authentication (when action is authenticate)
passwordNoPassword for authentication (when action is authenticate)
tokenNoManually provide an access token (when action is authenticate)
sessionIdNoManually provide a session ID (when action is authenticate)
interactiveNoUse interactive browser-based authentication (when action is authenticate)
structuredNoReturn structured JSON data instead of formatted text

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must fully disclose behavior. It only states 'Authenticate with IIIF resources and access protected content' without explaining side effects like session creation or token storage, and does not mention the multiple actions available.

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 a single concise sentence. However, it is perhaps too brief, lacking structured detail for a complex tool with 8 parameters.

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 authentication (8 parameters, multiple actions, no output schema), the description is insufficient. It does not explain the authentication flow, return values, or how actions relate to parameters.

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 coverage is 100%, so parameters are already well-documented. The description adds no additional context or examples beyond the schema, such as explaining which action values correspond to which behaviors.

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 uses the verb 'Authenticate' and specifies the resource 'IIIF resources' and outcome 'access protected content'. It clearly distinguishes from sibling tools like iiif-annotation or iiif-manifest.

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?

No guidance on when to use this tool versus alternatives, nor any prerequisites or context for choosing authentication methods. The description is silent on usage scenarios.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

iiif-avB

Extract and analyze audio/video content from IIIF manifests

ParametersJSON Schema
NameRequiredDescriptionDefault
manifestUrlYesThe URL of the IIIF manifest containing A/V content
includeRangesNoInclude structural ranges/chapters in the output
structuredNoReturn structured JSON data instead of formatted text

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are present, so the description must fully disclose behavioral traits. It only says 'extract and analyze' but does not explain what extraction entails (e.g., download, stream), what analysis produces, or any prerequisites like authentication or rate limits.

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 a single sentence with no superfluous words. It is concise and to the point, though it could benefit from slight elaboration on the 'analyze' aspect.

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 output schema and no annotations, the description is insufficiently complete. It does not explain what the output looks like (e.g., extracted audio file, transcript, metadata) or the behavior of the 'structured' parameter. The tool's full capabilities are unclear.

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 the schema already documents all parameters (manifestUrl, includeRanges, structured). The description adds no additional semantic meaning beyond what the schema provides.

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 tool extracts and analyzes audio/video content from IIIF manifests. It uses a specific verb ('extract and analyze') and resource ('audio/video content from IIIF manifests'), distinguishing it from sibling tools like iiif-image or iiif-manifest.

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?

No guidance is provided on when to use this tool versus alternatives. Sibling tools such as iiif-image and iiif-manifest exist, but the description does not compare them or specify conditions for selecting iiif-av.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

iiif-canvas-infoB

Get detailed information about a specific canvas

ParametersJSON Schema
NameRequiredDescriptionDefault
manifestUrlYesThe URL of the IIIF manifest
canvasIdNoCanvas ID (if omitted, returns first canvas)
canvasIndexNoCanvas index (0-based)
includeAnnotationsNoInclude annotation details (default: true)
includeImageInfoNoFetch Image API info.json (default: false)
includeStructuresNoInclude structural information (default: false)
structuredNoReturn structured JSON data instead of formatted text

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description does not disclose any behavioral traits beyond the basic action. With no annotations available, it fails to mention that the tool may fetch external resources (e.g., Image API info) or that it is read-only, leaving the agent uninformed about side effects or constraints.

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 sentence with no redundancy. Every word serves a purpose, and the structure is front-loaded with the key action.

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 7 parameters, including booleans with defaults, and no output schema, the description lacks completeness. It does not clarify the return format (text vs. JSON), the scope of 'detailed information,' or the implications of optional parameters.

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 baseline is 3. The main description adds no additional meaning beyond the schema; it does not explain what 'detailed information' entails or how parameters affect the output.

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 action (get) and the resource (detailed information about a specific canvas). It distinguishes from siblings like iiif-manifest and iiif-manifest-canvases which focus on manifests or listing canvases.

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, nor does it mention any exclusions or prerequisites. It simply states what it does without context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

iiif-collectionC

Retrieve and navigate IIIF collections

ParametersJSON Schema
NameRequiredDescriptionDefault
collectionUrlYesThe URL of the IIIF collection
includeItemsNoInclude detailed list of collection items (default: true)
structuredNoReturn structured JSON data instead of formatted text

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It only states 'retrieve and navigate' without explaining side effects, data volume implications, or authorization needs. The boolean parameters suggest formatting options but the description does not clarify behavior.

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 a single sentence with no wasted words. It is concise but could include more detail without becoming verbose.

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 number of sibling IIIF tools and lack of output schema, the description does not provide enough context for an agent to understand the full capabilities or differentiate usage. It omits details about collection structure and navigation mechanics.

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 coverage is 100% and the description adds no extra meaning beyond parameter names and types. The baseline of 3 is appropriate as the schema already documents the parameters adequately.

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 'Retrieve and navigate IIIF collections' clearly identifies the action (retrieve/navigate) and resource (IIIF collections), distinguishing it from sibling tools like iiif-manifest which targets individual manifests. However, the term 'navigate' could be more specific.

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?

No guidance is provided on when to use this tool versus alternatives such as iiif-manifest, iiif-search, or iiif-canvas-info. The description lacks context for selection or prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

iiif-imageB

Build IIIF Image API URLs and retrieve image information

ParametersJSON Schema
NameRequiredDescriptionDefault
imageUrlYesBase URL of the IIIF image (without parameters)
regionNoImage region (full, square, x,y,w,h, or pct:x,y,w,h)
sizeNoImage size (max, w,h, w,, ,h, pct:n, or !w,h)
rotationNoRotation in degrees (0-360, optionally prefixed with ! for mirroring)
qualityNoImage quality
formatNoImage format
infoNoIf true, retrieve image information instead of building URL
structuredNoReturn structured JSON data instead of formatted text

TDQS

B3.4/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. It mentions two behaviors (building URL and retrieving info) but does not disclose any edge cases, error handling, rate limits, or further behavioral details beyond the schema.

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 a single front-loaded sentence with no wasted words. It is efficient, though slightly more detail could be added without sacrificing conciseness.

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 8 parameters, 1 required, and no output schema, the description is adequate for the two main actions. However, it does not explain the return format for info mode, leaving some gap in completeness.

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 baseline is 3. The description adds no additional meaning beyond what the schema already provides for each parameter, such as region syntax or enum values.

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 tool builds IIIF Image API URLs and retrieves image information, specifying verb and resource. It distinguishes from siblings like iiif-manifest or iiif-collection which handle other IIIF resources.

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 for IIIF image URL construction or info retrieval, but lacks explicit guidance on when to use this tool versus alternatives (e.g., iiif-image-fetch) and does not specify when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

iiif-image-fetchB

Fetch actual IIIF image data with automatic size constraints

ParametersJSON Schema
NameRequiredDescriptionDefault
imageUrlYesImage API base URL (e.g., "https://example.org/iiif/image123")
regionNoImage region - "full" (default), "square", "x,y,w,h", or "pct:x,y,w,h"
sizeNoImage size - "max" (default), "w,", ",h", "pct:n", "w,h", or "!w,h"
rotationNoRotation - "0" (default) to "359", optionally prefixed with "!" for mirroring
qualityNoImage quality - "default", "color", "gray", or "bitonal"
formatNoOutput format - "jpg" (default), "png", "webp", "tif", "gif", or "pdf"
maxDimensionNoMaximum dimension constraint in pixels (default: 1500)
maxPixelsNoMaximum total pixels (default: 1000000)

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must carry the full burden. It only hints at 'automatic size constraints' but does not explain what happens when constraints are exceeded (e.g., resizing, error), nor does it mention authentication needs, rate limits, or side effects. The schema already describes maxDimension and maxPixels, so the description adds minimal behavioral context.

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 a single 9-word sentence, concise and front-loaded. However, it could be more informative while remaining concise (e.g., mentioning the return type). No waste but slight under-specification.

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 (8 parameters, no output schema), the description is incomplete. It does not explain what the tool returns (binary image data? file format? response structure) or how to handle the output. The tool is a fetch operation, but no mention of whether it downloads or returns a URL.

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% (all 8 parameters are described in the schema), so baseline is 3. The description adds the phrase 'with automatic size constraints', which loosely connects to maxDimension and maxPixels but does not provide new meaning beyond the schema. No additional parameter semantics are given.

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 uses a specific verb ('Fetch') and resource ('IIIF image data') with a differentiator ('automatic size constraints'). It clearly distinguishes from sibling tools like iiif-image (which likely deals with image metadata or info) and other IIIF tools.

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?

No guidance on when to use this tool vs alternatives like iiif-image or iiif-manifest-canvases. The description does not mention when not to use it or provide any contextual usage hints.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

iiif-manifestC

Retrieve and parse IIIF manifest metadata

ParametersJSON Schema
NameRequiredDescriptionDefault
manifestUrlYesThe URL of the IIIF manifest
propertiesNoSpecific properties to retrieve (if not specified, all properties are returned)
structuredNoReturn structured JSON data instead of formatted text

TDQS

C2.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description should disclose behavioral details such as data format, parsing specifics, or potential side effects. It only states 'Retrieve and parse' without explaining how results are returned or what parsing entails.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The single-sentence description is concise but lacks structure and front-loads limited information. It could be more efficient by incorporating key details about parameters and output.

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 output schema and multiple sibling tools, the description should explain return format and help differentiate usage. It misses these elements, making it incomplete for an agent to decide when and how to use this tool.

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 fully describes all three parameters with 100% coverage, so the baseline is 3. The description adds no additional meaning beyond what the schema already provides.

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 ('Retrieve and parse') and the resource ('IIIF manifest metadata'), distinguishing it from sibling tools like iiif-collection or iiif-image. However, it could be more specific about the parsing behavior (e.g., returning structured data vs. text).

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?

No guidance is provided on when to use this tool versus alternatives like iiif-manifest-canvases or iiif-collection. The description lacks context for appropriate use cases or prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

iiif-manifest-canvasesB

List all canvases within a IIIF manifest with filtering options

ParametersJSON Schema
NameRequiredDescriptionDefault
manifestUrlYesThe URL of the IIIF manifest
filterNoFiltering options for canvases
includeMetadataNoInclude canvas metadata (default: false)
includeThumbnailNoInclude thumbnail URLs (default: true)
structuredNoReturn structured JSON data instead of formatted text

TDQS

B3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so the description must fully disclose behavior. It only states 'list', implying a read-only operation, but fails to mention potential side effects (e.g., network calls, timeouts) or any other behavioral traits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence, but it is somewhat vague and not front-loaded with critical information. It could be more precise without being longer.

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?

With five parameters, a nested filter object, and no output schema, the description is insufficient. It does not explain what a canvas is, the output format, or how the filter works, leaving the agent with significant gaps.

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 each parameter is already documented. The description adds no additional semantic detail beyond 'with filtering options', leading to a baseline score of 3.

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 action (list), the resource (canvases within a IIIF manifest), and mentions filtering options, which distinguishes it from sibling tools like iiif-manifest or iiif-canvas-info.

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?

No guidance on when to use this tool versus alternatives. The description does not mention prerequisites, exclusions, or scenarios where other tools (e.g., iiif-canvas-info) would be more appropriate.

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. Dates show when Glama detected each change.

  1. 11 tool updatesv1.1.0
    • First observediiif-activity
    • First observediiif-annotation
    • First observediiif-auth
    • First observediiif-av
    • First observediiif-canvas-info
    • First observediiif-collection
    • First observediiif-image
    • First observediiif-image-fetch
    • First observediiif-manifest
    • First observediiif-manifest-canvases
    • First observediiif-search

TDQS

A3.5/5.0
Disambiguation5/5

Each tool has a distinct purpose within the IIIF domain, covering activities, annotations, auth, AV, canvas details, collections, image building and fetching, manifests, and search. There is no meaningful overlap that would cause confusion for an agent.

Naming Consistency5/5

All tools use the consistent prefix 'iiif-' followed by a descriptive noun or noun phrase in snake_case. This uniform pattern makes the tool set predictable and easy to navigate.

Tool Count5/5

With 11 tools, the server covers the major IIIF operations without being bloated. Each tool serves a clear need, and the count is appropriate for the complexity of the IIIF standard.

Completeness4/5

The tool set covers core IIIF functionalities including manifest retrieval, collection navigation, canvas info, image building and fetching, annotations, search, auth, AV, and activity streams. Minor gaps exist (e.g., no tool for creating or modifying resources), but for a retrieval and analysis client, it is comprehensive.

Maintenance

ActivityInactive
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    A MCP Server that lets user ask AI models to discover the collection of the Metropolitan Museum of Art. Adds the discovered art works as Resources on the server.
    4
    2,264
    33
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    MCP server for reading C2PA content provenance manifests from media files, enabling natural language queries about AI-generated content, signatures, and provenance.
    2
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    An MCP server for browsing and downloading open-licensed imagery from major museum and archive APIs including Wellcome, Met, Library of Congress, Smithsonian, and Europeana.
    12
    23
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/code4history/IIIF_MCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server