关于 AHG Archives
AHG Archives 为 AtoM 档案目录提供搜索、记录读取和改进建议功能,面向档案工作者及研究者。建议进入审核队列,只有档案员批准后才会修改记录。
主要功能
- 01搜索档案描述和权威记录
- 02读取记录层级与来源链
- 03查看图像、文本及 IIIF 清单
- 04遍历父记录下的系列记录
- 05提交描述、转录和翻译建议
适用场景
- 01查找特定目录中的档案记录
- 02查看记录的子项、图像和来源
- 03为档案描述提出待审核修改
- 04为扫描文件提交转录或翻译
MCP 相关
通过 MCP 服务向客户端提供目录查询、记录和文件信息读取工具,以及提交修改建议的工具。建议进入审核队列,不会直接改写档案记录。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://mcp.theahg.co.za/public/mcpclaude mcp add --transport http za-co-theahg-ahg-archives https://mcp.theahg.co.za/public/mcp{"mcpServers":{"za-co-theahg-ahg-archives":{"type":"http","url":"https://mcp.theahg.co.za/public/mcp"}}}在 Cursor 中打开{"servers":{"za-co-theahg-ahg-archives":{"type":"http","url":"https://mcp.theahg.co.za/public/mcp"}}}在 VS Code 中打开{"mcpServers":{"za-co-theahg-ahg-archives":{"type":"http","url":"https://mcp.theahg.co.za/public/mcp"}}}{"mcpServers":{"za-co-theahg-ahg-archives":{"serverUrl":"https://mcp.theahg.co.za/public/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
https://mcp.theahg.co.za/public/mcphttps://mcp.theahg.co.za/mcp需要授权工具
详细介绍
AHG Archives MCP 服务
适用于 AtoM 目录、原版 AtoM 和带有 AHG Extensions 的 AtoM 的 MCP 服务(计划支持 Heratio)。它让助手像档案管理员一样使用目录:查找记录、查看记录及其子记录、图像、文本和来源信息,并提出改进建议。只有经过档案管理员审核并批准后,建议才会更改记录。
正在开发中。请查看 AtoM 上的演示:AtoM MCP Server in Action。
试用
- **无需密钥:**将任意 MCP 客户端连接到
https://mcp.theahg.co.za/public/mcp。只能读取 PSIS 演示目录中已发布的记录。 - **使用个人只读密钥:**若要在自己的 Agent 上测试,请向 [email protected] 索取密钥(姓名、组织、想要尝试的内容、使用时长)。该密钥可读取访客能看到的内容,设有到期日和每日限额,并适用于
https://mcp.theahg.co.za/mcp。提出建议需要员工密钥。 - 每个密钥都有每小时限额;每人每小时最多可提出 200 条建议。达到限额后,系统会以普通文字说明限额重置时间。
快速入门指南(docs/AHG_Archives_MCP_Quick_Start.md)介绍了如何连接浏览器和桌面客户端、如何提出合适的问题,以及如何提出改进建议。
工具
| 工具 | 功能 |
|---|---|
list_catalogues | 此服务可读取的目录:主目录,以及其他目录或演示目录。 |
search_records | 按文本搜索描述,也可限定在一个父级下。catalogue="all" 会同时搜索所有目录。 |
get_record | 获取一条完整描述:日期、创建者、检索点、层级、子项、图像和来源链。 |
get_children | 获取某条描述下的直接记录。 |
work_through_series | 分批遍历某个父级下的所有记录(例如家庭圣经的每一页),并显示你迄今为止对每条记录提出的建议,以及本小时内还可提出多少条建议。 |
get_authority | 获取一条规范记录(个人、家庭或组织)。 |
search_authorities | 按名称查找已有的个人、组织、家庭或地点,并获取其 ID。 |
get_iiif_manifest | 获取某条记录图像的 IIIF 清单。 |
get_record_text | 获取某条记录文件中保存的文本:提取文本、OCR 和转录文本,按页提供。 |
get_record_image | 获取某条记录的参考图像,供助手查看。 |
list_my_proposals | 查看你提出的建议及其处理结果(待处理、已批准、已关联、已拒绝等),避免重复提出已拒绝的建议。仅限已登录用户。 |
propose_access_points_and_dates | 提议个人、组织、地点和日期,并提供各自的证据和来源。个人和组织可附带存在日期、历史和地点,用于创建新的规范记录。名称或地点可指向现有记录(existing_id),档案员会优先考虑将其关联到该记录。 |
propose_relationships | 提议记录中明确记载的个人或组织之间的关系(配偶、父母、子女和其他 AtoM 关系类型),并附上日期和说明该关系的原文;获批后会显示在双方的规范记录中。 |
propose_description_change | 提议修改描述中的某个字段文本(标题、范围与内容、档案历史等)。 |
propose_transcription | 提议转录记录文件的内容(没有文本的扫描页面),以便与页面图像对照审核;获批后,该转录文本将作为文件文本,并可供搜索。 |
propose_translation | 提议将某个字段翻译成另一种语言(例如将荷兰语或南非荷兰语译成英语)。 |
每个读取工具都可选用 catalogue 参数(取自 list_catalogues 的名称);留空表示主目录。建议始终提交到主目录。
调用失败时,始终会返回 found: false;同时向用户提供 message,向程序提供错误代码:not_found、refused、rate_limited、unsupported、unavailable、needs_sign_in、unknown_catalogue 或 no_image。
调用者看到的内容遵循 AtoM 自身的权限设置:在 AtoM 中无权查看未发布记录、隐藏的子项和主文件的调用者,也无法通过此服务查看这些内容。tests/no_leak.py 会针对实时目录进行检查。
安全性
- 读取仅通过目录的 API 进行,绝不访问其数据库,并遵循目录自身的权限。没有自有密钥的调用方会使用服务密钥读取,因此该密钥的读取权限不得超过访客:服务器会在启动时检查该密钥(
glam_mcp/keycheck.py),若密钥属于工作人员,或能读取访客无法打开的记录,则拒绝启动。此检查会抽查最新记录;tests/no_leak.py可在访问数据库的情况下进行完整测试。 - 助手不会向记录写入任何内容。 提案会进入目录的审核队列,由档案管理员逐一批准。单元测试会读取代码,并在发现除搜索或审核队列调用之外的任何调用可能被发送时失败;在目录端,提案端点只会写入审核队列表,并且需要对记录具有编辑权限(参见
docs/EVIDENCE.md)。调用方自己的密钥仅用于其所属目录,绝不会发送到其他目录。 - 图像仅从目录自身的主机和端口获取(文件链接必须是纯路径),不跟随重定向,仅接受图像类型,分块读取,并在达到 3 MB 时停止。演示目录的主机也必须是公共地址。
- 标准版 AtoM 会通过其 API 返回网站对访客隐藏的字段(它不会检查草稿状态、可见元素设置或档案管理员备注),因此在标准版 AtoM 上完全不从 API 获取任何字段:所有值都来自记录的公开页面,该页面由 AtoM 自行根据其访问规则呈现给访客。API 仅用于查找记录。这依赖于 AtoM 2.10 的页面布局,测试会固定该布局;带有 AHG Extensions、Heratio 和 OpenRiC 的 AtoM 会在其 API 中应用可见性规则。
- 演示目录由工作人员在网页上添加,因此添加时及每次连接时都会检查其地址:如果解析结果来自非公共地址(即名称现在指向网络内部),则在使用前拒绝连接。
- **限制:**每个目录密钥都有自己的每小时限额,并且可设置每日上限和截止日期(在目录中设置);每位已登录人员每小时最多可排入
GLAM_PROPOSAL_CAP个提案条目,这些条目会保存在磁盘上。 - 日志会记录工具、目录和结果,但自由文本(搜索词、名称、提案文本)仅记录其长度和简短哈希;文件仅所有者可访问,并会在
GLAM_LOG_DAYS天(90 天)后删除。登录令牌以哈希形式存储,目录密钥则经过加密。
标准版 AtoM 的可见性会按记录缓存五分钟(这是为了提高速度而有意为之):在该处取消发布的记录仍可能在搜索结果中出现最多五分钟,但完整读取会立即再次检查。在带有 AHG Extensions 的 AtoM 上没有此延迟。
只有当目录使用服务密钥成功完成真实读取时,/healthz 才会返回 ok(200);否则会返回 unreachable、key_refused 或 not_working(503)。
两项独立的源代码审查(2026 年 10 月 26 日)推动了 v0.5.0 至 v0.5.2 的改进。每次推送时,单元测试、泄漏测试以及通过第二个目录进行的泄漏测试都会在项目镜像中运行;只有这些测试通过后,每个发布标签才会发布镜像(GitHub Actions 工作流 no-leak 和 image)。通过真实浏览器登录也有自己的测试(tests/SIGNIN_TEST.md,约 10 分钟,然后运行 tests/signin_check.py);首次运行尚待完成。仍待解决的问题:标准版 AtoM 的字段过滤器是对公开页面进行文本匹配,因此在标准版 AtoM 上,即使工作人员使用自己的密钥,也只能看到访客可见的字段。
代码布局
| 文件 | 内容 |
|---|---|
glam_mcp/server.py | MCP 层:工具、登录和 Web 路由、启动流程。 |
glam_mcp/catalogue.py | 目录适配器:所有与目录交互的功能(读取两种后端的数据、stock AtoM 的可见性和字段、图像、stock CSV)。新的后端(例如 Heratio)应添加到这里。 |
glam_mcp/calls.py | 单次调用策略:调用使用谁的密钥、每小时提案限额、调用日志行。 |
glam_mcp/settings.py | 设置、调用日志和目录(主页、已配置、演示)。 |
glam_mcp/keycheck.py | 后端检测、服务密钥检查、公共地址检查。 |
glam_mcp/auth.py | OAuth 登录。 |
glam_mcp/usage.py、glam_mcp/catalogues.py | 员工页面 /usage 和 /catalogues。 |
后端
服务器会在启动时检测目录具备以下哪种后端(GLAM_BACKEND=auto),因此同一套安装可服务两种后端。
atom-ahg:通过 REST API v2(ahgAPIPlugin)连接带有 AHG Extensions 的 AtoM。propose_transcription和propose_translation需要 atom-ahg-plugins v3.121.63 或更高版本;propose_relationships需要 v3.121.62;list_my_proposals需要 v3.121.61;search_authorities和existing_id需要 v3.121.60;提案中的权威记录详情需要 v3.121.45(其余功能需要 v3.121.43)。提案会排入 AI > NER review 和 AI > Suggest review 队列,供档案管理员审核;安装了 Authority Resolution 插件时,提案也会进入该插件的队列。- Heratio:由
atom-ahg后端直接提供服务(Heratio v1.160.0 至 v1.163.0,在 heratio-dev 上测试;已检查全部 17 种工具和泄漏测试、299 项检查,其中包括 60 条隐藏记录,涵盖禁运、分类和 ICIP)。Heratio 对所有密钥(包括员工密钥)的读取权限均为访客级别,因此对草稿记录提交提案时会返回“未找到”。 openric:OpenRiC 的 RiC-O JSON-LD API(/api/ric/v1),只读;适用于 OpenRiC 参考服务和 OpenRiC Workspace(UUID 密钥、每条记录中的创建者和子项)。支持记录、Agent、地点和关系;按标题搜索(OpenRiC 不支持全文搜索)。OpenRiC Workspace(v0.0.49 及更高版本)是功能完整的后端:从/records/{uuid}/files获取文件文本和参考图像(绝不获取主文件);所有类型的提案都会进入其审核队列(Manage > Proposals to review),并支持list_my_proposals;关系会作为 RiC 关系类型发送,且两端都必须是现有权威记录。参考服务没有文件或审核队列,因此提案会返回给用户,由其自行应用。检测优先级高于 AHG API;OpenRiC 也包含 AHG API 的副本。自 v0.17.26 起,OpenRiC 仅显示已发布的记录。无需密钥:将CATALOGUE_API_KEY留空,或提供 OpenRiC Workspace API 密钥(自 Workspace v0.0.46 起);该密钥只能读取公众可见的内容。Workspace 会拒绝它不识别的密钥。泄漏测试:使用TEST_BACKEND=openric运行tests/no_leak.py,或为 Workspace 设置HIDDEN_FILE。atom-base:通过 AtoM 自带的 REST API(arRestApiPlugin)连接原版 AtoM,已在 AtoM 2.10.2 上测试。搜索、记录、子项和work_through_series均可使用;原版 API 不提供权威记录、IIIF 清单和文件文本,并会对此作出说明。提案不会保存:原版写入 API 会覆盖内容,而不是追加。因此,名称和地点会以单行 CSV 的形式返回,供 AtoM 自带的 Import > CSV 使用(类型 Archival description,更新行为 Update matches ignoring blank fields in CSV,勾选 Skip unmatched records);这样可将其添加到记录中,同时保留其他内容不变。日期会列出供手动录入,因为导入会替换记录的日期。AtoM 会根据记录标识符、标题和保管机构匹配文件,因此没有保管机构的记录无法通过此方式更新。
Stock AtoM:设置
- 管理员 > 插件:启用 arRestApiPlugin。
- 为公共服务创建一个不属于任何组的用户,并生成其 REST API 密钥(编辑该用户)。已登录的档案管理员使用自己的密钥。
- 设置
CATALOGUE_URL、CATALOGUE_API_KEY和CATALOGUE_NAME;GLAM_BACKEND=auto会自动检测 Stock API。
AtoM 2.10.2 的 REST API 只检查“read”权限,不检查“view draft”,因此任何密钥都能通过它读取草稿记录;它还会返回网站对访客隐藏的字段。因此,服务器仅在访客能够打开记录的公开页面时,才将 Stock AtoM 上的记录视为可见;这会应用目录自身的规则(其他情况一律视为“未找到”),并且只传递该页面显示的字段。请勿让任何对象(本服务器除外)接触 API 密钥。
为自己的目录安装
该服务与您的目录并排运行,使用您自己的地址,并且仅通过 API 与目录通信。除非您自行配置,否则不会连接到 AHG 的托管服务。
-
在目录中为公共端点创建一个只读用户,并为其配置 API 密钥。需要提出更改的人应使用各自的员工密钥。
-
将
docker-compose.example.yml复制为docker-compose.yml,并将所有example.org地址替换为您自己的地址。 -
将密钥放入
.env(切勿提交此文件):cat > .env <<'EOF' CATALOGUE_API_KEY=<read-only service user's API key> MCP_SECRET=<Fernet key> EOF使用
python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"生成MCP_SECRET。 -
启动服务:您可以拉取现成的镜像(
docker pull ghcr.io/archiveheritagegroup/ahg-archives-mcp:latest,并在docker-compose.yml中将image:设置为该镜像),也可以自行构建(docker build -t ahg/glam-mcp:phase2 .);然后运行docker compose up -d,并检查curl 127.0.0.1:8031/healthz。如果服务密钥能读取访客可见内容以外的信息,服务将拒绝启动并说明原因(docker compose logs)。 -
检查服务用户的密钥是否只能读取访客可见的内容:
docker run --rm ghcr.io/archiveheritagegroup/ahg-archives-mcp python -m glam_mcp.keycheck https://catalogue.example.org <key>。 -
将两个端点配置在您自己的域名下,通过 HTTPS 提供服务。
docs/nginx-mcp.theahg.co.za.conf是可复制并重命名后使用的示例配置。 -
在向任何人开放之前,针对您的目录运行
tests/no_leak.py。
如果缺少必需设置,服务器会在启动时指出其名称并停止运行,而不会回退到其他人的目录。
| 设置 | 必需 | 含义 |
|---|---|---|
CATALOGUE_URL | 是 | 目录的公共地址,用于生成链接。 |
CATALOGUE_NAME | 是 | 回答中用于称呼目录的名称。 |
CATALOGUE_API_URL | 否 | 目录的 API。默认为 CATALOGUE_URL + /api/v2(atom-base 使用 /api)。 |
CATALOGUE_API_KEY | 公共端点 | 只读服务用户的密钥。 |
GLAM_BACKEND | 否 | auto(默认:启动时询问目录,并在安装了 AHG API 时使用该 API,否则使用 AtoM 自带的 REST API)、atom-ahg 或 atom-base。 |
GLAM_AUTH | 否 | off(公开、只读,默认)或 oauth(已登录)。 |
MCP_PUBLIC_URL | 使用 oauth 时 | 此服务自己的公共地址,用于登录。 |
MCP_SECRET | 使用 oauth 时 | 用于加密已存储目录密钥的 Fernet 密钥。 |
MCP_SIGNED_IN_URL | 否 | 公共端点告知用户登录以提出更改的地址。 |
GLAM_HTTP_PATH | 否 | 端点路径,例如 /mcp 或 /public/mcp。 |
GLAM_DATA | 已登录服务 | 用于存放登录数据(令牌经过哈希处理,密钥经过加密)、每小时提案上限和演示目录的文件夹。请将其挂载到两个服务;没有此项,已登录服务将无法启动。 |
GLAM_CALL_LOG | 否 | 可选的 JSON Lines 工具调用日志:记录工具、目录、结果;对于自由文本(搜索词、名称、提案文本),仅记录其长度和短哈希。仅服务用户可读取,每天一个文件。 |
GLAM_LOG_DAYS | 否 | 日志保留天数,超过后删除(默认 90)。 |
GLAM_PROPOSAL_CAP | 否 | 每位已登录用户每小时可排队的提案条目数(默认 200)。 |
GLAM_OTHER_CATALOGUES | 否 | 以 JSON 格式配置的其他可读取目录(参见“多个目录”)。 |
GLAM_DEMO_DAYS | 否 | 通过 /catalogues 添加的演示目录的有效天数(默认 7)。 |
GLAM_USAGE_LOGS | 否 | 仅适用于已登录服务:用于员工使用情况页面 /usage 的逗号分隔日志列表(默认:服务自身的日志)。添加公共服务的日志即可查看两者。 |
旧名称(PSIS_PUBLIC_BASE、PSIS_API_BASE、PSIS_API_KEY、GLAM_SOURCE_LABEL、GLAM_PUBLIC_BASE、GLAM_SECRET)仍然可用。
docs/AHG_Archives_MCP_Quick_Start.md 是供使用 AHG 托管服务的档案工作者参考的指南,内容包括连接、检查服务是否正常、如何提出有效问题以及如何审核提案。
多个目录
单个服务可以读取多个目录。主目录(CATALOGUE_URL)接收提案和已登录用户的密钥。其他目录为只读,每个目录使用自己的服务密钥(为没有所属组的用户创建密钥,这样返回的内容就只有访客能看到的内容),并且不会收到调用方的密钥或提案:
GLAM_OTHER_CATALOGUES='[{"name": "Heratio", "url": "https://heratio.example.org", "key": "..."}]'
启动时无法访问的目录会被跳过,并显示警告。每个条目都可以设置 "backend",而不是让系统自动检测。
演示目录。 为了演示,目录管理员和编辑可以在已登录服务的 /catalogues 页面添加客户端的目录:输入名称、地址和该目录的只读密钥。随后,Agent 可以通过 list_catalogues 找到它,并使用 catalogue="<name>" 读取。添加的目录会在 GLAM_DEMO_DAYS(7)天后失效。系统会拒绝主机自身网络内的地址。两个服务都从 <GLAM_DATA>/demo-catalogues.json 读取列表,因此无需重启即可共享。
联合。 search_records 使用 catalogue="all" 时,会同时搜索所有目录,每个目录使用各自的访客密钥,并为每条结果标注其所属目录。若要搜索某个目录的联合网络对等端(ahgFederationPlugin),请在此处将每个对等端作为单独的目录添加,并使用该对等端的访客密钥。服务不会通过插件的联合功能进行搜索:插件会使用各自配置的密钥查询其对等端,而其 Elasticsearch 连接器不会排除未发布的记录,因此结果可能包含访客看不到的内容。通过这种方式添加的每个对等端都会通过启动时的密钥检查,并可进行泄露测试。
要通过第二个目录运行无泄露测试,请将 TEST_CATALOGUE 设为该目录的名称。
运行
docs/OPERATIONS.md:更新、备份和恢复(hosting/backup.sh)、回滚以及监控(hosting/healthcheck.sh,服务停止响应时会发送 Workbench 通知)。SECURITY.md:如何报告安全问题。
每个发往目录的请求都会携带 User-Agent AHG-GLAM-MCP/0.7 (+https://www.atom-extensions.com)。若要让服务绕过 fail2ban 或机器人规则,请按前缀 AHG-GLAM-MCP/ 匹配;该前缀在不同版本间保持不变。托管服务的请求来自 169.1.190.139(theahg.ddns.net)。
工具在工作线程中运行,因此一个响应缓慢的目录不会拖延其他调用方。负载测试(tests/load_test.py,使用测试目录,2026 年 10 月 26 日):同时有 25 个客户端,每秒 40 次调用,无错误;记录读取中位数为 0.6 秒,内存占用低于 60 MB。
预构建镜像
每个版本标签(从 v0.4.0 起)都会运行无泄露测试,然后发布 ghcr.io/archiveheritagegroup/ahg-archives-mcp,并使用版本号和 latest 作为标签(.github/workflows/image.yml)。生产环境中请固定使用某个版本。
托管客户端
hosting/client.sh 会在一台主机上为其他机构的目录运行服务。每个客户端运行一对服务(已登录和公开),各自拥有独立地址、登录密钥、日志、使用情况页面和演示目录:
hosting/client.sh add <client> "<Catalogue name>" <catalogue-url> [host] # 提示输入客户端的服务密钥
hosting/client.sh leak-test <client> "<note>" # 记录 tests/no_leak.py 已针对其目录通过测试
hosting/client.sh publish <client> # 配置 nginx 站点和证书(sudo),需先完成 DNS 解析并记录泄漏测试结果
hosting/client.sh check <client> # 检查运行状况,并再次检查密钥
hosting/client.sh list
hosting/client.sh remove <client> # 停止服务并删除其密钥、机密、数据和日志
主机默认为 <client>.mcp.theahg.co.za,端口从 8041 起分配,每个客户端的设置存放在 clients/<client>/.env 中(权限模式为 600,不纳入 git)。镜像由 GLAM_IMAGE 指定。
启动任何服务前,都会检查客户端的密钥(glam_mcp/keycheck.py):如果密钥可能列出所有人的提案,它就是工作人员密钥,会被拒绝;它读取的最新记录样本也必须都能由访客在公开站点上打开。这只是抽查。完整检查使用目录数据库运行 tests/no_leak.py,并以客户端身份执行:在通过 leak-test 记录结果之前,publish 会拒绝发布。同一密钥检查也会保护演示目录页面,其中的目录为只读状态,且仅列出七天。
使用情况数据
已登录服务会在 /usage 提供工作人员页面,显示过去 30 天内按天、按工具、按服务、按结果和按密钥统计的调用次数,以及提案的处理情况(待处理、已接受、已拒绝,按类型分类)。拥有可列出所有人提案权限的目录密钥(管理员和编辑者)可以打开该页面;此密钥仅用于该页面。密钥显示为哈希值的前 8 个字符。将 GLAM_USAGE_LOGS 指向两个服务的日志,并在 nginx 中将 /usage 路由到已登录服务(参见 docs/nginx-mcp.theahg.co.za.conf)。
测试
tests/test_server.py 和 tests/test_auth.py(共 69 项测试)会针对虚假目录运行,不进行网络访问:检查每个读取工具的响应和拒绝情况(401、403、404、429、501、500)、目录选择和密钥、图像获取(仅限自身主机、不跟随重定向、仅限图像类型、大小限制)、从非公开地址响应的演示目录、仅从公开页面读取的标准 AtoM(不会返回只有 API 才能提供的内容)、OpenRiC 适配器、密钥检查中的同主机重定向、除搜索和审核队列外无法发送任何调用、健康状态、数据文件夹规则、每小时提案限制、密钥检查、日志内容,以及登录(哈希令牌、加密密钥、一次性代码、轮换、撤销,以及在目录处撤销密钥)。CI 会在每次推送时运行这些测试:
docker run --rm -v "$PWD/tests:/app/tests:ro" ahg/glam-mcp:phase2 python -m unittest discover -s tests -p 'test_*.py'
tests/no_leak.py 会检查隐藏记录(草稿,以及使用 AHG 扩展时的禁运、机密和受 ICIP 限制的记录)是否绝不会通过任何工具返回:既不能通过引用获取,不能出现在搜索结果或子项中,也不能出现在可见记录的层级结构中。每次推送时,GitHub Actions 都会启动一个临时的标准 AtoM 2.10.2,其中包含已发布和草稿记录(tests/stock-atom),并针对它运行公开服务和测试(.github/workflows/no-leak.yml)。手动运行:
cd tests/stock-atom && docker compose -p stock-atom up -d --build
docker compose -p stock-atom exec -T atom sh /opt/setup.sh # 打印 READER_API_KEY 和 ADMIN_API_KEY
# 使用 CATALOGUE_URL=http://127.0.0.1:8097 和读取者密钥启动服务器,然后:
GLAM_MCP_URL=http://127.0.0.1:8000/mcp CATALOGUE_DB_CNF=db.cnf CATALOGUE_DB=atom PUBLIC_CONTROL_SLUG=published-letter python tests/no_leak.py
docker compose -p stock-atom down -v 会删除测试目录。
版本
- v0.8.2(2026 年 10 月 26 日):stock AtoM 的 children 和 children_count 现在取自访客的树状视图(直接子项、分页、不含草稿),而非返回整个子树的 REST API tree;大型全宗不再导致超时或占用目录。69 项单元测试。
- v0.8.1(2026 年 10 月 26 日):外部测试人员对 stock AtoM 重新测试后:get_children 对草稿和不存在的 slug 给出相同答复(先检查可见性,再调用 API);记录包含来自访客面包屑的 part_of,以及可见子项的 children_count。68 项单元测试。
- v0.8.0(2026 年 10 月 26 日):OpenRiC Workspace 成为完整后端:文件文本和图像、提交至其审核队列的提案、我的提案、作为 RiC 类型的关系、UUID 链接;拒绝将审核者的密钥用作服务密钥;传递目录拒绝请求的原因。密钥检查会等待限流结束;OpenRiC 无需服务密钥。64 项单元测试。
- v0.7.1(2026 年 10 月 26 日):每个请求都使用同一个 User-Agent:
AHG-GLAM-MCP/0.7,其前缀保持不变,以供 fail2ban 和机器人规则使用;健康检查覆盖所有托管客户端;泄漏测试针对 OpenRiC 运行(Workspace 已通过)。 - v0.7.0(2026 年 10 月 26 日):证据发布版,第二部分。工具在线程池中运行(负载下吞吐量提升至 3 倍);每次失败都提供
error代码;通过 openric adapter 接入 OpenRiC Workspace;CI 中加入依赖扫描和 SBOM(镜像中的 pip 已升级);添加SECURITY.md;docs/OPERATIONS.md介绍备份、恢复、回滚和健康警报,均已各测试一次;记录list_catalogues;离开时彻底移除托管客户端。52 项单元测试。 - v0.6.1(2026 年 10 月 26 日):适用于 OpenRiC v0.17.27 的 OpenRiC adapter,该版本仅显示已发布记录:日期取自其日期范围,子项取自其层级,标题搜索支持类型,密钥检查通过其 API 执行。已在本地针对 ric.theahg.co.za 检查。
- v0.6.0(2026 年 10 月 26 日):证据发布版。stock AtoM 字段仅来自公开页面(不从 API 获取字段);OpenRiC adapter(只读);统一的后端表;Heratio 由
atom-ahg提供服务;密钥检查遵循同主机重定向;泄漏测试覆盖 Heratio 的保密表、高于 PUBLIC 的分类、继承的限制,并对每种隐藏记录抽样;单元测试证明除审核队列外没有写入路径。45 项单元测试。 - v0.5.2(2026 年 10 月 26 日):第二轮审核后发布。stock AtoM 字段仅在其自身标题下按完整值匹配;根据实际连接的地址检查演示目录(DNS 重绑定);登录服务要求数据文件夹可写;
/healthz会分别报告无法访问、密钥被拒和未运行;托管客户端公开前必须有记录在案的泄漏测试。39 项单元测试。 - v0.5.1(2026 年 10 月 26 日):将
server.py拆分为 MCP 层、目录适配器、逐次调用策略和设置(行为不变);通过真实浏览器进行登录测试(tests/SIGNIN_TEST.md、tests/signin_check.py)。 - v0.5.0(2026 年 10 月 26 日):独立源代码审核后的安全与可靠性版本。图像获取限定在目录自身的主机;启动时检查服务密钥;stock AtoM 字段仅限公开页面显示的内容;日志不含自由文本,轮换并在 90 天后删除;提案每小时限额保存在磁盘上;CI 中包含单元测试(模拟目录)。
- v0.4.0(2026 年 10 月 26 日):支持多个目录(
list_catalogues、每个读取工具上的catalogue、跨所有目录搜索)、演示目录页面、员工使用情况页面、托管客户端(hosting/client.sh)、预制镜像、密钥检查。
许可证
Copyright (C) 2026 Johan Pieterse, Plain Sailing Information Systems。根据 GNU Affero 通用公共许可证第 3 版或更高版本(AGPL-3.0-or-later)发布;详见 LICENSE。任何人将修改后的版本作为网络服务运行时,都必须向其用户提供修改后的源代码。
联系方式
Archive and Heritage Digital Commons Group - [email protected]
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。