dc-api-v2
MCP serverAI & modelsThis integration connects your AI to the Northwestern University Libraries Digital Collections. Once it is added, your AI can search the libraries' digitized materials and bring back information about items in the collections.
Use dc-api-v2 in Claude, ChatGPT or Ahel Desktop
Free. Sign in, add dc-api-v2 and connect your AI. About a minute.
Also: Claude Code · Cursor · Codex
Then ask your AI: use dc-api-v2 to search
No key or account is asked for. Not verified by us yet: Ahel has not run a call through it.
Details
Available today. Use it from your connected AI after setup.
No key or account is asked for. Not verified by us yet: Ahel has not run a call through it.
Add the integration, then ask your AI to search Northwestern's digital collections or look up a specific item.
What your AI can do with it
- Search Northwestern University Libraries' digital collections
- Look up details about items in the collections
- Find digitized materials on a topic you are researching
- Browse what the libraries have made available online
- Answer questions using materials from the collections
Install dc-api-v2
The server’s own address, for the clients that take one directly. Or connect Ahel once and every client you use reads it from one address, with the account kept on Ahel rather than in each client’s config.
Claude Code
claude mcp add --transport http --scope user dc-api-v2 'https://api.dc.library.northwestern.edu/api/v2/mcp'Run it once in your project, then open /mcp to approve any sign-in the server asks for.
Claude Desktop
https://api.dc.library.northwestern.edu/api/v2/mcpAdd a custom connector in Settings, paste this address, and approve the sign-in.
Cursor
cursor://anysphere.cursor-deeplink/mcp/install?name=dc-api-v2&config=eyJ1cmwiOiJodHRwczovL2FwaS5kYy5saWJyYXJ5Lm5vcnRod2VzdGVybi5lZHUvYXBpL3YyL21jcCJ9Open the link and Cursor adds the server at that address.
ChatGPT
https://api.dc.library.northwestern.edu/api/v2/mcpIn Settings, enable Developer mode, create an MCP app, and paste this address. Your plan and workspace must allow custom apps.
Codex
codex mcp add dc-api-v2 --url 'https://api.dc.library.northwestern.edu/api/v2/mcp'Run it once, then sign in with codex mcp login dc-api-v2 if the server asks for an account.
From the project's README
As published by nulib/dc-api-v2 in README.md.
Local development setup
env.json
The env.json file contains environment variable values for the lambda functions defined in the API for use in local development. You can create an env.json file containing the values to run the API against your dev data by running:
make env.json
If the file already exists, it will not be overwritten unless you include -B in the make command.
Running the API locally
To start the API in development mode, first make sure you have the correct version of the AWS SAM command line utility installed:
asdf install aws-sam-cli
Then run the following command:
make serve
The API will be available at:
https://USER_PREFIX.dev.rdc.library.northwestern.edu:3002- Don't forget to open port 3002 if you want to access it remotely
⚠️ Note the above URLs (which point to your local OpenSearch instance) need full endpoints to resolve. For example:
https://USER_PREFIX.dev.rdc.library.northwestern.edu:3002/searchhttps://USER_PREFIX.dev.rdc.library.northwestern.edu:3002/collections
View supported endpoints Questions? View the production API documentation
Chaos middleware
The API supports simulated network effects (errors and delays) for local testing via the CHAOS_CONFIG environment variable. If the variable is absent the middleware is disabled entirely.
Set it to an inline JSON array:
export CHAOS_CONFIG='[
{ "pattern": "/works/:id", "effect": "error", "status": 500, "chance": 0.3 },
{ "pattern": "/auth/whoami", "effect": "delay", "ms": 500 },
{ "pattern": "/file-sets/*", "effect": "delay", "ms": [100, 800] }
]'
Or set it to the path of a JSON file containing the same array:
export CHAOS_CONFIG=/path/to/chaos.json
Each rule has a pattern (matched against the request path) and an effect:
| Effect | Fields | Behavior |
|---|---|---|
error | status (HTTP status code), chance (0–1) | Returns {"error":"chaos"} with the given status; fires chance * 100% of the time |
delay | ms (number or [min, max]) | Pauses for the given number of milliseconds (random within range if a tuple) |
All matching rules are evaluated in order. Delay rules accumulate; an error rule short-circuits the request only when it fires — otherwise evaluation continues to the next rule.
Example workflows
Meadow
View and edit information about a specific Work in the Index.
- Open a local Meadow instance.
- Find an
idof a Work you'd like to inspect in the API. - View JSON response at
https://USER_PREFIX.dev.rdc.library.northwestern.edu:3002/works/[WORK_ID] - View IIIF Manifest JSON response at
https://USER_PREFIX.dev.rdc.library.northwestern.edu:3002/works/[WORK_ID]?as=iiif
IIIF content search
IIIF Presentation responses expose IIIF Content Search 2.0 services for transcription annotations:
- Work manifests include a
SearchService2entry forhttps://USER_PREFIX.dev.rdc.library.northwestern.edu:3002/works/[WORK_ID]/search?as=iiif - File set canvases include a
SearchService2entry forhttps://USER_PREFIX.dev.rdc.library.northwestern.edu:3002/file-sets/[FILE_SET_ID]/search?as=iiif
To search transcription text, include a non-empty q parameter:
curl "https://USER_PREFIX.dev.rdc.library.northwestern.edu:3002/works/[WORK_ID]/search?as=iiif&q=[QUERY]"
curl "https://USER_PREFIX.dev.rdc.library.northwestern.edu:3002/file-sets/[FILE_SET_ID]/search?as=iiif&q=[QUERY]"
Both endpoints return a IIIF AnnotationPage whose items target the matching work canvas or file set canvas. Requests without as=iiif or a non-empty q return 400.
For help debugging/inspecting, JavaScript console messages are written to: dc-api-v2/dc-api.log
DC
Develop against changes to the API.
- Before starting the DC app, temporarily change the port number in
dc-nextjs/server.jsfrom default3000to something like3003. - Open the port so it can be accessed in the browser.
sgport open all 3003
- Point to the proxy URL and start DC app (in your
/environment/dc-nextjsshell)
export NEXT_PUBLIC_DCAPI_ENDPOINT=https://USER_PREFIX.dev.rdc.library.northwestern.edu:3002
bun run dev
Access the app in a browser at: https://USER_PREFIX.dev.rdc.library.northwestern.edu:3003/
Running the API locally with state machine + lambdas (needed for AV download route)
# From the repo root
cd dc-api-v2
# Start the API + step function and associated lambdas
make start-with-step
# Open a second terminal and create the state machine
make state-machine
Deploying a development branch
There are two ways to deploy a development branch: make deploy and make sync. The differences are:
- Changes:
deploydeploys a static stack, and requires anotherdeployto update it.syncwatches for changes in realtime. - Dependencies:
deployuses theapiDependenciesresource defined in the template for dependencies, whilesyncuses the AWS SAM CLI's built-in development dependency logic.
Either way, the resulting stack will be accessible at https://dcapi-USER_PREFIX.rdc-staging.library.northwestern.edu.
An existing sync stack can be reused by running make sync again, or by running make sync-code to only
sync code changes (no infrastructure/template changes).
samconfig.*.yaml
Both methods involve a samconfig.USER_PREFIX.yaml file. This file, with default values, can be created by
running (for example):
make samconfig.mbk.yaml
This will create a configuration to stand up the default stacks in both deploy mode (API, AV Download, and Chat) and
sync mode (Chat only). To deploy a different combination of features, specify them using the WITH option:
make samconfig.mbk.yaml WITH=API,DOCS
Available features are: API, AV_DOWNLOAD, CHAT, and DOCS.
⚠️ Be very careful including the API in sync mode as every change within /api will take a long time to deploy.
As with the env.json file, make will not overwrite an existing file unless you include -B.
Tearing down a development stack
sam delete --stack-name dc-api-USER_PREFIX
Writing Documentation
API documentation is automatically regenerated and deployed on pushes to the staging and production branches. The documentation is in two parts:
Regular Docs
The docs directory contains a standard mkdocs project, which can be edited using the same tools and format as the main Repository Documentation.
In a nutshell:
- Clone this project into a working directory (which you probably already have).
- Edit the Markdown files in the
docs/docsdirectory. - To run
mkdocslocally and preview your work:
Docs will be accessible at http://USER_PREFIX.dev.rdc.library.northwestern.edu:8000/sgport open all 8000 make serve-docs
OpenAPI/Swagger Docs
We also maintain an OpenAPI Specification under the docs directory in spec/openapi.yaml. When mkdocs is running, the Swagger UI can be found at http://USER_PREFIX.dev.rdc.library.northwestern.edu:8000/spec/openapi.html. Like the rest of the documentation, changes to the YAML will be immediately visible in the browser.
The existing spec files (openapi.yaml, types.yaml, and data-types.yaml) are the best reference for understanding and updating the spec. It's especially important to understand how openapi.yaml uses the $ref keyword to refer to reusable elements defined in types.yaml, and how types.yaml pulls model schemas from data-types.yaml.
For an in-depth look, or to learn how to define things for which there aren't good examples in our spec, refer to the full OpenAPI documentation.
Build Artifacts
openapi.html renders the Swagger UI directly from the unmodified openapi.yaml. In addition, the build process generates a JSON copy of the spec using the OpenAPI Generator CLI. In order to make sure the spec is valid before checking it in, run:
bun run validate-spec
This check is also part of the CI test workflow, so an invalid spec file will cause the branch to fail CI.
DC API Typescript NPM package
Typescript types for the schemas (Works, Collections, FileSets) are automatically published to the nulib/dcapi-types repo on deploys.
- If a deploy to the
deploy/stagingbranch contains changes to thedocs/docs/spec/data-types.yamlfile, new types are generated and a commit is made to thestagingbranch ofnulib/dcapi. This is intended to be for local testing by NUL devs against the private staging API. - If a deploy to production (
mainbranch) contains changes to thedocs/docs/spec/data-types.yamlfile, new types are generated and a PR is opened into themainbranch ofnulib/dcapi-types. Also, an issue is created innulib/repodev_planning_and_docsto review the PR and publish the types package (manually).
Versioning
The current API version is maintained in several different project files. To increment the version, use
make version BUMP=<major|minor|patch>
If you don't specify a BUMP value, the command will simply print the current version.
Tools it offers (8)
What this server listed when Ahel dialed its public endpoint in Oct 2026, with no key and no account of yours. The names are the server’s own.
searchget-worklist-collectionssimilarity-searchview-workview-collectionview-search-resultsview-similar-works
Signals
- GitHub stars
- 14
- Forks
- 1
- Last commit
- Sep 2026
Advanced
- Delivery
- dc-api MCP server → your Ahel connector (mcp.ahel.ai) → your AI.
- Item type
- mcp-server
- Key
io-github-nulib-dc-api- Source
- github.com/nulib/dc-api-v2
- Hosted endpoint
https://api.dc.library.northwestern.edu/api/v2/mcp
More in AI & models
MCP server · upstash
More in AI & modelsAdButler
MCP server · adbutler
More in AI & modelsatom-mcp-server
MCP server · a7om-ai
More in AI & modelsottasia
MCP server · aiweather-anurag
More in AI & modelsunphurl
MCP server · 123ergo
More in AI & modelsmicrosoft-learn-mcp
MCP server · microsoftdocs
More in AI & models