IIIF MCP Server
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@IIIF MCP Serverget first image from manifest https://example.org/manifest.json"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 buildSingle-file Bundle (v1.1.0+)
npm run bundle
# Creates iiif-mcp-bundle.js - no npm install needed for deploymentUsage
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
Integration with Download Tools: Structured URLs and metadata can be easily passed to file download MCP servers
Batch Processing: Extract multiple image URLs or search results for automated workflows
Data Analysis: Parse and analyze IIIF metadata programmatically
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 mirroringquality(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 manifestfilter(object, optional): Filtering optionshasImage(boolean): Only include canvases with imageshasAnnotation(boolean): Only include canvases with annotationslabelPattern(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 manifestcanvasId(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
✅ iiif-search
Search within IIIF resources using the Content Search API.
Parameters:
searchServiceUrl(string, required): The URL of the IIIF Content Search service endpointquery(string, required): The search query stringstructured(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 manifestproperties(array, optional): Specific properties to retrieve. Options include:label: Title of the resourceid: Unique identifiertype: Resource typesummary: Description (v3) or description (v2)metadata: Descriptive metadata pairsrights: Rights/license informationprovider: Provider informationviewingDirection: Reading directionitems: Canvas/page informationstructures: Table of contentsthumbnail: 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 collectionincludeItems(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 URLstructured(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 fromlanguage(string, optional): Filter annotations by language code (e.g., "en", "fr")groupByCanvas(boolean, optional): Group annotations by their target canvasincludeNonText(boolean, optional): Include non-text annotations in the resultsstructured(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 contentincludeRanges(boolean, optional): Include structural ranges/chapters in the outputstructured(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 performinfo: Get authentication requirements without logging inauthenticate: Perform authentication with credentialsprobe: Check access to a resourcelogout: End authentication sessionget-protected: Fetch protected resource with active session
resourceUrl(string, required): The URL of the IIIF resourceusername(string, optional): Username for authentication (when action isauthenticate)password(string, optional): Password for authentication (when action isauthenticate)token(string, optional): Manually provide an access token (when action isauthenticate)sessionId(string, optional): Manually provide a session ID (when action isauthenticate)interactive(boolean, optional): Use interactive browser-based authentication (when action isauthenticate)structured(boolean, optional): Return structured JSON data instead of formatted text
Examples:
Check authentication requirements:
{
"tool": "iiif-auth",
"arguments": {
"action": "info",
"resourceUrl": "https://example.org/protected-manifest.json"
}
}Authenticate with credentials:
{
"tool": "iiif-auth",
"arguments": {
"action": "authenticate",
"resourceUrl": "https://example.org/protected-manifest.json",
"username": "testuser",
"password": "testpass"
}
}Authenticate with browser (interactive):
{
"tool": "iiif-auth",
"arguments": {
"action": "authenticate",
"resourceUrl": "https://example.org/protected-manifest.json",
"interactive": true
}
}Authenticate with manual token/session:
{
"tool": "iiif-auth",
"arguments": {
"action": "authenticate",
"resourceUrl": "https://example.org/protected-manifest.json",
"token": "your-access-token-here"
}
}Check access to resource:
{
"tool": "iiif-auth",
"arguments": {
"action": "probe",
"resourceUrl": "https://example.org/protected-manifest.json"
}
}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:
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
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:
Direct Authentication (Preferred for CLI):
{ "action": "authenticate", "resourceUrl": "https://example.org/protected-manifest.json", "username": "your-username", "password": "your-password" }Manual Token Authentication:
{ "action": "authenticate", "resourceUrl": "https://example.org/protected-manifest.json", "token": "your-access-token" }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=passwordExample 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 manifestrangeId(string, optional): Specific range to retrieve
Development
npm run dev # Run in development mode
npm test # Run testsAuthentication 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 arraysExtract 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 metadataTrack 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:
Update the implementation status in this README
Add detailed parameter documentation
Include usage examples
Write tests for the new functionality
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 toolsiiif-activityB
Retrieve and process IIIF Change Discovery API activity streams
| Name | Required | Description | Default |
|---|---|---|---|
| activityStreamUrl | No | The URL of the IIIF Activity Stream (OrderedCollection) | |
| pageUrl | No | The URL of a specific activity page (OrderedCollectionPage) | |
| structured | No | Return structured JSON data instead of formatted text |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| source | Yes | Either an annotation URL or a manifest URL to extract annotations from | |
| language | No | Filter annotations by language code (e.g., "en", "fr") | |
| groupByCanvas | No | Group annotations by their target canvas | |
| includeNonText | No | Include non-text annotations in the results | |
| structured | No | Return structured JSON data instead of formatted text |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | The authentication action to perform | |
| resourceUrl | Yes | The URL of the IIIF resource | |
| username | No | Username for authentication (when action is authenticate) | |
| password | No | Password for authentication (when action is authenticate) | |
| token | No | Manually provide an access token (when action is authenticate) | |
| sessionId | No | Manually provide a session ID (when action is authenticate) | |
| interactive | No | Use interactive browser-based authentication (when action is authenticate) | |
| structured | No | Return structured JSON data instead of formatted text |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| manifestUrl | Yes | The URL of the IIIF manifest containing A/V content | |
| includeRanges | No | Include structural ranges/chapters in the output | |
| structured | No | Return structured JSON data instead of formatted text |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| manifestUrl | Yes | The URL of the IIIF manifest | |
| canvasId | No | Canvas ID (if omitted, returns first canvas) | |
| canvasIndex | No | Canvas index (0-based) | |
| includeAnnotations | No | Include annotation details (default: true) | |
| includeImageInfo | No | Fetch Image API info.json (default: false) | |
| includeStructures | No | Include structural information (default: false) | |
| structured | No | Return structured JSON data instead of formatted text |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| collectionUrl | Yes | The URL of the IIIF collection | |
| includeItems | No | Include detailed list of collection items (default: true) | |
| structured | No | Return structured JSON data instead of formatted text |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| imageUrl | Yes | Base URL of the IIIF image (without parameters) | |
| region | No | Image region (full, square, x,y,w,h, or pct:x,y,w,h) | |
| size | No | Image size (max, w,h, w,, ,h, pct:n, or !w,h) | |
| rotation | No | Rotation in degrees (0-360, optionally prefixed with ! for mirroring) | |
| quality | No | Image quality | |
| format | No | Image format | |
| info | No | If true, retrieve image information instead of building URL | |
| structured | No | Return structured JSON data instead of formatted text |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. 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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| imageUrl | Yes | Image API base URL (e.g., "https://example.org/iiif/image123") | |
| region | No | Image region - "full" (default), "square", "x,y,w,h", or "pct:x,y,w,h" | |
| size | No | Image size - "max" (default), "w,", ",h", "pct:n", "w,h", or "!w,h" | |
| rotation | No | Rotation - "0" (default) to "359", optionally prefixed with "!" for mirroring | |
| quality | No | Image quality - "default", "color", "gray", or "bitonal" | |
| format | No | Output format - "jpg" (default), "png", "webp", "tif", "gif", or "pdf" | |
| maxDimension | No | Maximum dimension constraint in pixels (default: 1500) | |
| maxPixels | No | Maximum total pixels (default: 1000000) |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| manifestUrl | Yes | The URL of the IIIF manifest | |
| properties | No | Specific properties to retrieve (if not specified, all properties are returned) | |
| structured | No | Return structured JSON data instead of formatted text |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| manifestUrl | Yes | The URL of the IIIF manifest | |
| filter | No | Filtering options for canvases | |
| includeMetadata | No | Include canvas metadata (default: false) | |
| includeThumbnail | No | Include thumbnail URLs (default: true) | |
| structured | No | Return structured JSON data instead of formatted text |
TDQS
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.
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.
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.
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.
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.
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.
iiif-searchC
Search IIIF content using Content Search API
| Name | Required | Description | Default |
|---|---|---|---|
| searchServiceUrl | Yes | The URL of the IIIF Content Search service endpoint | |
| query | Yes | The search query string | |
| structured | No | Return structured JSON data instead of formatted text |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description should disclose behavioral traits. It does not mention what happens on error, if results are paginated, or the format of the output (beyond the optional structured parameter).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence, very concise and devoid of fluff. However, it sacrifices informativeness for brevity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of IIIF and the lack of output schema and annotations, the description is too minimal. It does not explain return values, error handling, or how to obtain the searchServiceUrl.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all parameters. The description adds no additional meaning beyond what the schema provides, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states 'Search IIIF content using Content Search API', which clearly identifies the action and resource. It distinguishes from sibling tools like iiif-manifest or iiif-collection by implying search functionality, but does not explicitly differentiate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidelines are provided on when to use this tool versus alternatives. The description does not mention prerequisites, limitations, 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.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
11 tool updates
v1.1.0- First observed
iiif-activity - First observed
iiif-annotation - First observed
iiif-auth - First observed
iiif-av - First observed
iiif-canvas-info - First observed
iiif-collection - First observed
iiif-image - First observed
iiif-image-fetch - First observed
iiif-manifest - First observed
iiif-manifest-canvases - First observed
iiif-search
TDQS
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.
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.
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.
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
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
MCP server for secureFlows: token-free URL builders and integration-linting tools for AI agents.
MCP server for searching Airweave collections with natural language queries.
MCP server for the Inistate platform: module discovery, entry management, and activity submission.
OAuth-protected, read-only-by-default MCP server for provenance-labeled QuillCaddie project memory.
Related MCP Servers
- AlicenseAqualityCmaintenanceA 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.42,26433MIT
- AlicenseNot gradedqualityDmaintenanceMCP server for reading C2PA content provenance manifests from media files, enabling natural language queries about AI-generated content, signatures, and provenance.2MIT
- AlicenseAqualityDmaintenanceMCP server for multi-provider AI image generation (AWS Bedrock, OpenAI, Google Gemini) enabling image generation, transformation, and editing through a unified interface.41MIT
- AlicenseAqualityDmaintenanceAn MCP server for browsing and downloading open-licensed imagery from major museum and archive APIs including Wellcome, Met, Library of Congress, Smithsonian, and Europeana.1223MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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