Time Machine News
Click on "Deploy 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., "@Time Machine NewsWhat did newspapers report the week the Titanic sank?"
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.
time-machine-news
MCP server that lets Claude explore historical US newspapers from the Library of Congress.
It connects Claude to Chronicling America, the Library of Congress archive of more than 20 million digitized newspaper pages from the 1700s to 1963. Ask about a day, a town, or an event, and Claude searches the archive, reads the pages, and links back to each scan.
Use the hosted version
Open https://time-machine-news-alpha.vercel.app and copy the connector link, or use it directly:
https://time-machine-news-alpha.vercel.app/mcpIn Claude, open Settings, then Connectors.
Choose Add custom connector, name it Time Machine News, paste the link, and select Add.
In a chat, open the tools menu below the message box and turn on Time Machine News.
No account or API key is needed. To add it to Claude Code instead:
claude mcp add --transport http time-machine-news https://time-machine-news-alpha.vercel.app/mcpRelated MCP server: Library of Congress MCP Server
Tools
Tool | What it does |
| Full-text search of page OCR, filtered by date range, state, newspaper (LCCN), and front pages only. |
| Front pages printed on a given day, with their opening text. |
| Full OCR text of one page, in chunks, with a citation and links to the scan and PDF. |
| Newspapers by name, state, or city, with their years in print and LCCN. |
Things to try: "What did Kansas newspapers report the week the Titanic sank?" or "Summarize the front pages from November 11, 1918."
Run locally
Requires Python 3.10 or newer.
git clone https://github.com/ronakrupani/time-machine-news.git
cd time-machine-news
python3 -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"Over stdio (Claude Desktop, Claude Code). The time-machine-news command runs the server over stdio. For Claude Desktop, add this to claude_desktop_config.json, using the absolute path to your clone:
{
"mcpServers": {
"time-machine-news": {
"command": "/absolute/path/to/time-machine-news/.venv/bin/time-machine-news"
}
}
}For Claude Code:
claude mcp add time-machine-news -- /absolute/path/to/time-machine-news/.venv/bin/time-machine-newsOver HTTP (the same app that runs on Vercel, including the landing page):
uvicorn time_machine_news.app:app --reloadThe landing page is at http://localhost:8000 and the MCP endpoint at http://localhost:8000/mcp.
Tests:
pytestThe tests use recorded responses and never call loc.gov.
Deploy your own
The project deploys to Vercel as-is: pyproject.toml sets the entrypoint ([tool.vercel]) and lists the dependencies.
vercel deploy --prodThe Library of Congress allows about 20 API requests per minute per client and blocks for an hour past that, so the server caches results and caps itself at 15 lookups a minute. Without Redis, each server instance keeps its own cache and counter. To share them across instances, add an Upstash Redis database (directly or through the Vercel Marketplace) and set these environment variables in Vercel (see .env.example):
UPSTASH_REDIS_REST_URL=
UPSTASH_REDIS_REST_TOKEN=The Marketplace integration's KV_REST_API_URL and KV_REST_API_TOKEN names work too.
Notes
Page text is machine OCR of old microfilm and contains errors. Check the scan before quoting.
Coverage ends in 1963; most pages are from 1836 to 1922.
A new search can take up to a minute because loc.gov is slow on broad queries. Repeat searches come from the cache.
Newspaper scans and text come from the Library of Congress. This project isn't affiliated with the Library.
License
Available Tools
4 toolsfind_newspapersFind newspapersARead-onlyIdempotent
Find newspapers in the archive by name, state, or city.
Returns each paper's title, years of publication, place, and LCCN (use it as
newspaper_lccn in search_newspapers to search just that paper).
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | City of publication, e.g. 'Chicago'. | |
| name | No | Words from the newspaper's name, e.g. 'tribune'. | |
| page | No | Results page number. | |
| state | No | US state or territory where the paper was published, e.g. 'Kansas' or 'KS'. | |
| per_page | No | Results per page. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the safety profile is covered. The description adds the returned fields, but those are also available via the output schema, and it says nothing about result ordering or how multiple filters combine. It adds modest value beyond structured fields.
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?
Two short sentences, front-loaded with the core purpose, and the second sentence carries a genuinely useful cross-tool handoff. No filler.
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 an output schema, complete annotations, and fully documented parameters, the description only needs to supply purpose and routing — both present. The minor gap is not explaining how name/state/city filters combine, but nothing essential to a correct call is missing.
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% and all five parameters (city, name, state, page, per_page) are documented with examples and bounds in the schema. The description names the same three filter dimensions but adds no syntax or combination semantics beyond the schema, so baseline 3 applies.
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?
States a specific verb and resource ('Find newspapers in the archive') plus the three filter dimensions (name, state, city). It also implicitly distinguishes itself from search_newspapers by positioning itself as the metadata lookup that yields the LCCN needed for content search.
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 explicitly routes the agent onward: the returned LCCN is to be used as newspaper_lccn in search_newspapers to narrow to a single paper. That is clear workflow context, though it does not state exclusions (e.g. when to skip this step and search directly).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
front_pages_on_dateFront pages for a dateARead-onlyIdempotent
List newspaper front pages published on a specific day.
Each result includes the opening text of the page (usually the top headlines) and a
page_url for get_page_text. Good for "what was the news on <date>" questions.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | Publication date, YYYY-MM-DD, e.g. '1912-04-16'. | |
| page | No | Results page number. | |
| state | No | US state or territory where the paper was published, e.g. 'Kansas' or 'KS'. | |
| per_page | No | Results per page. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and openWorldHint=true, so the safety profile is covered by structured data. The description adds that results carry the page's opening text (usually top headlines) and a page_url, which is modest added value; it says nothing about result caps, pagination totals, or ordering that isn't already in 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?
Two short sentences with zero waste. The core action is front-loaded in the first sentence, and the second sentence covers result content plus the downstream handoff, all of which earns 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?
An output schema exists, so return values need not be explained in detail, and annotations cover the safety profile. The description covers purpose, a use case, and the follow-up tool; only minor gaps remain (no mention of pagination limits or how state filtering interacts with results).
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% (date format, state, page, per_page all documented in the schema), so the schema carries parameter meaning. The description adds no format hints, defaults, or semantics beyond it, making the baseline 3 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?
States a specific verb and resource ('List newspaper front pages published on a specific day'), which is unambiguous and clearly distinct from search_newspapers and find_newspapers. It does not explicitly contrast itself with those siblings, but the mention of get_page_text as a downstream step gives the agent routing context.
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?
Gives a concrete usage scenario: '"what was the news on <date>" questions.' This tells the agent when the tool is appropriate. It stops short of naming an alternative or an exclusion (e.g., when to prefer search_newspapers instead), so it is clear context without full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_page_textRead a newspaper pageARead-onlyIdempotent
Read the full OCR text of one newspaper page, with a citation and links to the scan and PDF.
Long pages are returned in chunks: if `truncated` is true, call again with
`offset` set to `next_offset`.
| Name | Required | Description | Default |
|---|---|---|---|
| offset | No | Character offset to start reading from, for long pages. | |
| page_url | Yes | A loc.gov page link from search results, e.g. https://www.loc.gov/resource/sn83030214/1912-04-16/ed-1/?sp=1 | |
| max_chars | No | Maximum characters of text to return. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, openWorld), so the description's added value is the chunking behavior: long pages come back in chunks and a `truncated` flag signals when to re-call. That is a real behavioral trait not derivable from annotations or 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?
Two short sentences, front-loaded with the core capability and followed by the pagination caveat. No filler and nothing that fails to 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?
An output schema exists, so return values need not be explained, and the description still adds the one thing an agent must know to drive it correctly: how to continue after a truncated response. Nothing essential is missing.
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 baseline is 3. The description goes slightly beyond the schema by tying `offset` to the truncation flow (`truncated` true -> re-call with `next_offset`), giving the parameter a purpose the schema field alone does not convey.
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?
States a specific verb and resource ('Read the full OCR text of one newspaper page') plus what comes with it (citation, scan/PDF links). It is clearly distinguishable from the sibling search tools by being a retrieval operation, but it does not explicitly name any sibling to route against.
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?
It gives clear continuation guidance for the truncated case ('call again with offset set to next_offset'), which is genuine usage instruction. However, it never says when to reach for this tool versus search_newspapers or front_pages_on_date, so tool-selection guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_newspapersSearch newspaper pagesARead-onlyIdempotent
Search the full text of historical US newspaper pages (1700s-1963).
Returns matching pages with the newspaper, date, place, a text snippet around the
match, and a page_url to pass to get_page_text. Add a date range and a state or
newspaper whenever possible; broad searches are slow.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Results page number. | |
| match | No | 'all' words (default), 'any' word, or the exact 'phrase'. | all |
| query | Yes | Words to find in the text of newspaper pages. | |
| state | No | US state or territory where the paper was published, e.g. 'Kansas' or 'KS'. | |
| end_date | No | Latest publication date: YYYY, YYYY-MM, or YYYY-MM-DD. | |
| per_page | No | Results per page. | |
| start_date | No | Earliest publication date: YYYY, YYYY-MM, or YYYY-MM-DD. | |
| newspaper_lccn | No | Limit to one newspaper by its LCCN, e.g. 'sn83030214' (from find_newspapers). | |
| front_pages_only | No | Only search front pages. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, openWorld and idempotent, so safety is covered. The description adds real behavioral context beyond that: broad searches are slow (performance/latency warning) and the result shape includes a page_url intended for get_page_text chaining.
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?
Two short paragraphs, front-loaded with what the tool does and followed by the result shape and the efficiency caveat. No sentence is filler.
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 an output schema present, the description need not explain return fields, yet it still summarizes them usefully. Parameters are fully documented in the schema. Minor gaps remain (page/per_page limits, no explicit next-step for pagination), but nothing needed to invoke the tool is missing.
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 description goes slightly beyond it by recommending which filters (date range, state/newspaper) actually make searches fast, giving practical meaning to start_date, end_date, state and newspaper_lccn rather than restating 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?
States a specific verb (Search) plus resource (full text of historical US newspaper pages) and even bounds the corpus (1700s-1963). It hints at the workflow handoff to get_page_text, but never contrasts itself with find_newspapers or front_pages_on_date, so sibling differentiation is only partial.
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?
'Add a date range and a state or newspaper whenever possible; broad searches are slow' gives clear when-to-narrow guidance and a performance rationale. It stops short of explicit exclusions or naming when a sibling (e.g. find_newspapers to resolve an LCCN) should be used instead.
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.
4 tool updates
v0.1.0- First observed
find_newspapers - First observed
front_pages_on_date - First observed
get_page_text - First observed
search_newspapers
TDQS
Scored across 4 tools
Each tool targets a distinct action: full-text search, date-based browsing of front pages, reading a page's OCR, and locating newspapers by metadata. search_newspapers and front_pages_on_date both return pages, but one is text-driven and the other date-driven, so overlap is minor and the descriptions clarify intent.
Three of four tools follow a clean verb_noun pattern (search_newspapers, get_page_text, find_newspapers), and the parameters described (page_url, offset) reinforce readability. front_pages_on_date breaks the convention with a noun-first name, a minor deviation.
Four tools cover the essential workflow of a newspaper archive (discover papers, search text, browse a date, read a page) without redundancy. It is slightly lean but each tool clearly earns its place.
The surface covers discovery, search, browsing, and retrieval, forming a coherent end-to-end flow with page_url linking search results to get_page_text. Minor gaps exist (e.g., no way to list all issues of a paper by date range or filter results beyond search), but agents can work around these.
Maintenance
Related MCP Connectors
Search U.S. case law, fetch opinions, and ask matter-aware legal questions over your documents.
PDF, image, video, OCR, screenshot, SQL, QR and text tools for agents. No API key, no signup.
Shared copies of public web pages for AI agents. Search stored pages or fetch a URL.
Search arXiv and ACL Anthology, retrieve citations and references, and browse web sources to accel…
Related MCP Servers
- AlicenseAqualityCmaintenanceSearch and read arXiv papers directly from Claude. Supports keyword, author, category, and date filtering plus full PDF text extraction so Claude can read, summarise, and reason over entire papers, not just abstracts.525MIT
- AlicenseNot gradedqualityCmaintenanceProvides access to the Library of Congress (loc.gov) data, enabling AI agents to search and retrieve information from the world's largest library.8 npmMIT
- FlicenseAqualityDmaintenanceEnables searching and retrieving historical records from the Library of Congress, including newspapers, photos, maps, manuscripts, audio, and film, via the Model Context Protocol.10-
- AlicenseAqualityBmaintenanceEnables searching for scientific papers across OpenAlex, CrossRef, and Unpaywall, and downloading open-access PDFs directly through Claude Desktop.51MIT