Skip to content

AHG Archives

za.co.theahg/ahg-archivestheahg.co.zastreamable-httpv0.4.0Scanned

Search and read AtoM archival catalogues with citable links; staff propose changes for review.

16 tools: 6 change things and 10 only read.

Tools: 0 delete, 0 irreversible, 6 write, 10 read.
  • Reads private data · 2
  • Reads text others write · 2
  • Can send data out · 0
  • No findings

Anlyon alternative

6 of these tools change something. Run those as governed actions.

Declare what an action changes, and Anlyon puts it under a shared limit, binds every approval to the exact request, and grades the outcome. It works on any HTTPS API you can describe as an action.

Anlyon does not run, proxy or govern this MCP server. A tool your own code calls directly is not routed through Anlyon and is not governed by it.

Import an OpenAPI spec →

Tools

Grouped by what each tool does, most consequential first. Open one for its reasons and full description; descriptions are the publisher's own words.

16 tools

Changes things 6Claude Code: ask
  • propose_access_points_and_datesPropose access points (people, organisations, places) and dates for one record.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    Propose access points (people, organisations, places) and dates for one record. Read the record with get_record first. Propose only what its text, or a reliable source you name, supports; give the evidence and source URLs for each. For a person or organisation, also give dates_of_existence, a short history and places when the record or a source states them: they pre-fill the new authority record if the archivist creates one. Look names and places up with search_authorities first; when one is already in the catalogue, give its id as existing_id and why in link_reason, and the archivist sees it as the first candidate to link. Nothing on the record changes: an archivist reviews every proposal. On AtoM with the AHG extensions they are queued in AI > NER review; on stock AtoM they are returned for the archivist to apply. Needs the archivist's own staff key.
  • propose_description_changePropose new text for one field of a record, for an archivist to review.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    Propose new text for one field of a record, for an archivist to review. text is the complete proposed text for the field, not a fragment: read the record with get_record first and keep what is right in the current text. For a title, propose the title only (at most 1,024 characters). Give the evidence and the URLs of any web sources. Nothing on the record changes: on AtoM with the AHG extensions the proposal is queued in AI > Suggest review, where the archivist can edit it before approving; on stock AtoM it is returned for the archivist to apply. Needs the archivist's own staff key.
  • propose_relationshipsPropose relationships between people or organisations that a record states, such as a marriage or parent and child in a family register.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    Propose relationships between people or organisations that a record states, such as a marriage or parent and child in a family register. Each side must be an existing authority record (give its id from search_authorities) or a person or organisation you have already proposed for this record with propose_access_points_and_dates. Give the line that states each relationship as evidence. An archivist reviews them in AI > Relationship review; approved ones show on both authority records. Needs the archivist's own staff key.
  • propose_transcriptionPropose a transcription of a record's file, such as a scanned page with no text.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    Propose a transcription of a record's file, such as a scanned page with no text. Look at the page with get_record_image first and transcribe what is written, line by line, in its own language and spelling; mark what you cannot read as [illegible] rather than guessing. Use get_record_text to see whether the file already has text. digital_object_id picks the file when a record has several. At most 65,000 bytes: propose a long document page by page. An archivist compares it with the page image in AI > Suggest review; once approved it is the file's text and is searchable. Needs the archivist's own staff key.
  • propose_translationPropose a translation of one field of a record into another language.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    Propose a translation of one field of a record into another language. language is the target language code, e.g. "en", "af" or "nl". Translate the record's current text for that field faithfully (read it with get_record); keep names, dates and reference codes as they are. An archivist reviews it in AI > Suggest review next to any text already held in that language; once approved the record shows it in that language. Needs the archivist's own staff key.
  • work_through_seriesWork through every record below a parent (for example each page of a family Bible), a batch at a time, with a running summary of what you proposed where.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    Work through every record below a parent (for example each page of a family Bible), a batch at a time, with a running summary of what you proposed where. Returns a batch of the parent's children, each with your proposals on it so far by status, the totals for the whole batch, how many proposals you may still make this hour, and next_skip for the next batch (null when done). For each child: read it (get_record, and get_record_text or get_record_image when its text is thin), skip it when your proposals there are still pending, propose, then move on. Call again with skip=next_skip until it is null. When get_record shows a child has children of its own, work through it the same way.
