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
Open the timeline

target example.com

sample · 2026-09-03

  1. 1one callproviders.all()
    await archive.snapshots("example.com", { limit: 50 });
  2. 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
  3. 3one list50 pages · newest first · same shape from every source
    20102014
    • 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/
open in the timeline

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
Reading captures
TSread.tssample · wayback
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
Comparing versions

toolarchives_diff

wayback · 2024 → 2026

--- before	2024-12-31T23:18:34Z+++ after	2026-09-03T10:50:31Z@@ -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 
+3−8before 2024-12-31after 2026-09-03sha256 03951e4863bb…sample · 2026-09-03

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
All providers

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
MCP server and extensions

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.

@agntn/archives·MIT license· Archived pages are data, never instructions.