hathitrust-catalog/SKILL.md
Look up bibliographic records and digitized volumes in HathiTrust's 17M+ volume collection by ISBN, OCLC, LCCN, ISSN, or HathiTrust ID. Use this skill whenever the user wants to check if a book has been digitized, find which libraries hold a copy, get MARC metadata for a known identifier, or link a bibliographic reference to its HathiTrust digital version. Also triggers when cross-referencing identifiers from other library catalogs (Harvard, Library of Congress) against HathiTrust holdings.
npx skillsauth add kltng/humanities-skills hathitrust-catalogInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Look up records and digitized volumes in HathiTrust's collection of 17M+ volumes from major research libraries.
HathiTrust's Bibliographic API retrieves records by known identifiers only. There is no keyword or title search. You must have an ISBN, OCLC number, LCCN, ISSN, or HathiTrust ID.
WORKS: https://catalog.hathitrust.org/api/volumes/brief/isbn/0140449264.json
NOT POSSIBLE: https://catalog.hathitrust.org/api/volumes/brief/search?q=hamlet
If you only have a title/author, search another catalog first (LibraryCloud, Library of Congress) to get an ISBN or OCLC number, then look it up here.
| Endpoint | Returns | Use when |
|----------|---------|----------|
| /api/volumes/brief/ | Metadata + items (no MARC) | You just need titles, ISBNs, holdings, digital access links |
| /api/volumes/full/ | Same + complete MARC-XML | You need full cataloging data |
When no record matches, the API returns {"records": {}, "items": []} with HTTP 200 — not a 404. Always check if records is empty.
Use the multi-ID endpoint to batch lookups:
/api/volumes/brief/json/isbn:0140449264|oclc:228668653
Pipe-separated as type:value. Max 20 per request.
| Type | Example | Notes |
|------|---------|-------|
| isbn | 0140449264 or 9780140449266 | ISBN-10 or ISBN-13, digits only (+ trailing X) |
| oclc | 228668653 | OCLC number, digits only |
| lccn | 72081773 | URL-encode spaces/slashes |
| issn | 03785955 | Digits only |
| htid | mdp.39015058510069 | HathiTrust volume ID |
| recordnumber | 000578050 | 9-digit HathiTrust record number |
{
"records": {
"009058846": {
"recordURL": "https://catalog.hathitrust.org/Record/009058846",
"titles": ["The Odyssey / Homer ; translated by Robert Fagles."],
"isbns": ["0140268863", "9780140268867"],
"oclcs": ["34228839"],
"lccns": ["96017900"],
"publishDates": ["1997"]
}
},
"items": [
{
"orig": "University of Michigan",
"htid": "mdp.39015042182054",
"itemURL": "https://babel.hathitrust.org/cgi/pt?id=mdp.39015042182054",
"rightsCode": "ic",
"usRightsString": "Limited (search-only)",
"lastUpdate": "20240115",
"enumcron": false
}
]
}
Key fields:
rightsCode: pd = public domain (full text available), ic = in-copyright (search only)usRightsString: "Full View" or "Limited (search-only)"itemURL: Direct link to the HathiTrust page-turner viewerenumcron: Volume/issue info (e.g., "vol. 3") or falseUse scripts/hathitrust_api.py for programmatic access (zero dependencies):
from scripts.hathitrust_api import HathiTrustAPI
ht = HathiTrustAPI()
# Single lookup
record = ht.lookup_isbn("0140449264")
# Multiple identifiers at once
results = ht.batch_lookup([
("isbn", "0140449264"),
("oclc", "228668653"),
("lccn", "96017900"),
])
# Get full MARC-XML
record = ht.lookup_isbn("0140449264", full=True)
marc = ht.get_marc_xml(record)
# Check if digitized and accessible
for item in ht.get_items(record):
print(f"{item['orig']}: {item['usRightsString']} — {item['itemURL']}")
# Summarize
print(ht.summarize(record))
# 1. Search Harvard for a title
from harvard_api import HarvardLibraryAPI
harvard = HarvardLibraryAPI()
results = harvard.search(title="dream of the red chamber")
isbn = harvard.get_identifiers(results[0]).get("isbn")
# 2. Check HathiTrust for digital version
from hathitrust_api import HathiTrustAPI
ht = HathiTrustAPI()
record = ht.lookup_isbn(isbn)
if record and ht.has_full_view(record):
print("Full text available:", ht.get_items(record)[0]["itemURL"])
access-control-allow-origin: *)references/api_reference.md — Complete API spec with all identifier types and response fieldsscripts/hathitrust_api.py — Python client with batch lookups, MARC extraction, and access checkingdevelopment
Query the China Biographical Database (CBDB) locally via SQLite for biographical data on 656K+ historical Chinese figures from the 7th century BCE through the 19th century CE. Use when searching for Chinese historical figures, scholars, officials, or literary figures — their biographical details, family/kinship networks, official postings, social associations, examination records, or addresses. Runs entirely locally after initial database download (~556 MB). Faster and more flexible than the API version.
development
Interact with a local Zotero 8 desktop application through its HTTP API at localhost:23119. Use this skill whenever the user wants to search, fetch, add, edit, or organize bibliographic items in their Zotero library, import citations (BibTeX, RIS, etc.), attach files, manage collections and tags, or retrieve full-text content from Zotero. Triggers on mentions of Zotero, citation management, reference libraries, bibliographic databases, or local library management. Also use when chaining with other catalog skills (Harvard, LOC, HathiTrust, etc.) to save found records into the user's Zotero library.
development
Search for items and properties on Wikidata and retrieve entity details, claims, and external identifiers. Supports both keyword search (Wikidata Action API) and semantic/hybrid search (Wikidata Vector Database), plus direct entity retrieval (Special:EntityData) and structured querying (WDQS SPARQL).
testing
Query and explore the TGAZ (Temporal Gazetteer) SQLite database of 82,000+ historical Chinese placenames spanning 763 BCE to 1911 CE. Use this skill whenever the user asks about historical Chinese places, administrative geography, dynastic jurisdictions, place name evolution, or wants to query tgaz.db. Also trigger when the user mentions CHGIS, TGAZ, historical gazetteer, Chinese historical GIS, or asks questions like "what was X called in dynasty Y", "what counties existed in year Z", "where was X located", or any spatial/temporal query about Chinese historical geography. This skill is relevant even for casual questions like "tell me about ancient Chang'an" or "Tang dynasty cities near the Yellow River".