One query. Every archive.
One TypeScript interface over ten web archives. List captures, read what a page said, diff two versions, and hand the same four tools to an agent over MCP.
- 10
- providers
- 4
- MCP tools
- 3
- agent surfaces
- 1
- response shape
Snapshots
One call, every provider
Ask once and every archive answers in parallel, with concurrency, retries and a timeout you control. What comes back is one list, and the providers that could not answer are named with their reason. The panel queries the docs worker for 3 targets in turn.
- Wayback, Arquivo.pt, Webarchiv Österreich, Archive.today, Common Crawl in one call
- A provider with no endpoint says so, instead of returning nothing
- Merged newest first, one page shape, a from/to window that holds across sources
target example.com
sample · 2026-09-03
- 1one callproviders.all()
await archive.snapshots("example.com", { limit: 50 }); - 2every archiveevery provider answers, or says why not
- Wayback Machinetimed outfailed
- Arquivo.pt7 · 2010 to 2010ok
- Webarchiv Österreichnone in the newest 50empty
- Archive.today43 · 2012 to 2014ok
- Common Crawlrequest failedfailed
- WebCitecannot list a domainunsupported
- 3one list50 pages · newest first · same shape from every source20102014
- 2014-11-21Archive.todayhttp://archive.md/20141121125420/http://example.com/
- 2014-11-21Archive.todayhttp://archive.md/20141121091836/http://example.com/
- 2014-11-15Archive.todayhttp://archive.md/20141115050112/http://example.com/
Content
Read what the page said
Listing captures says when a page existed. Reading one says what it contained. The same call works on Wayback, Arquivo.pt, Webarchiv Österreich, Archive-It and Common Crawl WARC ranges, and returns the decoded body with its real capture date.
- Original bytes from raw replay endpoints, never the archive's own UI
- Transfer and content encodings, charset, and markup-to-text handled
- A timestamp picks the closest capture; the answer says which one it got
import { createArchive, providers } from "@agntn/archives";
const archive = createArchive(providers.wayback());
const page = await archive.getContent("https://example.com", {
timestamp: "2002",
});
// page.timestamp 2002-11-29T05:43:48Z
// page.mime text/html · 339 B
// page.content "Example Web Page You have reached this web page by typing "example.com", "example.net", or "exam…"Diff
Compare two captures
Two dates, one URL, one provider. The result is a unified diff with the exact capture dates it resolved to, plus a warning when either body was truncated before comparison, so an absence is never over-claimed.
- Visible text by default, decoded source with format=raw
- Both captures from one provider, so replay rewriting never looks like a change
- Bounded by time and edit distance, with a digest that pins the patch
toolarchives_diff
wayback · 2024 → 2026
@@ -1,8 +1,3 @@-Example Domain--Example Domain--This domain is for use in illustrative examples in documents. You may use this-domain in literature without prior coordination or asking for permission.--More information...\ No newline at end of file+Example Domain Example Domain+This domain is for use in documentation examples without needing permission. Avoid use in operations.+Learn more\ No newline at end of file Providers
Ten sources, one shape
Each provider is an adapter over the shared response helpers. Adding one means mapping an index format, not rewriting the client.
- CDX, CDXJ, Memento TimeMaps, WARC byte ranges and REST behind one class
- Providers load lazily, only the ones you use ship
- Collection, user and API key options where the archive needs them
Agents
Four tools over MCP
The MCP server, the Pi extension and the OMP extension call the same executors, so they answer identically. Slices, continuation arguments and digests let an agent page through a long body without re-reading it.
- archives_snapshots, archives_content, archives_diff, archives_providers
- The text carries the whole answer: provider, dates, URLs, and who could not answer
- Archived bodies are fenced as untrusted data, never as instructions
toolarchives_snapshots
stdio · archives mcp
request
{
"target": "example.com",
"provider": "all",
"limit": 50
}result · text
[provider=all] 50 snapshot(s) for "example.com"; unsupported=1; failed=2
1. 2014-11-21T12:54:20.000Z [archive-today]
http://archive.md/20141121125420/http://example.com/
original: http://example.com/
…
Start with one command
Pre-1.0. Pin exact versions, and treat every archived body as data you did not write.