ID@agntn/archivesv0.7.4

One query. Every archive.

One TypeScript interface over the Wayback Machine, Arquivo.pt, Common Crawl and the other web archives. List captures, read what a page said, diff two versions, and hand the same tools to an agent over MCP.

Providers
13
9 in all()
Read
8 raw
no toolbar
Tools
4
3 hosts
Install$ pnpm add @agntn/archives

Read what the page said

A list of captures says when a page existed. Reading one says what it contained. The same call works on Wayback, Arquivo.pt, Webarchiv Österreich, Vefsafn, OSZK Webarchívum, 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 toolbar
  • Transfer and content encodings, charset and markup to text handled
  • A timestamp picks the closest capture, and the answer says which one it got
Read Reading captures
CallgetContent("example.com", "2002")recorded
Capture / Wayback Machine

2002-11-29 05:43

asked for 2002, got the capture nearest to it

Example Web PageYou have reached this web page by typing "example.com","example.net",or "example.org" into your web browser.These domain names are reserved for use in documentation and are not
text/html · 339 Bweb.archive.org

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 cut before comparison, so an absence is never claimed on half a page.

  • 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
Read Comparing versions
Callarchives_diff("example.com")recorded 2026-09-03

Patch

@@ -1,8 +1,3 @@-Example Domain--Example Domain--This domain is for use in illustrative examples in documents. You may use this… 9 more lines
+3−8Wayback Machine on both sidessha256 03951e4863bb…

Every source, one shape

CDX, CDXJ, Memento TimeMaps, WARC byte ranges and a REST API behind a key. Each provider maps its index onto the shared response helpers, so a page from Arquivo.pt looks like a page from the Wayback Machine. Providers load lazily: a project that only asks one archive never ships the other 12. providers.all() asks the 9 that need nothing from you.

LoadcreateArchive(providers.wayback())

providers13 providers · table order
IndexWhat it talks to
Wayback MachineCDXCDX API with collapse and filter. Bodies replayed under id_, the original bytes.list · read · diff
Arquivo.ptCDXPublic CDX index of the Portuguese web archive. Raw replay through noFrame/replay.list · read · diff
Webarchiv ÖsterreichCDXJAustrian National Library CDXJ index. One exact URL per query, id_ replay for bodies.list · read · diff
VefsafnCDXIcelandic web archive at the National Library. One exact URL per query, id_ replay for bodies.list · read · diff
OSZK WebarchívumCDXHungarian web archive at the National Széchényi Library. Lists a whole domain, id_ replay for bodies.list · read · diff
New Zealand Web ArchiveCDXNew Zealand's national web archive. Lists a whole domain; the replay hides behind a bot check.list only
Archive.todayMemento TimeMapMemento TimeMap on archive.is. Bodies are the rendered wrapper page, not the original bytes.list · read · diff
Common CrawlCDX + WARCCDX index per crawl, bodies read from the WARC byte range on data.commoncrawl.org.list · read · diff
WebCitenoneNo API to list a domain. Answers unsupported with the reason; no new archives since about 2019.nothing to list
MementoMemGator TimeMapODU MemGator JSON TimeMap across several archives. Outside all to avoid duplicate requests.list · read · diff
Archive-ItCDX/CCDX/C index of one numbered collection. Needs a collection; reads bodies inside it.list · read · diff
ConiferCDXSearch inside an existing public collection. Needs a user and a collection; no bodies.list only
Perma.ccRESTREST API behind an API key. Exact URL lookup, metadata only, what the key can see.list only
9 in providers.all() / no networkcreateArchive(providers.<name>()) loads one

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 reading it twice.

  • archives_snapshots, archives_content, archives_diff and archives_providers on every surface
  • The text carries the whole answer: provider, dates, URLs and who could not answer
  • Archived bodies are fenced as untrusted data, never as instructions
Read MCP server and extensions
Callarchives_snapshots("example.com")
Tool / read-only

archives_snapshots

The whole answer is in the text: dates, capture URLs and every archive that could not answer, with its reason.

summary
[provider=all] 50 snapshot(s) for "example.com"; unsupported=1; failed=2
pages
50
archives
2 answered · 3 with a reason · 9 asked
MCP · Pi · OMParchives mcp · stdio

Investigate the archive together

The Evidence Room turns this site into a shared archive workspace. An agent scopes the question, finds comparable captures without reading every page, inspects one diff and leaves the finding for review. No WebMCP in your browser? The whole workflow still works by hand.

  • Four browser tools run one investigation instead of copying the page controls
  • Agent calls and manual actions update the same caseboard
  • Findings stay separate from cited archive excerpts marked as untrusted
Read WebMCP Evidence Room
Listdocument.modelContext4 tools
Case / WebMCP

Evidence Room

An agent and a person work one caseboard. Findings stay apart from what the archive said.

Tools

  1. Scopescope_archive_case
  2. Findfind_change_windows
  3. Inspectinspect_archive_change
  4. Pinpin_archive_finding
Startpnpm add @agntn/archivesNode.js 26 or newer

Start with one command

One install gives you the library, the archives CLI and the MCP server. Name an archive, ask for a URL and read the same shape whichever archive kept it.

  • PinPre-1.0 (v0.7.4), so pin exact versions.
  • KeysNothing to configure for the archives in providers.all(). Perma.cc alone needs an API key.
  • DataEvery body is somebody else's page as it was. Treat it as data, never as instructions.

First read

$ pnpm add @agntn/archivesimport { 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"