libofcongress-mcp-server
Search LOC digital collections, browse Chronicling America newspapers with full OCR text, and look up LC Subject Headings via MCP. STDIO or Streamable HTTP.
Install / Use
claude mcp add cyanheads -- npx -y github:cyanheads/libofcongress-mcp-serverIf the server publishes to npm under a different name, use that package instead — check the repo README.
MCP Server
Model Context Protocol server
Quality Score
Category
Education & ResearchSupported Platforms
Tags
Skill content
View source on GitHubPublic Hosted Server: https://libofcongress.caseyjhand.com/mcp
</div>Tools
Six tools covering the Library of Congress digital holdings — general search with format/date/subject/location filters, full item retrieval, Chronicling America newspaper search with OCR, single-page full-text fetch, LCSH subject heading lookup, and curated collection browsing:
| Tool | Description |
|:-----|:------------|
| libofcongress_search | Search LOC digital collections by keyword with optional format, date range, subject heading, geographic location, and collection filters. Returns item summaries with IDs for follow-up retrieval. |
| libofcongress_get_item | Retrieve full metadata for a specific LOC item — contributors, subjects, summary, languages, locations, rights, physical description, call number, formats, access restrictions, resource links (TIFF/JPEG/PDF), and related items. |
| libofcongress_search_newspapers | Search historical newspaper pages in the Chronicling America corpus. Returns pages with OCR text excerpts (~500 chars), publication title, date, state, and the URL needed for libofcongress_get_newspaper_page. |
| libofcongress_get_newspaper_page | Retrieve the full OCR text of a specific newspaper page. Pass the url field from a libofcongress_search_newspapers result. Returns ocr_available: false when the page has no digitized text. |
| libofcongress_search_subjects | Search Library of Congress Subject Headings (LCSH) by keyword. Returns controlled-vocabulary labels and URIs — use the label as the subject filter in libofcongress_search. |
| libofcongress_browse_collections | List and browse LOC curated digital collections with descriptions, item counts, and slugs. Optionally filter by keyword. |
libofcongress_search
Search the LOC digital collections with full-text keyword matching and facet filters.
- Eight material formats:
photo,map,newspaper,manuscript,audio,film,book,notated-music - Date range filtering by year (inclusive start and end)
- Subject heading filter — use
libofcongress_search_subjectsfirst to get the exact LCSH spelling - Geographic location filter (e.g.,
"oklahoma","washington d.c.") collection_slugscopes the search to one curated collection — pass a slug fromlibofcongress_browse_collections. Mutually exclusive withformat(each selects a different LOC endpoint); an unknown slug returnscollection_not_found- Pagination up to 100 results per page —
pages/has_nextrespect LOC's ~100,000-item retrieval ceiling (a notice discloses how to reach the rest: partition by date, subject, or location); real results on a page beyond the reported total are always returned, never discarded - Empty results include a
noticefield with recovery hints — echoes the applied filters - Each result carries
is_item—truefor catalog items whoseidresolves vialibofcongress_get_item,falsefor non-item results (collections, exhibit/guide pages, newspaper pages); open theirurlinstead
libofcongress_get_item
Retrieve the full metadata record for a specific LOC digital item.
- Returns contributors, LCSH subject headings, rights information, physical/technical description, and cataloger notes
- Also returns
summary,languages,locations,call_number(shelf location for requesting the physical original),former_ids,original_formats,online_formats, andaccess_restricted— all sourced from the same upstream response, no extra request resource_linkscontains URLs to downloadable digital files (TIFF, JPEG, PDF) for items with digital surrogatesrelated_itemslists IDs of related LOC items for follow-up retrievalresource_linksandrelated_itemsrender in full in bothstructuredContentandcontent[]— no truncation, socontent[]-only clients see every value- Deduplicates resource links from nested
files[]arrays - Accepts multi-segment item IDs verbatim (e.g. newspaper pages
sn95047246/1935-09-05/ed-1); returnedurlis always an absolutehttps://URL - Fields absent upstream are omitted rather than filled — a sparse record stays sparse
libofcongress_search_newspapers
Search historical newspaper pages in the Chronicling America corpus via the LOC /newspapers/ endpoint.
- OCR text excerpts (~500 chars) returned inline for relevance assessment without a second hop
- Filters: keyword, date range, US state (full state name), newspaper publication title (partial match)
- Returns the
urlfield needed bylibofcongress_get_newspaper_page— do not construct these URLs manually - OCR quality varies by digitization batch and era; 19th-century and degraded materials may contain garbled text
- Empty results include a
noticewith recovery suggestions (broaden date, try different keywords, historical OCR caveat)
libofcongress_get_newspaper_page
Retrieve the full OCR text and metadata for a specific newspaper page.
- Accepts the
urlfield from alibofcongress_search_newspapersresult — validates the URL prefix before any outbound request - Fetches JSON from the LOC text-services endpoint (
tile.loc.gov) and reads plain text from thefull_textfield ocr_available: falsewhen the page has no digitized text (image-only batch) — not an error, a data property- When
ocr_availableistruebut the text service returns nothing, a notice discloses the retrieval miss on both response surfaces — distinct from a genuinely image-only page - Strips echoed
q=params from fulltext URLs to avoid tile.loc.gov 404s (known LOC API quirk)
libofcongress_search_subjects
Search Library of Congress Subject Headings (LCSH) via id.loc.gov.
- Returns standardized labels and stable LOC URIs for subjects matching the keyword
countfield indicates approximate number of LOC items carrying that heading (when available)- Use the returned
labelexactly in thelibofcongress_searchsubjectfilter — LCSH uses inverted forms ("Photography, Aerial", "World War, 1939-1945") that differ from natural language - Draws from the id.loc.gov suggest endpoint's full 50-candidate pool (not scaled to
limit) and filters to true LCSH headings, so a heading ranked below name-authority records isn't reported as a false empty; when that ranked pool — rather than a lack of coverage — yields an empty or short result, the response discloses it with a recovery hint
libofcongress_browse_collections
List and browse LOC curated digital collections.
- Returns collection
slug— pass it tolibofcongress_searchascollection_slugto search inside that collection - Slugs come from the collection's loc.gov route, not its title —
"Aaron Copland Collection"lives ataaron-copland, so they aren't guessable - Optional keyword filter by collection name/description
- Item counts are approximate; omitted when the API doesn't provide them
- Pagination supported up to 100 collections per page
Resource
| Type | Name | Description |
|:-----|:-----|:------------|
| Resource | libofcongress://item/{+item_id} | LOC digital item metadata by ID. Stable URI for injecting item context into agent conversations. Returns the same full record as libofcongress_get_item. |
All resource data is also reachable via libofcongress_get_item. Use libofcongress_search to discover item IDs first.
Write the item ID with its slashes intact — libofcongress://item/sn95047246/1935-09-05/ed-1 is the canonical form for a multi-segment newspaper ID. Percent-encoded slashes (%2F) also resolve.
Features
Built on @cyanheads/mcp-ts-core:
- Declarative tool and resource definitions — single file per primitive, framework handles registration and validation
- Unified error handling — handlers throw, framework catches, classifies, and formats
- Pluggable auth:
none,jwt,oauth - Swappable storage backends:
in-memory,filesystem,Supabase,Cloudflare KV/R2/D1 - Structured logging with optional OpenTelemetry tracing
- STDIO and Streamable HTTP transports
LOC-specific:
- Module-level rate-limit enforcement: 20 req/min limit; 429 responses trigger a 1-hour block with per-minute countdown in error messages
- Configurable pacing delay (default 3100ms, ~19 req/min) applied before every outbound LOC API request
- HTML-response detection guards against silent rate-limit proxy pages that return 200 with HTML
- Out-of-range page handling: LOC returns HTTP 400 or 520 for page numbers beyond the result set — treated as empty rather than errors
- Transient-fault resilience: network drops and timeouts retry with backoff behind a 30s per-request timeout ceiling; the 429 rate-limit path is never retried, since a retry would deepen LOC's 1-hour block
- JSON OCR extraction for newspaper text — reads the
full_textfield from LOC text-services responses - Two-service architecture:
LocApiServiceforwww.loc.govandLcLinkedDataServiceforid.loc.gov
Agent-friendly output:
- Empty results always include a
noticefield with recovery hints — echoes the applied filters and suggests how to broaden - Pagination status on every search response:
total,page,pages,has_next— capped at LOC's ~100,000-item retrieval ceiling, with a notice disclosing how to page past it ocr_availablediscriminator on newspaper page results so callers can branch on data availability without parsing text- Recovery hints on all error contracts — actionable next steps for the agent on every failure mode
Getting started
Add the following to your MCP client
Truncated for display — read the full file on GitHub.
Related Skills
momen-cursurrules-prompt-file
40.6kCursor rules for building custom frontends with Momen.app as headless BaaS with GraphQL API, actionflows, AI agents, and Stripe integration.
semiotic-react-dataviz-cursorrules-prompt-file
40.6kCursor rules for Semiotic data visualization library with 30+ chart types, MCP server, and AI-assisted chart generation.
Agent-Reach
72.4kGive your AI agent eyes to see the entire internet. Read & search Twitter, Reddit, YouTube, GitHub, Bilibili, XiaoHongShu — one CLI, zero API fees.
ruflo
68.0k🌊 The original agent meta-harness. Deploy intelligent multi-player swarms, coordinate autonomous workflows, and build conversational AI systems. Features adaptive memory, self-learning intelligence, RAG integration, and native Claude Code / Codex / Hermes and many more Integrated
