Matricula Toolkit MCP Server
The Matricula Toolkit MCP server provides local tools to inspect, download, verify, diagnose, and prepare Matricula church-book scans for OCR.
Inspect a book to verify accessibility and get sample page information.
Download and inspect a single page.
Download a single page or an inclusive page range.
Verify that a downloaded image is a valid JPEG.
Diagnose a page URL by attempting download and reporting detailed errors.
Prepare an image directory for OCR by listing files and sizes; it does not execute OCR itself.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Matricula Toolkit MCP Serverdownload pages 104 through 303 from the Maribor church book 01519"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Matricula Toolkit
CLI, desktop workbench, and MCP server for downloading Matricula church book scans (matricula-online.eu), with an extensible, machine-readable provider configuration for external genealogical archives.
The Matricula Toolkit helps genealogists and family historians download high-resolution church book scans from Matricula-online and other archives, verify them, and prepare them for OCR/HTR (Optical / Handwritten Text Recognition) with the Kraken backend — all locally, with no cloud services or paid APIs.
Provider data (archive hosts, access classes, verification status) is kept strictly separate from the SSRF security logic. Both the provider policy and the centralized SSRF policy must pass for any network access to be granted.
Features
CLI (
matricula-download): download single pages or page ranges, verify JPEG integrity, diagnose download errorsDesktop workbench (
matricula-desktop, optional PySide6): dark-themed GUI with dashboard, research, books, image browser, hit checking, sources, OCR jobs, system monitoring, installer, settings, and help sectionsMCP server (
matricula-mcp): 7 tools for integration with MCP-compatible clients (inspect_book,inspect_page,download_page,download_range,verify_image,diagnose_error,prepare_ocr)Automatic installer (
matricula-install): OS detection, dependency checks, venv setup, Kraken OCR backend, and model managementExtensible provider configuration (
providers.json): machine-readable configuration for 10 external genealogical archives, separated from SSRF security logic; three capabilities (browser navigation, proxy connection, automated image download) checked independentlySSRF protection: deny-by-default policy (HTTPS only, port 443 only, no credentials, no IP literals, DNS rebinding protection) enforced by
security.pyandlocal_proxy.pyResume support: skips already-downloaded files
JPEG verification: full Pillow decode, not just magic bytes
Atomic saving: temp file +
os.replacePersistent SQLite storage: source records in the platform-appropriate user data directory (XDG / APPDATA / Application Support)
System monitoring: CPU, RAM, and CPU temperature (Linux) with OCR load protection
Configuration: environment variables or
.envfile viapython-dotenvLocal processing only: all downloads and OCR run on your machine
Related MCP server: familysearch-org-mcp
Screenshots
No screenshots are currently included in the repository. Contributions of screenshots
showing the desktop workbench are welcome. Place them under docs/screenshots/ and
reference them here.
Requirements
Python 3.10 or higher
Playwright/Chromium browser (installed via
playwright install chromium)Optional: PySide6 for the desktop workbench (
pip install ".[desktop]")Optional: Kraken OCR backend and compatible
.mlmodelmodels for OCR/HTROperating systems: Linux, macOS, Windows (desktop GUI validated on Linux; platform paths are implemented for all three)
Installation
From source
git clone https://github.com/shadow396-creator/matricula-toolkit.git
cd matricula-toolkit
python -m venv .venv
source .venv/bin/activate # Linux/macOS
# .venv\Scripts\activate # Windows
playwright install chromiumInstallation variants
CLI only (no desktop GUI):
pip install -e .CLI + Desktop workbench (requires PySide6):
pip install -e ".[desktop]"MCP server (same package, no extra dependencies beyond the core):
pip install -e .
# Then run:
python -m matricula_toolkit.mcp_serverDevelopment (includes test and lint dependencies):
pip install -e ".[dev]"Automatic installer
The toolkit includes an installation assistant that detects your operating system, checks for missing prerequisites, sets up a virtual environment, installs Kraken, and verifies the installation. It is idempotent: re-running it does not damage a working installation.
# Check what is missing (no changes)
matricula-install --check-only
# Full interactive installation
matricula-install
# Non-interactive installation (CI / automation)
matricula-install --non-interactive
# Skip virtual environment creation
matricula-install --no-venv
# Skip Kraken OCR backend
matricula-install --no-kraken
# Skip model download
matricula-install --no-modelsThe installer detects OS, distribution, CPU architecture, Python version, RAM, disk
space, and GPU support; checks for existing Python packages and system tools; installs
missing system packages via your distribution's package manager (never silently with
sudo for every step); creates an isolated Python virtual environment; installs
required Python packages and the Playwright Chromium browser; optionally downloads
Kraken OCR models; and verifies the installation.
No cloud services are used. All processing runs locally.
Quick start
Download a single page:
matricula-download page 104 \
--url "https://data.matricula-online.eu/de/slovenia/maribor/maribor-sv-janez-krstnik/01519/" \
--book 01519 \
--out ./downloadsDownload a range of pages:
matricula-download range 104 303 \
--url "https://data.matricula-online.eu/de/slovenia/maribor/maribor-sv-janez-krstnik/01519/" \
--book 01519 \
--out ./downloads \
--wait 5Verify downloaded images:
matricula-download verify ./downloadsDiagnose a page:
matricula-download diagnose 104 \
--url "https://data.matricula-online.eu/de/slovenia/maribor/maribor-sv-janez-krstnik/01519/"Desktop application
Launch the optional desktop workbench (requires .[desktop] extra):
matricula-desktopAvailable sections:
Dashboard — overview and status
Research — book validation, single-page and range downloads
Books — image list with file sizes, open in image browser
Image browser — scrollable image view, zoom, previous/next, dimensions and file info
Hit checking — side-by-side original vs. correction comparison
Transkription korrigieren — manual transcription correction: click words on church book images, correct them, and apply corrections position-accurately to the full transcription with persistent undo/redo
Sources — download history with success/error status, verify all, refresh
OCR jobs — Kraken backend detection, local model search, job execution, job list
System — CPU, RAM, temperature monitoring with 5-second auto-refresh
Installer — automatic installation assistant
Settings — persistent JSON settings, platform-appropriate paths
Help — documentation of all sections and OCR preparation limits
The application exits gracefully with a clear message when PySide6 is not installed.
System monitoring: The status bar shows CPU utilisation, RAM usage, and CPU
temperature (Linux only). The first CPU reading returns "unknown" (baseline); subsequent
readings use a two-sample delta from /proc/stat.
OCR load protection: Before starting an OCR job, the current resource snapshot is
compared against configurable thresholds (ocr_max_cpu_percent, ocr_max_ram_percent,
ocr_max_temperature_c). If any threshold is exceeded, the job is blocked with a
descriptive reason. Unknown sensor values (e.g. no CPU temperature sensor) are treated
as "not available" and block the job when the corresponding limit is configured.
SQLite persistence: Source records are stored in a SQLite database at the platform-appropriate user data directory:
Linux:
$XDG_DATA_HOME/matricula-toolkit/sources.db(default:~/.local/share/matricula-toolkit/sources.db)Windows:
%APPDATA%/MatriculaToolkit/sources.dbmacOS:
~/Library/Application Support/MatriculaToolkit/sources.db
Sources survive application restarts and are shared across service instances.
OCR and historical handwriting
OCR execution requires the Kraken CLI on PATH
and a compatible .mlmodel model file. Neither is bundled with the toolkit. The
automatic installer (matricula-install) can set up Kraken for you.
# Install Kraken via the installer (recommended)
matricula-install
# Or install Kraken manually
pip install krakenKraken models: The installer does not download models by default because model
choice depends on your source material. Suitable models for historical church books can
be downloaded with matricula-install or manually via kraken get <DOI>.
Verified models:
Model | DOI | Type | License | Description |
Kurrent / Sütterlin handwriting HTR |
| recognition | CC-BY-4.0 | German Kurrent handwriting, trained on 12 pages (travel diary by Louise Le Beau). Limited training data — usable but not production-grade. Creator: Janosch Alze (hfm Detmold). |
Fraktur historical print OCR |
| recognition | CC-BY-SA-4.0 | 19th century German Fraktur texts, trained on Austrian newspapers. CER: 1.42. Creator: Stefan Weil (Universitätsbibliothek Mannheim). |
Important: The Kurrent model is a handwriting model (Kurrent/Sütterlin), not a print model. The Fraktur model is a print model for historical German Fraktur type. Do not confuse the two — using a print model on handwriting (or vice versa) will produce poor results.
Download a model:
kraken get 10.5281/zenodo.21747522
kraken get 10.5281/zenodo.6891852Place downloaded .mlmodel files in the models/ directory or any location accessible
to the toolkit.
prepare_ocr lists images in the download directory matching the naming pattern
matricula_<book>_pg<NNN>.jpg. It is an inventory/preparation step only — no OCR is
executed without Kraken.
OCR jobs run with a configurable timeout (ocr_timeout_seconds, default 300s). The
model path is validated before invocation: it must be non-empty, point to an existing
readable file, contain no shell metacharacters, and no path-traversal components (..).
Subprocess is invoked in list form (without shell=True) to prevent shell injection.
No accuracy guarantees are given. OCR/HTR quality depends on the model, source material, and image quality.
Manual transcription correction
The desktop workbench includes a Transkription korrigieren section for manually correcting OCR/HTR transcription errors on church book images. It is the second-to-last entry in the left-hand navigation panel.
How it works
Open the Transkription korrigieren section from the navigation.
Select a page/image — the page's PAGE-XML is parsed to extract word positions (bounding boxes, text, line numbers). Word overlays are drawn on the image.
Click any word on the image (or select it from the word list) to open the correction dialog.
In the dialog, edit the corrected text in the separate correction field and set a readability status (SICHER, UNSICHER, UNLESERLICH). The word's image coordinates (X, Y, width, height) are shown for reference.
Save — the correction is stored in SQLite with the original text position and character offset, so it applies position-accurately even if the corrected word has a different length.
The corrected transcription is shown below the image and updates automatically after each correction.
Key behaviors
Stable positions: Corrections reference the unchanged original text via
original_text_positionandoriginal_text_length. Reconstruction applies corrections descending by offset, so different word lengths don't shift other corrections' positions.Conflict checking: Overlapping text regions raise a
CorrectionConflictError.Persistent undo/redo: Corrections are stored with status
active,reverted, orsuperseded, surviving application restarts. Use Rückgängig (Undo) to revert the most recent active correction.Protection of manual corrections: Corrections are linked via
ocr_job_id; new Kraken OCR runs don't overwrite confirmed corrections automatically.PAGE-XML parsing: Namespace-robust extraction of TextLine/Word/Coords/TextEquiv from PAGE-XML files; missing coordinates default to (0, 0, 0, 0).
Word coordinate requirements
Word overlays require valid bounding-box coordinates from the PAGE-XML:
x, y, width, and height must be present and greater than zero. Words
without coordinates are skipped (no overlay is drawn). The coordinates are
absolute pixels in the original image; image_width_px and image_height_px
store the full image dimensions for durable mapping.
Missing PAGE-XML data
If no PAGE-XML file is found for an image, the original transcription is empty and no word overlays are shown. The section still loads, but there are no words to click or correct. A PAGE-XML file must be generated by Kraken OCR first.
Limitations
Only individual word corrections are supported in the GUI. The data model also allows
regionandfreecorrection types, but the GUI does not yet provide tools for marking free image areas or regions.Corrections are tied to a specific image file (
source_file) and page number. If the image is moved or renamed, the link to its corrections may break.The correction dialog requires PySide6 (the
desktopextra). Without PySide6, the desktop workbench starts but the correction section is unavailable.Corrections are stored per
source_filepath; there is no cross-image or cross-book correction search in this version.
MCP integration
Run the MCP server (stdio transport):
python -m matricula_toolkit.mcp_serverAvailable tools:
Tool | Description |
| Verify a book is accessible |
| Download and inspect a single page |
| Download a single page |
| Download a range of pages |
| Verify a downloaded image is valid JPEG |
| Diagnose a page download error |
| List images prepared for OCR; does not execute OCR itself |
Configuration
Copy .env.example to .env and adjust:
cp .env.example .env
# Edit .env with your settingsAll MATRICULA_* environment variables are automatically loaded from .env via
python-dotenv in the CLI, desktop app, and MCP server. Command-line flags override
environment variables.
See .env.example for the full list of supported variables, including download
settings (URL, book, output directory, wait time, headless mode, viewport, parallelism,
file size limits) and OCR load protection thresholds (CPU, RAM, temperature, timeout).
No real credentials or private configuration values should be stored in examples.
Archive providers
The toolkit includes a machine-readable, extensible provider configuration for
external genealogical archives. Provider data is stored in
src/matricula_toolkit/providers.json and loaded/validated by
src/matricula_toolkit/providers.py. Access control is implemented by
src/matricula_toolkit/provider_policy.py.
Provider data is kept strictly separate from the SSRF security logic in
security.py and local_proxy.py. Both checks must pass for access to be granted;
a provider grant never overrides an SSRF denial.
Three capabilities (independently checked)
Capability | Allowed hosts | Additional condition |
Browser navigation |
| Authentication must not be |
Proxy connection |
| None (SSRF still applies) |
Automated image download |
|
|
Current providers
Enabled (6):
ID | Name | Verification | Viewer | Auth | Image access |
| Matricula Online | verified | html_viewer | public | manual_only |
| Digitalarkivet (NO) | partially_verified | html_viewer | public | manual_only |
| Raduraksti (LV) | partially_verified | html_viewer | account_required | manual_only |
| JewishGen | partially_verified | index_only | public | unknown |
| ARCHION (DE) | partially_verified | unknown | paid_subscription | written_permission_required |
| FamilySearch | partially_verified | unknown | account_required | manual_only |
Disabled (4 — unverified):
ID | Name | Reason |
| Portale Antenati (IT) | Official site not fully reachable (403); hosts and terms unverified |
| GenBaza (PL) | Not yet cleared for automated use |
| Arkivalieronline (DK) | Official site not reachable (transport error) |
| Slave Societies Digital Archive | Official site not resolvable; no hosts verified |
Documentation
See docs/PROVIDER_CONFIGURATION.md for the full
provider configuration guide, including:
Adding a new provider
Verifying hosts and redirects
Closed vocabularies (provider_type, viewer_type, authentication, image_access, verification_status)
Security rules (no wildcards, no IP literals, no URL credentials, HTTPS + port 443 only, exact host matching)
When to enable a provider
Safe testing
Local proxy
The toolkit includes a loopback-only asyncio HTTP/CONNECT proxy
(src/matricula_toolkit/local_proxy.py) that sits between the downloader and
external archive hosts. It enforces SSRF protection at the network layer:
Binds to loopback only (127.0.0.1 / ::1)
Ephemeral port per instance
CONNECT_TIMEOUT_SECONDS=30,TUNNEL_IO_TIMEOUT_SECONDS=60No open proxy: private targets are rejected
No environment variable bypass
The proxy works alongside security.py (centralized SSRF policy) and
provider_policy.py (provider-level access policy). All three must pass for
network access to be granted.
SSRF protection
Server-Side Request Forgery (SSRF) protection is enforced by
src/matricula_toolkit/security.py with a deny-by-default policy:
HTTPS only — no HTTP, no other schemes
Port 443 only — no other ports
No URL credentials — no
user:pass@hostNo IP literals — no IPv4/IPv4-mapped/IPv6 literals
DNS rebinding protection — resolved IPs are re-checked against the allowlist
Exact host matching — subdomains are not implicitly allowed
The provider policy delegates every host check to security.py. A provider grant
never overrides an SSRF denial. Both checks must pass.
Privacy and security
All processing (downloads, image verification, OCR) runs locally on your machine.
The toolkit accesses
matricula-online.euover HTTPS to download publicly accessible church book scans. No other external services are contacted by default.Provider-configured archive hosts are accessed only when explicitly enabled and when both the provider policy and SSRF policy permit it.
Kraken model downloads go to the configured Zenodo DOI endpoints.
No personal genealogical data, GEDCOM files, church book transcriptions, or access credentials are stored, transmitted, or processed by the toolkit.
Source records (download metadata) are stored locally in a SQLite database at the platform-appropriate user data directory.
Model-path validation prevents shell metacharacters and path traversal; subprocess is invoked in list form without
shell=True.SSRF policy is deny-by-default: HTTPS only, port 443 only, no credentials, no IP literals, DNS rebinding protection.
Avoid absolute statements such as "completely secure" or "guaranteed private." Review the terms of use of matricula-online.eu and any configured archive provider, and applicable copyright law in your jurisdiction.
Development and tests
Install development dependencies:
pip install -e ".[dev]"Run the test suite:
pytestRun linting:
ruff check
ruff format --checkRun type checking:
mypy src/matricula_toolkit/Build the wheel:
python -m buildKnown typing note: Pillow does not ship py.typed markers, so MyPy reports an
import-untyped hint for the Pillow import in downloader.py. This is pre-existing
and does not affect runtime behaviour.
License, troubleshooting, and contributing
This tool is licensed under the MIT License. See the LICENSE file.
Legal notice: This tool downloads publicly accessible scans from Matricula-online and other configured archive providers. Please respect the terms of use of each archive and applicable copyright law in your jurisdiction. The authors are not responsible for misuse of this tool.
Troubleshooting:
If PySide6 is not installed,
matricula-desktopexits with a clear message.If Kraken is not on
PATH, OCR jobs report that the backend is unavailable.If no CPU temperature sensor is found, temperature monitoring reports "not available" on Linux.
The first CPU reading returns "unknown" (baseline); subsequent readings use a two-sample delta.
Disabled providers raise
ProviderPolicyErroron any access attempt — they cannot be accidentally used.
Contributing: Bug reports and pull requests are welcome. Please open an issue on
GitHub for bugs or feature requests, and submit pull requests against the main branch.
When adding a new archive provider, update src/matricula_toolkit/providers.json
(never security.py or local_proxy.py without explicit approval), run the provider
tests, and document the provider in docs/PROVIDER_CONFIGURATION.md.
Help Improve Matricula Toolkit
We welcome contributions from external developers and AI-assisted coding agents alike. If you would like to help improve this project, here is how to get started:
Improvement suggestions and bug fixes are welcome. Open a GitHub issue to discuss a bug or feature idea before implementing it.
Existing tests and security mechanisms must be preserved. Do not weaken or remove SSRF protection, provider-policy checks, capability checks, or any existing test to make a change easier to implement.
New features should be secured with appropriate tests. Every new capability or code path should be accompanied by tests that verify correct behavior and security boundaries.
Changes should be documented traceably. Update the README, provider documentation, or inline comments so that reviewers can follow your reasoning.
External contributions should be submitted as a pull request against this repository. Keep pull requests focused and avoid bundling unrelated changes.
AI-assisted coding agents should follow the repository instructions, respect the existing security model, never disclose secrets, and never perform unauthorized actions such as force-pushing, merging without review, or accessing external systems.
Thank you for helping make the Matricula Toolkit better for everyone.
Available Tools
7 toolsdiagnose_errorC
Diagnose a page URL: attempt download and report detailed error
| Name | Required | Description | Default |
|---|---|---|---|
| page | Yes | Page number | |
| base_url | Yes | Matricula viewer base URL |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. 'Attempt download' implies a possible network fetch and side effect, but it never says whether a file is saved, whether this is a read-only probe, what permissions or rate limits apply, or whether failures throw versus return an error payload.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence, front-loaded with the verb and resource, with no filler. It is arguably too short rather than padded, which is the preferred failure mode.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No annotations and no output schema, so the description must explain what 'detailed error' actually contains and what the caller gets back on success versus failure. It does neither, leaving the diagnostic result shape entirely undefined.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters are documented in the schema, so the baseline of 3 applies. The description actually adds a small point of confusion by referring to a 'page URL' rather than the integer page plus base_url the schema defines.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb (diagnose) and resource (a page URL), and the phrase 'attempt download and report detailed error' distinguishes it from the plain download_page sibling by stating it returns diagnostics rather than content. Misfit: it says 'page URL' while the schema actually takes a page number plus a base_url, which muddies the resource identity slightly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use or when-not-to-use guidance. The diagnostic intent implies it is for troubleshooting failures, but the siblings download_page and inspect_page are never named, so the agent must guess which tool to call first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
download_pageC
Download a single page
| Name | Required | Description | Default |
|---|---|---|---|
| book | No | Book identifier | |
| page | Yes | Page number | |
| base_url | Yes | Matricula viewer base URL |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It says 'Download' but does not explain where the file is saved, what is returned, whether authentication is needed, or what side effects occur, leaving significant gaps for a download operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded phrase with no wasted words. However, it is so terse that it provides almost no structural context, bordering on under-specification rather than effective conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has three parameters, no annotations, and no output schema, so the description should explain return behavior and side effects. It does not cover what the download produces, where it is stored, or how failures manifest, leaving the agent with an incomplete picture.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters. The description adds no syntax or meaning beyond the schema, making the baseline score of 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Download') and resource ('a single page'), and the word 'single' distinguishes it from the sibling download_range. It does not name the sibling or clarify how it differs from inspect_page, but the core purpose is clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit guidance on when to use this tool versus download_range or inspect_page, and no prerequisites or exclusions are stated. The only implied usage is that it handles one page instead of a range.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
download_rangeC
Download a range of pages
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | End page (inclusive) | |
| book | No | Book identifier | |
| start | Yes | Start page (inclusive) | |
| base_url | Yes | Matricula viewer base URL |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, yet it discloses nothing about what 'download' produces (files on disk, returned bytes, URLs), whether partial failures are tolerated, or any auth/rate-limit constraints. The only implied behavior is that it operates on multiple pages at once.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single four-word sentence with no filler, but it is under-specified rather than efficient. Front-loading is fine; there simply isn't enough content for the agent to act on.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With four parameters, three of them required, no annotations and no output schema, the description should at minimum explain what a 'download' yields and whether book is mandatory. Everything an agent needs beyond the page bounds and base URL is missing. The complete schema coverage of the surfaces it does touch keeps this from falling lower.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so start, end, book and base_url are each documented in the schema, and the description's 'range of pages' only loosely echoes the inclusive start/end semantics already stated. Baseline 3 applies since the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The verb+resource pair ('Download a range of pages') is concrete, but the description never distinguishes it from the sibling 'download_page', which an agent would naturally consider for the same resource. The word 'range' is the only hint at the difference and the agent must infer it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this versus 'download_page' or 'inspect_book'/'prepare_ocr', nor any prerequisites such as whether a book identifier is needed. Usage must be fully inferred from the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspect_bookA
Inspect a Matricula book: verify accessibility and get sample page info
| Name | Required | Description | Default |
|---|---|---|---|
| book | No | Book identifier | |
| base_url | Yes | Matricula viewer base URL |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden. 'Inspect' and 'verify' imply a non-mutating operation, and it discloses the two things it produces (accessibility status, sample page info), but it says nothing about failure modes (unreachable URL, invalid book id), rate limits, or auth requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence naming the resource then the two outputs, with zero filler. Appropriate size for a two-parameter inspection tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no annotations, the description is the only source for return-value behavior, and 'sample page info' is left undefined. For a simple read-only check this is minimally viable, but an agent cannot predict the response shape or error signaling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with only two params, both documented in the schema itself. The description adds no format hints (e.g., how a book identifier is formed vs. base_url), so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb ('Inspect') plus resource ('a Matricula book'), with the two concrete outcomes named: accessibility verification and sample page info. This clearly separates it from download_page/download_range siblings, though it never names an alternative explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'verify accessibility' implies a pre-flight check before downloading, but the description never states when to call this versus inspect_page or download_page. Usage is inferable rather than declared.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspect_pageC
Download and inspect a single page
| Name | Required | Description | Default |
|---|---|---|---|
| book | No | Book identifier | |
| page | Yes | Page number | |
| base_url | Yes | Matricula viewer base URL |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full behavioral burden and does almost none of it. It says nothing about authentication, network access to the Matricula viewer, failure modes, or whether anything is cached or written to disk by 'download'. Only the minimal 'it downloads and inspects' is conveyed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence with no filler, and the core action is front-loaded. Its brevity is a liability for other dimensions but there is no structural waste to penalize.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no annotations and no output schema, the description needs to explain what a caller gets back from inspecting a page and how errors surface. It omits return values, output destination, and relationship to the sibling tools entirely, leaving significant gaps for a two-required-parameter network operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters (book, page, base_url) are already documented by the schema, making 3 the baseline. The description adds nothing about parameter behavior, such as whether `book` is optional, how `page` interacts with `book`, or what form `base_url` takes.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a verb-plus-resource ('Download and inspect a single page'), so the basic action is understandable. However, it does not distinguish this from the sibling `download_page`, which sounds like it also downloads a single page, nor does it clarify what 'inspect' adds. An agent cannot confidently choose between these two without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus `download_page`, `download_range`, or `inspect_book`. The word 'inspect' weakly implies a verification/diagnostic role, but the description never states a selection condition or prerequisite.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prepare_ocrB
Prepare a directory of images for OCR: list files and sizes
| Name | Required | Description | Default |
|---|---|---|---|
| book | No | Book identifier | |
| directory | No | Directory containing images |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden, and it does useful work by resolving the ambiguity of the name 'prepare_ocr' — clarifying that the tool lists files and sizes rather than mutating or converting anything. However, it never states whether any files are written, whether this is read-only, what permissions are needed, or how large directories are handled, which are real gaps for a tool whose name implies a write/prep step.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler: the action comes first and the concrete behavior ('list files and sizes') follows after the colon. It is efficient, though so terse that it borders on under-specification rather than true conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Both parameters are documented and 'list files and sizes' effectively describes the return shape, which compensates for the absent output schema. What is missing is the behavioral contract an agent needs before invoking: whether anything is created or modified, and how this fits into the sibling workflow.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% ('Book identifier', 'Directory containing images'), so the schema already documents both parameters. The description adds no extra semantics such as path format, defaults for the optional book/directory, or what happens when they are omitted; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb ('prepare ... for OCR') and resource ('a directory of images'), plus the concrete action of listing files and sizes. It does not differentiate itself from any sibling such as verify_image or inspect_page, so an agent must infer the boundary, but the purpose itself is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to choose this over verify_image, inspect_page, or diagnose_error, and no mention of prerequisites such as whether an OCR pipeline must exist or whether files need to be downloaded first. The only guidance is the implicit hint in the phrase 'for OCR'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_imageB
Verify that a downloaded image is a valid JPEG
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to image file |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden and does not meet it. It never says what happens on failure (exception vs. boolean), whether it reads only headers or fully decodes the file, or whether it requires the file to already exist on disk.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no padding or redundancy. Every word (verify, downloaded, JPEG) carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter check with no output schema, the description should state the success/failure signal so an agent knows whether to branch on a return value or catch an error. That, plus the JPEG-only scope question, is the remaining gap; otherwise the tool is simple enough that little more is needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
One parameter with 100% schema description coverage, so the schema already documents the path argument. The description adds only the implication that the path points at a previously downloaded image, no format or validation detail beyond that. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (verify), a specific resource (downloaded image), and the concrete check performed (valid JPEG). That distinguishes it from the sibling tools, which are all page/book retrieval or OCR-prep operations. It does not say whether non-JPEG formats are in scope, keeping it short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Downloaded image" implies the workflow position (a check after download_page/download_range), but there is no explicit when-to-use, when-not-to-use, or named alternative. Usage is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
7 tool updates
v0.1.2- First observed
diagnose_error - First observed
download_page - First observed
download_range - First observed
inspect_book - First observed
inspect_page - First observed
prepare_ocr - First observed
verify_image
TDQS
Scored across 7 tools
Most tools have distinct purposes, but inspect_page and download_page overlap because inspecting a page also downloads it. diagnose_error also partly overlaps with download attempts, though its diagnostic intent helps distinguish it.
All tools follow a consistent snake_case verb_noun pattern: inspect_book, inspect_page, download_page, download_range, verify_image, diagnose_error, prepare_ocr. The convention is predictable throughout.
Seven tools is a well-scoped set for a Matricula book/page downloading and OCR preparation toolkit. Each tool appears to earn its place without obvious redundancy or excessive breadth.
The surface covers book inspection, page inspection, single/range downloads, image validation, error diagnosis, and OCR preparation. Minor gaps exist, such as no batch image verification or actual OCR execution, but core workflows are supported.
Maintenance
Related MCP Connectors
Preserve public web pages as signed, timestamped evidence packages, then verify them, compare versions and monitor pages for changes.
Read-only verifier for 25 ProofRelay MCP tools and non-confidential evidence bundles.
MCP server for Open Archives: Dutch genealogical records and historical page transcriptions.
Read-only XRP Ledger MCP tools with proof-annotation envelopes and signed daily snapshots.
Related MCP Servers
- FlicenseAqualityCmaintenanceEnables users to search catalog metadata, read captured pages, verify quotations, and detect changes in accepted catalog captures for New York City's September 11th Document Portal using local, read-only snapshots.10-
- AlicenseAqualityBmaintenanceEnables direct interaction with FamilySearch.org's shared Family Tree and historical records, including reading and adding people, facts, relationships, sources, notes, memories, record search, and image downloads, without needing a browser.39MIT
- AlicenseAqualityAmaintenanceEnables users to search and browse US National Archives Catalog records, read OCR text, citizen transcriptions, tags, and comments, and download page images for genealogical or historical research. It also supports advanced filtered searches and searching within contributed document text while remaining read-only except for saving page images locally.18MIT
- AlicenseAqualityCmaintenanceEnables searching Dutch archival deeds and records via the Open Archieven API, discovering every scan of a register, and downloading images with full provenance and metadata. It also offers a conservative, locally-OCR-based resolver that suggests candidate scans for a given act without performing automatic matching.6MIT