Archive & Atlas MCP server Read-only · unauthenticated

Connect an agent

Archive & Atlas speaks the Model Context Protocol. An MCP-capable assistant can search the archive and pull records as structured data — no scraping, no key, and nothing to sign up for.

2tools: search and fetch
0credentials of any kind
Read
only
nothing here can write, edit or delete
I

Connect

JSON-RPC 2.0 over HTTP · one endpoint
EndpointPOST https://archiveandatlas.com/mcp
TransportJSON-RPC 2.0 over plain HTTP. No SSE, no websocket, no session to keep open.
AuthNone. Read-only access to published records.
Handshakeinitializetools/listtools/call. ping answers {}.
List the tools
curl -s -X POST https://archiveandatlas.com/mcp \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
Protocol version. The server echoes back whatever protocolVersion your client sends in initialize. Send none and it answers 2025-06-18. It is not pinned to a single revision, and it does not negotiate.
II

The two tools

Every argument optional except one
search_archive

Search

Free-text and filtered search across published records. Every argument is optional — call it bare and you get the most recent records.

get_record

Fetch by slug

One published record with its particulars, its license, a link to the Markdown copy, and a ready citation in all three formats. slug is required.

search_archive · arguments

queryString. Free-text across title and description.
placeString. Place-name filter.
eraInteger decade, e.g. 1940 — not a year range.
rightsEither open or restricted.
limitInteger, 1–60, default 24. Out-of-range values are clamped, not rejected.

get_record · arguments

slugRequired. The last path segment of /library/{slug}.
2tools
0keys
III

What comes back

A text content block carrying JSON

Both tools answer in the standard MCP envelope: result.content[0] is a text block whose string is JSON. Parse the string, not the envelope.

search_archive · the parsed text
{
  "total": 128,
  "count": 5,
  "results": [
    {
      "slug":    "grand-canyon-north-rim",
      "title":   "Grand Canyon, North Rim",
      "maker":   "A. Maker",
      "year":    1962,
      "place":   "Arizona",
      "subject": "Landscape",
      "rights":  "open",
      "url":     "https://archiveandatlas.com/library/grand-canyon-north-rim"
    }
  ]
}

total is how many records matched; count is how many came back under your limit. A maker we do not know is null, never the string “Unknown”.

get_record · the parsed text
{
  "slug": "...", "title": "...", "description": "...", "maker": "...",
  "date_earliest": 1962, "date_latest": null,
  "place": "...", "subject": "...", "medium": "...",
  "rights":   "open",
  "license":  "https://creativecommons.org/...",
  "url":      "https://archiveandatlas.com/library/{slug}",
  "markdown": "https://archiveandatlas.com/library/{slug}.md",
  "citation": { "chicago": "...", "bibtex": "...", "ris": "..." }
}
Errors are two different things. A malformed call — unknown tool, missing slug — is a JSON-RPC error with code -32602. A slug that simply is not published is not an error: it returns a normal result with isError: true and an error string inside the text block. Handle both.
IV

The rest of the protocol

What is implemented, and what is not
initializeReturns serverInfo (archive-and-atlas v1.0.0), capabilities.tools, and short instructions. Echoes your protocolVersion.
pingAnswers {}.
tools/listThe two tools with their JSON Schema.
tools/callRuns one.
notificationsAny request with no id is a notification: it gets HTTP 202 and an empty body, per JSON-RPC. Do not wait for a reply to one.
anything elseJSON-RPC error -32601, Method not found. There are no resources and no prompts — tools only.
Prefer plain HTTP? The same catalog is a free read API, a JSON index, per-record Markdown, IIIF, OAI-PMH and ResourceSync — see Developers.