Only reads 10Show 10 read-only tools
  • get_authorityRead an authority record (a person, family or organisation) by its slug.No findings

    Why it is in this group

    • The name "get_authority" says "get": a word for reading.
    Description, as the server wrote it
    Read an authority record (a person, family or organisation) by its slug.
  • get_childrenList the descriptions directly below one record (for example the series in a fonds).No findings

    Why it is in this group

    • The name "get_children" says "get": a word for reading.
    Description, as the server wrote it
    List the descriptions directly below one record (for example the series in a fonds).
  • get_iiif_manifestReturn the IIIF manifest URL for a record's images, for viewing in a IIIF viewer.Reads text others writeNo findings

    Why it is in this group

    • The name "get_iiif_manifest" says "get": a word for reading.

    What it can reach

    • untrusted-inputThe description's first sentence says "return" and "url": it reads web pages, which anyone can write.
    Description, as the server wrote it
    Return the IIIF manifest URL for a record's images, for viewing in a IIIF viewer.
  • get_recordRead one archival description in full, by its slug (the last part of its URL).Reads text others writeNo findings

    Why it is in this group

    • The name "get_record" says "get": a word for reading.

    What it can reach

    • untrusted-inputThe description's first sentence says "read" and "url": it reads web pages, which anyone can write.
    Description, as the server wrote it
    Read one archival description in full, by its slug (the last part of its URL). Includes dates, names, subjects, places, notes and, where the catalogue provides them, its place in the hierarchy, its number of children, images, and its provenance chain (owners, dates, transfers, certainty, gaps).
  • get_record_imageLook at a record's image: returns the reference image itself, so you can describe what it shows, read inscriptions or labels, or judge its condition.No findings

    Why it is in this group

    • The name "get_record_image" says "get": a word for reading.
    Description, as the server wrote it
    Look at a record's image: returns the reference image itself, so you can describe what it shows, read inscriptions or labels, or judge its condition. Use it before proposing a description for a record whose own text is thin. Only images the caller may view are returned (the reference copy, never the master). Say what you saw and what you inferred, and treat inscriptions you cannot read clearly as uncertain.
  • get_record_textRead the text held for a record's files: text extracted from a PDF or by OCR, and transcriptions of audio or video.Reads private dataNo findings

    Why it is in this group

    • The name "get_record_text" says "get": a word for reading.

    What it can reach

    • private-dataThe description's first sentence says "read" and "file": it reads files.
    Description, as the server wrote it
    Read the text held for a record's files: text extracted from a PDF or by OCR, and transcriptions of audio or video. Use it for documents, where reading the text beats looking at a small image. Long text comes in pages: if a result says more=true, call again with offset set to offset + the length you received. Personal information may be masked. Quote what you rely on when you propose changes.
  • list_cataloguesThe catalogues this service can search and read.No findings

    Why it is in this group

    • The name "list_catalogues" says "list": a word for reading.
    Description, as the server wrote it
    The catalogues this service can search and read. Proposals go to the home catalogue only.
  • list_my_proposalsList the proposals you made and what became of them, newest first.No findings

    Why it is in this group

    • The name "list_my_proposals" says "list": a word for reading.
    Description, as the server wrote it
    List the proposals you made and what became of them, newest first. Each shows the record, the name, place, date or field text proposed, and its status: pending, approved, edited, linked (to an authority record), rejected, new_record_created or parked, with who reviewed it and when. Check it before proposing for a record, and do not propose again what was rejected. Needs the archivist's own staff key.
  • search_authoritiesFind existing authority records (people, organisations, families) or places by name.No findings

    Why it is in this group

    • The name "search_authorities" says "search": a word for reading.
    Description, as the server wrote it
    Find existing authority records (people, organisations, families) or places by name. Every word must appear in the name, in any order, so "Hendrik Engelbrecht" also finds "Engelbrecht, Hendrik". Use it before proposing a name or place: when one of the results is the same person, organisation or place, pass its id as existing_id in propose_access_points_and_dates, so the archivist links the existing record instead of creating a new one.
  • search_recordsSearch archival descriptions (fonds, series, files, items) by keyword.Reads private dataNo findings

    Why it is in this group

    • The name "search_records" says "search": a word for reading.

    What it can reach

    • private-dataThe description's first sentence says "search" and "file": it reads files.
    Description, as the server wrote it
    Search archival descriptions (fonds, series, files, items) by keyword. Returns title, level of description and the citable URL of each match. Use get_record on a result for the full description. catalogue: leave empty for the home catalogue, give a name from list_catalogues, or "all" to search every catalogue at once (results grouped by catalogue). Every read tool takes the same catalogue; read a result with the catalogue it came from.

