Northwestern University Libraries Digital Collections API
RemoteAbout Northwestern University Libraries Digital Collections API
A hosted MCP server for Northwestern University Libraries Digital Collections, intended for assistants exploring digitized library materials. It supports search, similarity discovery, collection browsing, metadata retrieval, and IIIF manifests.
Key features
- 01Field-based and natural-language search
- 02Visual and semantic similarity search
- 03Retrieve work metadata
- 04View work and collection IIIF manifests
- 05Browse digital collections
Use cases
- 01Find digitized works by query
- 02Discover visually or semantically related works
- 03Retrieve metadata for a known work
- 04Browse a collection in an IIIF viewer
MCP support
Exposes Digital Collections search, browsing, metadata, and IIIF operations as MCP tools. A hosted endpoint is available over Streamable HTTP.
Configuration
Remote servers need no local install. Pick your client, then copy the config or install in one click.
https://api.dc.library.northwestern.edu/api/v2/mcpclaude mcp add --transport http nulib-dc-api https://api.dc.library.northwestern.edu/api/v2/mcp{"mcpServers":{"nulib-dc-api":{"type":"http","url":"https://api.dc.library.northwestern.edu/api/v2/mcp"}}}Open in Cursor{"servers":{"nulib-dc-api":{"type":"http","url":"https://api.dc.library.northwestern.edu/api/v2/mcp"}}}Open in VS Code{"mcpServers":{"nulib-dc-api":{"type":"http","url":"https://api.dc.library.northwestern.edu/api/v2/mcp"}}}{"mcpServers":{"nulib-dc-api":{"serverUrl":"https://api.dc.library.northwestern.edu/api/v2/mcp"}}}Run commands in a terminal; paste JSON into the client’s MCP config and restart. Servers that need sign-in will prompt on first connect.
Tools
8| Parameter | Type | Required | Description |
|---|---|---|---|
| page | number | No | The page of search results to return |
| query | string | No | A natural language query. Best for exploratory / conceptual searches. |
| fields | object | No | Structured field search. Best when searching for specific known items or values, or for narrowing a search by specifying particular fields to search within. |
| fields.text | string | No | Full text associated with the work |
| fields.genre | string | No | Describes what the original object is, not what it is about |
| fields.notes | string | No | Notes associated with the work |
| fields.title | string | No | The title of the work |
| fields.caption | string | No | The caption for a work |
| fields.creator | string | No | An entity primarily responsible for making the work |
| fields.license | enum | No | The Creative Commons license for the workAll rights reserved | Attribution 3.0 United States | Attribution 4.0 International | Attribution-NoDerivatives 4.0 International | Attribution-NoDerivs 3.0 United States | Attribution-NonCommercial 3.0 United States | Attribution-NonCommercial 4.0 International | Attribution-NonCommercial-NoDerivatives 4.0 International | Attribution-NonCommercial-NoDerivs 3.0 United States | Attribution-NonCommercial-ShareAlike 3.0 United States | Attribution-NonCommercial-ShareAlike 4.0 International | Attribution-ShareAlike 3.0 United States | Attribution-ShareAlike 4.0 International | CC0 1.0 Universal | Public Domain Mark 1.0 |
| fields.subject | string | No | The subject of the work |
| fields.abstract | string | No | A summary of the work |
| fields.keywords | string | No | Keywords or tags used to describe this content |
| fields.language | string | No | A language of the work |
| fields.location | string | No | Place of publication |
| fields.publisher | string | No | An entity responsible for making the work available |
| fields.technique | string | No | The technique used in the creation of the work |
| fields.work_type | enum | No | The type of the workAudio | Image | Video |
| fields.collection | string | No | The parent collection of the work |
| fields.contributor | string | No | An entity responsible for making contributions to the work |
| fields.description | string | No | An account of the work |
| fields.library_unit | enum | No | The library unit responsible for the workSpecial Collections | Faculty Collections | Government and Geographic Information Collection | Herskovits Library | Music Library | Transportation Library | University Archives | University Main Library |
| fields.style_period | string | No | A defined style, historical period, group, school, dynasty, movement, etc. whose characteristics are represented in the work. |
| fields.alternate_title | string | No | Alternate titles for the work |
| fields.controlled_terms | string | No | All controlled terms associated with the work, across all fields. Useful for searching across all controlled fields simultaneously without specifying which field. |
| fields.rights_statement | enum | No | The rights statement of the workCopyright Not Evaluated | Copyright Undetermined | In Copyright | In Copyright - Educational Use Permitted | In Copyright - EU Orphan Work | In Copyright - Non-Commercial Use Permitted | In Copyright - Rights-holder(s) Unlocatable or Unidentifiable | No Copyright - Contractual Restrictions | No Copyright - Non-Commercial Use Only | No Copyright - Other Known Legal Restrictions | No Copyright - United States | No Known Copyright |
| fields.table_of_contents | string | No | Used to provide the titles of separate works or parts of a resource. Information provided may also contain statements of responsibility or other sequential designations. |
| max_results | number | No | The maximum number of search results to return per page |
| public_only | boolean | No | Only include publicly available works in search results |
Details
From the project READMEdc-api-mcp
A Model Context Protocol (MCP) server that exposes Northwestern University Library's Digital Collections as tools for AI assistants. It provides tools for searching, browsing, and retrieving metadata and IIIF manifests for digitized library materials.
Available Tools
| Tool | Description |
|---|---|
search | Search for works using field-based and/or natural language queries |
similarity-search | Find works visually or semantically similar to a given work |
get-work | Retrieve full metadata for a single work by ID |
view-work | View a work's IIIF manifest for display in compatible viewers |
list-collections | List available digital collections |
view-collection | Browse a specific collection's IIIF manifest |
view-search-results | Retrieve results from a previous search |
view-similar-works | Retrieve results from a previous similarity search |
Using the Remote Endpoint
The server is available as a hosted remote at:
https://api.dc.library.northwestern.edu/api/v2/mcp
No local installation is required. Configure your MCP client to connect to this URL using the streamable HTTP transport.
Claude Desktop
Add the following to your Claude Desktop configuration file.
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"dc-api": {
"type": "http",
"url": "https://api.dc.library.northwestern.edu/api/v2/mcp"
}
}
}
Claude Code
claude mcp add --transport http dc-api https://api.dc.library.northwestern.edu/api/v2/mcp
Development
Requirements
- Node.js 24+ (see .tool-versions)
- mise (used by
bin/run.shto activate the correct runtime)
Setup
npm install
Configuration
The server reads the following environment variables:
| Variable | Default | Description |
|---|---|---|
DC_API_BASE | https://api.dc.library.northwestern.edu/api/v2 | Base URL for the Digital Collections API |
DC_IIIF_BASE | https://iiif.dc.library.northwestern.edu/iiif/3 | Base URL for the IIIF server |
SECRETS_PATH | (none) | Base path for AWS Secrets Manager config |
Running locally
stdio (for Claude Desktop / Claude Code)
bun run stdio
Or via the wrapper script (activates the correct Node.js version via mise):
bin/run.sh
HTTP (Streamable HTTP transport, port 3000)
bun run http
Configuring Claude Desktop (local build)
{
"mcpServers": {
"dc-api": {
"command": "/path/to/dc-api-v2/mcp/bin/run.sh"
}
}
}
Replace /path/to/dc-api-v2/mcp with the absolute path to this directory. Restart Claude Desktop after editing.
Tests
| Command | Result |
|---|---|
bun run test | Run the test suite |
bun test:watch | Run the test suite, watching for changes |
bun test:coverage | Run the test suite and calculate coverage |
bun test:record | Run the test suite against live data and record new fixtures |
- By default, the test suite uses pre-recorded HTTP fixtures. Set
MSW_MODE=liveto run against live data. bun test:recordrecords new fixtures (requiresmitmproxy:pip install mitmproxy).
Comments
New to MCP?
From what the protocol is to installing your first server, these answers cover most first questions.
An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.