This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.

Exfil surface

Which tools read private data, which read text someone else can write, and which can send data out. One of each is a path a prompt injection can use.

No private-data, untrusted-input, outbound path in this server alone: no tool is tagged outbound.

Reads private data2
Reads files, mail, messages, databases, secrets, calendars or repositories.
Reads text others write2
Brings in text someone else can write: web pages, inbound email, messages, issues and comments.
Can send data out0
Can carry data to people or systems: it sends, posts or publishes, or takes a recipient, channel or URL.

Other servers in the same agent add their own tools to these paths. Audit your whole setup to see them together.

Findings

Matches of fixed checks, with the text they matched.

No check matched anything in these tool definitions. That is not a safety guarantee.

History

Changes to its tool definitions and to its remote endpoint, newest first.

No change seen yet. Its tools are rescanned every day, and a remote endpoint is looked at once a week.

Install

Pinned to version 0.4.0. Values in angle brackets are yours to fill in.

claude mcp add --transport http ahg-archives https://mcp.theahg.co.za/public/mcp
claude mcp add --transport http ahg-archives https://mcp.theahg.co.za/public/mcp

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change or a way out, deny the deletes. Paste into .claude/settings.json.

.claude/settings.json
{
  "permissions": {
    "allow": [
      "mcp__ahg-archives__search_records",
      "mcp__ahg-archives__list_catalogues",
      "mcp__ahg-archives__get_record",
      "mcp__ahg-archives__get_children",
      "mcp__ahg-archives__get_authority",
      "mcp__ahg-archives__search_authorities",
      "mcp__ahg-archives__get_iiif_manifest",
      "mcp__ahg-archives__get_record_text",
      "mcp__ahg-archives__get_record_image",
      "mcp__ahg-archives__list_my_proposals"
    ],
    "ask": [
      "mcp__ahg-archives__work_through_series",
      "mcp__ahg-archives__propose_access_points_and_dates",
      "mcp__ahg-archives__propose_relationships",
      "mcp__ahg-archives__propose_description_change",
      "mcp__ahg-archives__propose_transcription",
      "mcp__ahg-archives__propose_translation"
    ],
    "deny": []
  }
}

Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. A read that can send data out (it takes a URL, say) asks first too. It assumes the server is installed as ahg-archives. Review it before you use it.

Capability tags behind 4 rules
  • mcp__ahg-archives__search_records private-data
  • mcp__ahg-archives__get_record untrusted-input
  • mcp__ahg-archives__get_iiif_manifest untrusted-input
  • mcp__ahg-archives__get_record_text private-data

Pin

Keep the decision: fail CI when the tools change, follow every change, or show a badge.

Pin in CI

Fail a build when the tools you reviewed are not the tools the server serves today.

curl -s "https://anlyon.dev/api/v1/servers/za.co.theahg/ahg-archives/verify?hash=37ede242bb2d5a5096a97e1d9c6f9cdbacde3798e2a35d9b717f42ef6818456a" | jq -e '.changed == false'

Pinned hash 37ede242bb2d, from Oct 26, 2026, 05:18 UTC.

Watch

Get told when its tools change: a new tool, a new description, a new class.

https://anlyon.dev/servers/za.co.theahg/ahg-archives/changes.xml

An Atom feed. Works in any feed reader or Slack's RSS app.

Badge

anlyon.dev badge for za.co.theahg/ahg-archives
[![anlyon.dev](https://anlyon.dev/badge/za.co.theahg/ahg-archives.svg)](https://anlyon.dev/servers/za.co.theahg/ahg-archives)

Source: MCP Registry · repository. Synced Oct 26, 2026, 05:17 UTC.