Skip to main content
Glama
malkreide

swiss-cultural-heritage-mcp

by malkreide

🇨🇭 Part of the Swiss Public Data MCP Portfolio

🏛️ swiss-cultural-heritage-mcp

Version License: MIT Python 3.11+ MCP No Auth Required CI

MCP Server for Swiss cultural heritage — SIK-ISEA artists, Nationalmuseum collections, and the Nationalbibliothek bibliography

🇩🇪 Deutsche Version


Overview

swiss-cultural-heritage-mcp provides AI-native access to Swiss cultural heritage data sources, all without authentication:

Source

Data

API

SIK-ISEA (SIKART)

~17,000 Swiss artists — SIKART biographical data

opendata.swiss CKAN

Nationalmuseum (SNM)

Museum collections (numismatics, seals, special collections)

opendata.swiss CKAN

Nationalbibliothek (NB)

Swiss national bibliography (Helveticat)

OAI-PMH

Memoriav / Memobase

Audiovisual heritage (photo, audio, video)

Linked Open Data (JSON-LD / Hydra)

Dodis

Diplomatic Documents of Switzerland (documents, persons, organisations)

JSON-REST (Solr) + permalinks

This server completes the humanistic dimension of the Swiss public data portfolio — history, literature, and art — alongside existing servers for law (fedlex-mcp), transport, statistics, and more.

The memory-institution facade (Memobase + Dodis) is exposed through three federated tools — search_heritage, get_heritage_item, list_heritage_collections — rather than one tool-family per source. Every result carries source, permalink and licence, and the licence is reported separately for metadata and for the digitised object (they diverge: metadata is open Linked Open Data, but a digitised object may be In Copyright). Only metadata and links are returned — copyright-protected full texts (e.g. Dodis transcriptions) are never reproduced.

Anchor demo query (art): "Find works by Zurich-based painters from the 19th century in the Nationalmuseum, and cross-reference with their biography in the SIK-ISEA artist database."

Anchor demo query (memory institutions): "Which sources on the development of the Zurich Volksschule in the 19th century can be found in the Swiss memory institutions?"search_heritage(query="Volksschule Zürich", collection="all", date_from="1800", date_to="1899").

Demo

Demo: Claude using heritage_cross_search


Related MCP server: Swiss Data Protection MCP

Features

  • 🏛️ 11 tools, 2 resources, 2 prompts across five data sources

  • 🔍 heritage_cross_search — parallel search across SIK-ISEA + SNM + NB in a single call

  • 🏛️ search_heritage — federated facade over Memobase + Dodis with per-result source, permalink and split metadata/digitised-object licence

  • 🌐 Bilingual output (Markdown / JSON)

  • 🔓 No API key required — all data under open licenses

  • ☁️ Dual transport — stdio (Claude Desktop) + Streamable HTTP (cloud)

  • 📚 Prompt templates for art research and finding educational materials

Project phase: Phase 1 — read-only. Every tool is annotated readOnlyHint: true; there are no write or destructive operations. Moving to Phase 2 (write-capable) requires the prerequisites in docs/roadmap.md.


Prerequisites

  • Python 3.11+

  • uv (recommended) or pip


Installation

# Clone the repository
git clone https://github.com/malkreide/swiss-cultural-heritage-mcp.git
cd swiss-cultural-heritage-mcp

# Install
pip install -e .
# or with uv:
uv pip install -e .

Or with uvx (no permanent installation):

uvx swiss-cultural-heritage-mcp

Quickstart

# stdio (for Claude Desktop)
python -m swiss_cultural_heritage_mcp.server

# Streamable HTTP (port 8000)
python -m swiss_cultural_heritage_mcp.server --http --port 8000

Try it immediately in Claude Desktop:

"Who is Ferdinand Hodler?" "What coins does the Nationalmuseum have from Zurich?" "Find publications about Volksschule in the Swiss national bibliography"

→ More use cases by audience →


Configuration

Claude Desktop

Edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):

{
  "mcpServers": {
    "swiss-cultural-heritage": {
      "command": "python",
      "args": ["-m", "swiss_cultural_heritage_mcp.server"]
    }
  }
}

Or with uvx:

{
  "mcpServers": {
    "swiss-cultural-heritage": {
      "command": "uvx",
      "args": ["swiss-cultural-heritage-mcp"]
    }
  }
}

Config file locations:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

  • Windows: %APPDATA%\Claude\claude_desktop_config.json

Cloud Deployment (SSE for browser access)

For use via claude.ai in the browser (e.g. on managed workstations without local software):

Render.com (recommended):

  1. Push/fork the repository to GitHub

  2. On render.com: New Web Service → connect GitHub repo

  3. Select region Frankfurt (EU) — required for Swiss public-sector use under revDSG / EDÖB. See docs/data-residency.md.

  4. Set start command: python -m swiss_cultural_heritage_mcp.server --http --port 8000

  5. In claude.ai under Settings → MCP Servers, add: https://your-app.onrender.com/sse

💡 "stdio for the developer laptop, SSE for the browser."

For container deployments (Docker / Kubernetes / Cloud Run): the repository ships a hardened Dockerfile (non-root UID 10001). See docs/security.md for recommended SecurityContext and docs/network-egress.md for egress policy. The service runs single-instance by default; before scaling horizontally, see docs/scaling.md for the session-affinity prerequisites.


Available Tools

SIK-ISEA (Swiss Art Research)

Tool

Description

heritage_search_artists

Search ~17,000 Swiss artists (SIKART) by name or place

heritage_get_artist

Full artist profile by SIKART ID (HAUPTNR)

Nationalmuseum (SNM)

Tool

Description

heritage_search_museum_datasets

Search SNM datasets on opendata.swiss

heritage_browse_collection

Browse objects within a collection via CKAN DataStore

Nationalbibliothek (NB)

Tool

Description

heritage_search_helveticat

Search Swiss national bibliography via OAI-PMH

heritage_list_nb_collections

List available OAI-PMH sets

heritage_get_publication

Full Dublin Core metadata for a publication

Cross-Source

Tool

Description

heritage_cross_search

Parallel search across SIK-ISEA + SNM + NB

Memory institutions (Memobase + Dodis) — federated facade

Tool

Description

search_heritage

Federated search over Memobase + Dodis (collection = memobase | dodis | all), with date_from / date_to / media_type filters. Every result carries source, permalink and a split metadata/digitised-object licence

get_heritage_item

Full metadata for one object (collection, item_id). Metadata + links only — protected full texts are never reproduced

list_heritage_collections

Discovery: which collections exist, their protocol, auth and licences — including the probed-but-not-connected sources (Bundesarchiv, Landesmuseum) and why

Example Use Cases

Query

Tool

"Who is Ferdinand Hodler?"

heritage_get_artist

"Find Swiss artists born in Basel"

heritage_search_artists

"What coins from Zurich does the Nationalmuseum have?"

heritage_browse_collection

"Find publications about Volksschule"

heritage_search_helveticat

"Search for everything about Sophie Taeuber-Arp"

heritage_cross_search

"Sources on the 19th-c. Zurich Volksschule in Swiss memory institutions"

search_heritage


Architecture

┌─────────────────┐     ┌──────────────────────────────┐     ┌──────────────────────────┐
│   Claude / AI   │────▶│  Swiss Cultural Heritage MCP  │────▶│  SIK-ISEA                │
│   (MCP Host)    │◀────│  (MCP Server)                │◀────│  opendata.swiss / CKAN   │
└─────────────────┘     │                              │     ├──────────────────────────┤
                        │  11 Tools · 2 Resources      │────▶│  Nationalmuseum (SNM)    │
                        │  2 Prompts                   │◀────│  opendata.swiss / CKAN   │
                        │  Stdio | SSE                 │     ├──────────────────────────┤
                        │                              │────▶│  Nationalbibliothek (NB) │
                        │  No authentication required  │◀────│  OAI-PMH (Helveticat)    │
                        │                              │     ├──────────────────────────┤
                        │  search_heritage facade      │────▶│  Memobase (JSON-LD/Hydra)│
                        │                              │◀────│  Dodis (JSON-REST/Solr)  │
                        └──────────────────────────────┘     └──────────────────────────┘

Data Source Characteristics

Source

Protocol

Coverage

Auth

SIK-ISEA (SIKART)

CKAN DataStore

~17,000 Swiss artists

None

Nationalmuseum

CKAN DataStore

Museum collections

None

Nationalbibliothek

OAI-PMH

Swiss national bibliography

None

Memoriav / Memobase

Linked Open Data (JSON-LD / Hydra, RiC-O)

Audiovisual heritage (~460k records)

None

Dodis

JSON-REST (Solr) + stable permalinks

Diplomatic documents, persons, organisations

None

Architecture decision — memory-institution facade

Verified by a live probe on 2026-07-19 (methodology: mcp-data-source-probe). Four memory institutions were evaluated; only two expose a clean, no-auth, standardised interface and are connected:

Source

Result

Why

Memobase

✅ connected

Linked-Open-Data API (api.memobase.ch, JSON-LD/Hydra); full-text search via ?q=, single record via /record/<id>; pagination via offset/size. Metadata open; digitised objects carry per-object rightsstatements.org rights ("In Copyright", access "onsite").

Dodis

✅ connected

JSON-REST/Solr (beta.dodis.ch/api): search via POST /api/solr/query, item via GET /api/solr/full/<id>; stable permalinks dodis.ch/<id>. Metadata open (citation required); documents carry per-document rights (TEI/PDF behind the permalink).

Bundesarchiv

⛔ not connected

The recherche.bar.admin.ch backend (CMI AIS) sits behind eIAM login and Google reCAPTCHA — not machine-accessible without emulating a session, which is fragile and against the operator's intent.

Landesmuseum

⛔ not connected

sammlung.nationalmuseum.ch has no public API (only an internal, undocumented Ajax/HTML surface) — connecting it would require scraping, which violates the resilience guardrails.

Consequences: three federated tools instead of four tool-families; every result carries source + permalink + a split metadata/digitised-object licence; no copyright-protected full text is reproduced (metadata + links only); bar and landesmuseum are documented as gated via list_heritage_collections, not scraped.


Project Structure

swiss-cultural-heritage-mcp/
├── src/swiss_cultural_heritage_mcp/
│   ├── __init__.py              # Package
│   └── server.py                # 11 tools, 2 resources, 2 prompts
├── tests/
│   └── test_server.py           # Unit + integration tests (mocked HTTP)
├── .github/workflows/ci.yml     # GitHub Actions (Python 3.11/3.12/3.13)
├── .github/dependabot.yml       # Monthly dependency + SDK update PRs
├── Dockerfile                   # Multi-stage, non-root, HEALTHCHECK
├── docs/                        # security, network-egress, scaling, data-residency, roadmap
├── pyproject.toml
├── CHANGELOG.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md                    # This file (English)
└── README.de.md                 # German version

Single-file server: the 11 tools live in one server.py rather than a tools/ package. At this size a single, linear module is easier to read and review than a split; if the tool count grows materially, the SIK-ISEA / SNM / NB / cross-search blocks are the natural split points.


Safety & Limits

  • Read-only: All tools perform HTTP GET requests only — no data is written, modified, or deleted.

  • No personal data: The APIs return institutional records (artworks, publications, artists). No personally identifiable information (PII) is processed or stored by this server.

  • Rate limits: The opendata.swiss and OAI-PMH endpoints are not rate-limit-documented; use limit parameters conservatively. The server enforces a 30s timeout per request.

  • Data freshness: Records reflect the upstream source at query time. No caching is performed by this server.

  • Terms of service: Data is subject to the ToS of each source — SIK-ISEA, opendata.swiss, Nationalbibliothek OAI-PMH. All data is published under open licenses (CC0 / CC BY).

  • No guarantees: This server is a community project, not affiliated with SIK-ISEA, SNM, or NB. Availability depends on upstream APIs.


Known Limitations

  • SIK-ISEA: Artist data is updated periodically; very recent acquisitions may not yet be reflected

  • Nationalmuseum: Only datasets published on opendata.swiss are accessible; not all SNM collections are available

  • Nationalbibliothek: OAI-PMH harvesting is rate-limited; large result sets require pagination

  • Cross-search: Response time depends on the slowest of the three sources


Testing

# Unit tests (no API key required)
PYTHONPATH=src pytest tests/ -m "not live"

# Integration tests (live API calls)
pytest tests/ -m "live"

# Lint and format, as CI runs them
ruff check src/ tests/ scripts/
ruff format --check src/ tests/ scripts/

Ruff is pinned to an exact version in pyproject.toml ([project.optional-dependencies] dev), so pip install -e ".[dev]" gives you the version CI uses and the lint gates agree with it. Installing a newer ruff on top changes the rule set and the formatter, and reports differences on code nobody touched. See CONTRIBUTING.md.


MCP Protocol Version

Item

Value

SDK

mcp[cli]>=2.0.0,<3 (pinned in pyproject.toml)

Served via the initialize handshake

2024-11-052025-11-25 — the handshake ceiling

Served via the per-request envelope

2026-07-28

Who picks

The client's first request, once per connection: a request carrying the 2026-07-28 _meta envelope opens a modern connection, anything else opens a handshake connection. A later claim from the other era is refused.

Update policy

The SDK pin is the source of truth for the protocol version. Dependabot opens monthly mcp update PRs; protocol-version bumps are reviewed there and recorded in CHANGELOG.md.

This server does not override the negotiation — the official mcp SDK decides, and both eras are reachable over either transport (stdio and HTTP alike). Pin the SDK, not a hand-rolled version string, to control which protocol versions are spoken. The numbers above are the pinned SDK's own registry (mcp_types.version: HANDSHAKE_PROTOCOL_VERSIONS, MODERN_PROTOCOL_VERSIONS) — read them there rather than from this table if the pin has moved.

Both revisions are pinned in tests/test_protocol_version.py and asserted against the installed SDK — including the handshake ceiling, measured against a live initialize through the assembled ASGI stack. A Dependabot bump of mcp can no longer move either number without this table going stale unnoticed.


Changelog

See CHANGELOG.md


Contributing

See CONTRIBUTING.md


Security

See SECURITY.md (Deutsch) for the security posture and how to report a vulnerability.


License

MIT License — see LICENSE


Author

Hayal Oezkan · malkreide


Installation

Run via uv's uvx — no clone or manual install needed. Add to your MCP client config (mcpServers for Claude Desktop, Cursor and Windsurf; use a top-level servers key for VS Code in .vscode/mcp.json):

{
  "mcpServers": {
    "swiss-cultural-heritage-mcp": {
      "command": "uvx",
      "args": [
        "swiss-cultural-heritage-mcp"
      ]
    }
  }
}

Available Tools

11 tools
get_heritage_itemA
Read-onlyIdempotent

Ruft die vollständigen Metadaten eines Objekts aus Memobase oder Dodis ab.

Liefert Metadaten, Permalink und Lizenz (Metadaten- und Digitalisat-/Dokument- recht getrennt). Geschützte Volltexte (Dodis-Transkriptionen) werden nicht reproduziert — dafür verweist die Antwort auf den Permalink.

Args: params (HeritageItemInput): - collection: 'memobase' oder 'dodis' - item_id (str): Objekt-ID aus search_heritage - response_format: 'markdown' oder 'json'

Returns: ResultEnvelope | str: Objekt-Metadaten inkl. Provenienz und Lizenz.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds meaningful behavioral context beyond annotations, notably that protected full texts (Dodis transcriptions) are not reproduced and the response links to the permalink instead. It also discloses the response format options (markdown/json), improving transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured, using an Args/Returns layout. It front-loads the main action, adds a key caveat, and lists parameters in a compact way. Every sentence contributes value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the core functionality, supported collections, output contents, protected-text behavior, and response formats. Minor gaps include no mention of error handling or default response_format, but given the presence of annotations and an output schema, the overall context is adequate for correct tool usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite the schema description coverage being 0%, the description's Args section summarizes all three parameters (collection, item_id, response_format) with their valid values and clarifies that item_id originates from search_heritage. While it omits the schema's concrete examples, it provides a functional overview that helps the agent understand parameter roles.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Ruft die vollständigen Metadaten eines Objekts aus Memobase oder Dodis ab.' It clearly distinguishes itself from sibling search and list tools by targeting single-object metadata retrieval, and further specifies that it returns permalink, license, provenance, and a caveat about protected full texts.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the expected workflow by stating that item_id comes from 'search_heritage', which gives clear context for when to use this tool. However, it does not explicitly name alternative tools or provide exclusion criteria (e.g., 'don't use for full-text extraction'), so it falls just short of full explicit guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

heritage_browse_collectionA
Read-onlyIdempotent

Durchsucht Objekte innerhalb eines SNM-Sammlungsdatensatzes via CKAN DataStore.

Voraussetzung: Resource-ID aus heritage_search_museum_datasets.

Args: params (CollectionBrowseInput): - resource_id (str): CKAN Resource-ID (aus heritage_search_museum_datasets) - query (str | None): Suchbegriff (z. B. 'Zürich', 'Karl der Grosse', 'Gold') - limit / offset: Paginierung - response_format: 'markdown' oder 'json'

Returns: str: Liste von Sammlungsobjekten mit verfügbaren Feldern.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the description's addition of return format and prerequisite adds context but does not significantly extend beyond what annotations imply. No behavioral aspects like rate limits or auth are mentioned, but annotations suffice.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Structured with a concise intro, prerequisite line, bullet-pointed args, and returns line. Every sentence is purposeful and front-loaded with the main action. No wasted words, appropriate length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given rich annotations and an existing output schema, the description covers the prerequisite, input parameters, and return format. It explains pagination via limit/offset and response_format choices. It feels complete for a browsing tool, with no missing critical information.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Description adds value beyond the schema by listing parameters with examples (e.g., query: 'Zürich', 'Karl der Grosse', 'Gold') and clarifying the prerequisite for resource_id. Although schema coverage is 0%, the description compensates well by explaining each parameter's purpose and usage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states it searches objects within an SNM collection dataset via CKAN DataStore. The verb 'Durchsucht' and specific resource 'Objekte innerhalb eines SNM-Sammlungsdatensatzes' provide clear purpose. The prerequisite for resource ID from heritage_search_museum_datasets further distinguishes it from sibling tools like heritage_cross_search.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states the prerequisite of having a resource ID from heritage_search_museum_datasets, guiding when to use this tool. However, it does not explicitly state when not to use it or provide alternative tools for similar tasks, though sibling names give implicit context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

heritage_get_artistA
Read-onlyIdempotent

Ruft den vollständigen SIKART-Datensatz zu einer Künstler·in ab.

Args: params (ArtistDetailInput): - artist_id (str): SIKART-ID (HAUPTNR aus heritage_search_artists) - response_format: 'markdown' oder 'json'

Returns: str: Vollständiges Profil mit Lebensdaten, Orten, Kurzbiografie und Links.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive. Description adds return value details (profile with life data, places, biography, links). No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is well-structured with Args and Returns sections, but could be slightly more front-loaded. No fluff, but the bullet list could be more compact.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simple nature (one parameter object with two fields), annotations, and presumed output schema, the description covers everything needed: input usage, return format, and data included.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite schema description coverage at 0%, the description clearly explains both parameters: artist_id cross-references sibling tool, and response_format lists possible values with default. Adds meaning beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states it retrieves the complete SIKART dataset for an artist. Distinguishes from sibling 'heritage_search_artists' which is for searching, as this tool takes a specific ID to get full details.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly notes the prerequisite: artist_id from heritage_search_artists. Does not provide when-not or alternatives, but context is sufficient for a simple retrieval tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

heritage_get_publicationA
Read-onlyIdempotent

Ruft vollständige Dublin-Core-Metadaten einer Publikation der NB ab.

Args: params (PublicationDetailInput): - identifier (str): OAI-ID aus heritage_search_helveticat - response_format: 'markdown' oder 'json'

Returns: str: Vollständige DC-Metadaten (Titel, Autor, Verlag, Sprache, Rechte, etc.).

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, openWorldHint=true, covering safety and idempotency. The description adds that it returns complete Dublin Core metadata, which is useful but not critical beyond annotations. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise—two clear sentences followed by a compact Args/Returns block—with no redundant information. The main purpose is front-loaded, and every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simple input (one required param with a default optional format) and the presence of an output schema, the description adequately covers the return value as a string of Dublin Core metadata. It does not discuss error handling, but that is not critical for this level of completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already provides detailed descriptions for both parameters (identifier and response_format), so the tool description's Args block adds little new information. Schema description coverage is effectively high, meeting the baseline for this dimension.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it retrieves complete Dublin Core metadata of a publication from the Swiss National Library ('NB'). This distinguishes it from siblings like heritage_search_helveticat (search) and heritage_get_artist (artist details), providing a specific verb+resource combination.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies use after a search to get detailed metadata, but lacks explicit when-not-to-use or alternative guidance. Given clear sibling differentiation and the context of a retrieval tool, the implied usage is sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

heritage_list_nb_collectionsA
Read-onlyIdempotent

Listet verfügbare Sammlungen/Sets der Nationalbibliothek auf (OAI-PMH ListSets).

Args: params (NbCollectionsInput | None): - response_format: 'markdown' (Standard) oder 'json'

Returns: str: Liste aller OAI-PMH Sets mit Bezeichner (setSpec) und Name.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, and openWorldHint=true, indicating no side effects. The description adds that the tool performs an OAI-PMH ListSets request and returns a list with setSpec and name, which is useful but does not significantly enhance the behavioral profile beyond what annotations provide. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with a clear one-sentence purpose followed by structured Args and Returns sections. It front-loads the main action and avoids fluff. The total length is appropriate for the tool's simplicity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the input parameter and return format comprehensively for a simple list tool. It mentions the output contains setSpec and name. However, it lacks details on pagination, if applicable, or sample output. Given the tool's low complexity and presence of an output schema (per context), the description is nearly complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has descriptions for NbCollectionsInput and ResponseFormat, but context indicates low schema coverage. The description adds the default value and explains that response_format can be 'markdown' (default) or 'json'. This is helpful but largely redundant given the schema's enum and default. With only one parameter and schema already providing structure, the description adds marginal value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists available collections/sets of the national library via OAI-PMH ListSets. It specifies the verb 'listet' (lists) and the resource 'Sammlungen/Sets der Nationalbibliothek', making the purpose unambiguous. This distinguishes it from sibling tools like 'heritage_browse_collection' which likely explores a specific collection.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives. The description does not mention prerequisites, use cases, or exclude scenarios. While the sibling tools offer browsing, searching, and retrieval, the description fails to explicitly differentiate usage, leaving the agent to infer from tool names.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

heritage_search_artistsA
Read-onlyIdempotent

Sucht Schweizer Künstler·innen in den SIKART-Daten (~17'000 Einträge).

SIKART (Lexikon zur Kunst in der Schweiz, herausgegeben vom Schweizerischen Institut für Kunstwissenschaft SIK-ISEA) dokumentiert historische und zeitgenössische Kunstschaffende mit biografischen Grunddaten. Die Suche läuft als CKAN-DataStore-Volltextsuche über alle Felder; mehrere Begriffe werden UND-verknüpft. Liefert die exakte Suche keine Treffer, wird automatisch breiter mit dem spezifischsten Begriff gesucht und das Resultat als match_type: fuzzy markiert (ARCH-003); bleibt es leer, match_type: none.

Args: params (ArtistSearchInput): - query (str | None): Name, Beruf oder Stichwort (z. B. 'Hodler') - region (str | None): Geburts-/Sterbeort oder Kanton (z. B. 'Basel') - limit (int): Max. Ergebnisse (Standard: 20) - offset (int): Paginierungs-Offset - response_format: 'markdown' oder 'json'

Returns: str: Liste gefundener Künstler·innen mit Name, Lebensdaten, Kanton, Kurzbiografie.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses full-text search, AND combination, automatic fuzzy fallback, and match_type markers. Annotations already indicate readOnly and idempotent, so the description adds value beyond that.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Efficient structure: purpose sentence, data source, search mechanics, then bullet-point Args, and Returns. No wasted words; front-loaded with key action.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (search, fallback, pagination, output format), the description covers all aspects including return format and examples. Output schema is described in the 'Returns' section.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description lists each parameter with meanings and examples (e.g., 'Hodler', 'Basel') Add meaningful context beyond the schema, which has descriptions but context signal indicates 0% overlay coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it searches for Swiss artists in the SIKART database using a specific verb ('Sucht') and resource. It distinguishes from sibling tools like heritage_get_artist (single artist) and heritage_search_helveticat (library catalog).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use this tool versus alternatives like heritage_cross_search or heritage_get_artist. The description focuses on search mechanics but omits situational advice.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

heritage_search_helveticatA
Read-onlyIdempotent

Durchsucht die Schweizerische Nationalbibliothek (Helveticat) via OAI-PMH.

Args: params (HelvticatSearchInput): - query (str | None): Clientseitige Filterung (Titel, Autor) - set_spec (str | None): OAI-Set-ID (aus heritage_list_nb_collections) - from_date (str | None): Datum von (YYYY oder YYYY-MM-DD) - until_date (str | None): Datum bis (YYYY oder YYYY-MM-DD) - limit (int): Max. Ergebnisse 1–50 (Standard: 10) - response_format: 'markdown' oder 'json'

Returns: str: Liste von Publikationen mit Titel, Autor, Jahr, Schlagwörtern und Identifier.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=true and destructiveHint=false. The description adds behavioral context: it performs client-side filtering via OAI-PMH, which clarifies that no server-side full-text search is supported. This goes beyond the annotations and informs the agent of limitations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured: a one-sentence summary followed by a clear Args section and a Returns line. Every sentence adds value; no redundancy. The most critical information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with several parameters and an output schema, the description covers purpose, all parameters, and return format. It does not detail the output schema structure, but since an output schema exists (context signals indicate true), this is acceptable. Missing: example usage or note on when to use JSON vs markdown output.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite schema description coverage being 0% per context signals, the description provides a detailed, parameter-by-parameter breakdown (query, set_spec, dates, limit, response_format) with clear semantics and examples. This compensates fully for any missing schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description starts with 'Durchsucht die Schweizerische Nationalbibliothek (Helveticat) via OAI-PMH', clearly stating the verb, resource, and method. This distinguishes it from siblings like heritage_cross_search or heritage_search_museum_datasets, which target different collections or engines.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not explicitly state when to use this tool versus alternatives. It implies usage for searching the National Library catalog but offers no exclusion criteria or guidance on sibling tools. A simple note like 'Use for Helveticat searches only' would improve clarity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

heritage_search_museum_datasetsA
Read-onlyIdempotent

Sucht Datensätze des Schweizerischen Nationalmuseums (SNM) auf opendata.swiss.

Das SNM publiziert Sammlungsdaten als Open Data: Numismatik (~100'000 Münzen), Siegelsammlung (~80'000 Objekte), Spezialsammlungen und weitere. Bei 0 exakten Treffern wird die Solr-Suche automatisch gelockert (OR-verknüpfte Präfix-Wildcards) und das Resultat als match_type: fuzzy markiert (ARCH-003).

Args: params (MuseumSearchInput): - query (str | None): Suchbegriff über Titel/Beschreibung - collection (str | None): Sammlungsfilter (z. B. 'numismatik') - limit / offset: Paginierung - response_format: 'markdown' oder 'json'

Returns: str: Liste verfügbarer SNM-Datensätze mit Titel, Beschreibung und Download-URLs (CSV, XLSX, JSON).

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark readOnlyHint=true and destructiveHint=false, so the safety profile is clear. The description adds valuable behavioral detail: automatic query relaxation to OR wildcards on zero exact hits and fuzzy marking. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections: purpose, data scope, special behavior, args, returns. It is concise and informative, though the fuzzy matching detail could be integrated more tightly. No wasted sentences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of an output schema, the description adequately covers all necessary aspects: tool purpose, data source, query behavior, parameter details, and return format. It is complete for agent invocation without additional context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite schema coverage of 0% in the description, the text includes a detailed args section explaining each parameter's purpose, type, and examples (e.g., 'query' searches title/description, 'collection' filters like 'numismatik'). This adds significant meaning beyond the schema alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb and resource: 'Sucht Datensätze des Schweizerischen Nationalmuseums auf opendata.swiss', specifying the exact domain and data source. It differentiates from siblings like heritage_browse_collection by focusing on cross-collection search via opendata.swiss, though not explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It does not mention when not to use it, prerequisites, or compare with sibling tools like heritage_cross_search. Usage context is implied but not explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_heritage_collectionsA
Read-onlyIdempotent

Listet die Gedächtnisinstitutionen der föderierten Fassade und ihren Status auf.

Discovery-Tool für search_heritage / get_heritage_item: welche collection-Werte gibt es, welches Protokoll, welche Auth, welche Lizenz (Metadaten vs. Digitalisat)? Auch die geprüften, aber bewusst nicht angebundenen Quellen (Bundesarchiv, Landesmuseum) werden mit Grund ausgewiesen.

Args: params (HeritageCollectionsInput | None): - response_format: 'markdown' (Standard) oder 'json'

Returns: ResultEnvelope | str: Sammlungen mit Status, Protokoll, Auth und Lizenzen.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds behavioral context by explaining that the tool lists status, protocols, auth, licenses, and even discloses deliberately non-connected sources with reasons. This goes beyond the annotation flags and gives the agent a realistic picture of the tool's output scope.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-structured: a front-loaded purpose sentence, a discovery context sentence, a note about excluded sources, and a structured Args/Returns block. Every sentence contributes useful information, with no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and a moderate complexity, the description covers the essential aspects: purpose, usage relationship to sibling tools, parameter options, and return content (ResultEnvelope | str with collections/status/protocol/auth/licenses). It does not discuss error cases or format details, but overall it is complete enough for reliable selection and invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite schema description coverage of 0%, the description compensates by documenting the params structure: HeritageCollectionsInput | None, with response_format accepting 'markdown' (default) or 'json'. It adds meaning beyond the raw schema by stating the default and the allowed values. However, it does not explain what the markdown vs. json output looks like, which is a minor gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource claim: 'Listet die Gedächtnisinstitutionen der föderierten Fassade und ihren Status auf.' It further distinguishes itself from siblings by positioning it as a discovery tool for search_heritage/get_heritage_item and specifying what it reveals (collection values, protocol, auth, license). This clearly separates it from the sibling list tools like heritage_list_nb_collections.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use the tool: as a Discovery-Tool for search_heritage and get_heritage_item, to enumerate available collection values and their protocols/auth/licenses. It also explains that non-connected sources are included with reasons. It lacks an explicit 'when not to use' statement but provides sufficient context for appropriate selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_heritageA
Read-onlyIdempotent

Durchsucht Schweizer Gedächtnisinstitutionen (Memobase, Dodis) föderiert.

Föderierte Fassade über zwei Quellen mit offenen, standardisierten Schnittstellen: Memobase (audiovisuelles Kulturerbe, Linked-Open-Data-API) und Dodis (Diplomatische Dokumente der Schweiz, JSON-REST/Solr). Bei collection='all' wird parallel gesucht; fällt eine Quelle aus, liefern die übrigen trotzdem (die Fehlerquelle wird im meta.errors und — sofern ein Progress-Token vorliegt — via ctx.warning gemeldet).

Jeder Treffer trägt Quelle, Permalink und Lizenz, wobei Metadaten- und Digitalisat-Lizenz getrennt ausgewiesen werden (sie fallen bei diesen Quellen auseinander). Es werden nur Metadaten und Links geliefert — keine geschützten Volltexte.

date_from/date_to/media_type werden clientseitig auf die je Quelle abgerufene Seite angewandt (die Upstreams bieten hierfür keine verlässlichen Serverfilter); die Trefferzahl kann dadurch kleiner als limit sein — ggf. offset erhöhen.

Args: params (HeritageSearchInput): - query (str): Suchbegriff - collection: 'memobase' | 'dodis' | 'all' - date_from/date_to: Jahr-Filter (clientseitig) - media_type (str): Typ-Filter (clientseitig) - limit/offset: Paginierung pro Quelle - response_format: 'markdown' oder 'json' ctx (Context): vom MCP-SDK injiziert (Progress/Warnungen); bei direktem Aufruf None.

Returns: ResultEnvelope | str: Aggregierte, normalisierte Treffer inkl. Provenienz.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Even with annotations declaring readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false, the description adds substantial behavioral detail: parallel federated search, partial failure tolerance with error reporting via meta.errors and ctx.warning, separate metadata/digitization licenses, and the explicit statement that only metadata and links are returned—no protected full texts. It also explains client-side filtering and its impact on result counts, which is valuable beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured: a clear one-liner opening, followed by paragraphs on federated behavior, hit details, client-side filtering, Args, and Returns. It front-loads the purpose and uses headers/bullets effectively. It is somewhat longer than strictly necessary because the Args section partially duplicates schema information, but the additional context earns its place, so it remains appropriately concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex federated search tool with multiple parameters and edge cases, the description is complete. It covers error handling, licensing, client-side filtering, pagination, and the output format (ResultEnvelope | str). The presence of an output schema means detailed return values are not needed, but the description still states that results include provenance. This is a thorough and self-sufficient description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description includes an 'Args:' section that covers all parameters and adds meaning beyond the schema. For example, it specifies that date_from/date_to and media_type are applied client-side, that limit/offset paginate per source, and that ctx is injected by the MCP SDK. The schema itself has basic descriptions, but the description enriches them with behavioral context and clarifies the federated semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description starts with 'Durchsucht Schweizer Gedächtnisinstitutionen (Memobase, Dodis) föderiert,' which clearly states the verb (searches), resource (Swiss memory institutions), and scope (federated across Memobase and Dodis). It is specific, but it does not explicitly differentiate itself from sibling tools like heritage_cross_search or heritage_search_helveticat, so it stops 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when the tool is appropriate: it searches specific sources (Memobase and Dodis), and explains the default behavior for collection='all' including failure tolerance. It also notes that date and media type filters are client-side, which guides expectations. However, it does not explicitly mention alternatives or 'when not to use' this tool, so it lacks the exclusionary guidance needed for a 5.

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.

  1. 3 tool updatesv0.5.0
    • Addedget_heritage_item
    • Addedlist_heritage_collections
    • Addedsearch_heritage
  2. 8 tool updatesv0.3.0
    • Changedheritage_browse_collection3 fields changed
      • addedOutput schema / $defs
        Added value: +{
        +  "ResultEnvelope": {
        +    "description": "Einheitlicher Response-Envelope für Such-/Listen-Tools.",
        +    "properties": {
        +      "count": {
        +        "description": "Anzahl zurückgegebener Einträge",
        +        "title": "Count",
        +        "type": "integer"
        +      },
        +      "has_more": {
        +        "default": false,
        +        "description": "Weitere Ergebnisse verfügbar",
        +        "title": "Has More",
        +        "type": "boolean"
        +      },
        +      "match_type": {
        +        "default": "exact",
        +        "description": "Trefferart (ARCH-003): 'exact' = direkte Suche, 'fuzzy' = gelockerte/erweiterte Suche nach 0 exakten Treffern, 'none' = keine Treffer",
        +        "enum": [
        +          "exact",
        +          "fuzzy",
        +          "none"
        +        ],
        +        "title": "Match Type",
        +        "type": "string"
        +      },
        +      "meta": {
        +        "anyOf": [
        +          {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Tool-spezifische Zusatzfelder",
        +        "title": "Meta"
        +      },
        +      "offset": {
        +        "anyOf": [
        +          {
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Paginierungs-Offset",
        +        "title": "Offset"
        +      },
        +      "results": {
        +        "description": "Datensätze (quellnah)",
        +        "items": {
        +          "additionalProperties": true,
        +          "type": "object"
        +        },
        +        "title": "Results",
        +        "type": "array"
        +      },
        +      "source": {
        +        "anyOf": [
        +          {
        +            "$ref": "#/$defs/SourceInfo"
        +          },
        +          {
        +            "items": {
        +              "$ref": "#/$defs/SourceInfo"
        +            },
        +            "type": "array"
        +          }
        +        ],
        +        "description": "Quelle(n) inkl. Lizenz",
        +        "title": "Source"
        +      },
        +      "total": {
        +        "anyOf": [
        +          {
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Gesamtzahl upstream verfügbar",
        +        "title": "Total"
        +      }
        +    },
        +    "required": [
        +      "source",
        +      "count"
        +    ],
        +    "title": "ResultEnvelope",
        +    "type": "object"
        +  },
        +  "SourceInfo": {
        +    "description": "Provenienz und Lizenz einer Datenquelle.",
        +    "properties": {
        +      "license": {
        +        "title": "License",
        +        "type": "string"
        +      },
        +      "name": {
        +        "title": "Name",
        +        "type": "string"
        +      },
        +      "url": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "title": "Url"
        +      }
        +    },
        +    "required": [
        +      "name",
        +      "license"
        +    ],
        +    "title": "SourceInfo",
        +    "type": "object"
        +  }
        +}
      • addedOutput schema / properties / result / anyOf
        Added value: +[
        +  {
        +    "$ref": "#/$defs/ResultEnvelope"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • removedOutput schema / properties / result / type
        Removed value: -"string"
    • Changedheritage_cross_search5 fields changed
      • addedInput schema / $defs / CrossSearchInput / properties / response_format
        Added value: +{
        +  "$ref": "#/$defs/ResponseFormat",
        +  "default": "markdown"
        +}
      • addedInput schema / $defs / ResponseFormat
        Added value: +{
        +  "description": "Ausgabeformat für Tool-Antworten.",
        +  "enum": [
        +    "markdown",
        +    "json"
        +  ],
        +  "title": "ResponseFormat",
        +  "type": "string"
        +}
      • addedOutput schema / $defs
        Added value: +{
        +  "ResultEnvelope": {
        +    "description": "Einheitlicher Response-Envelope für Such-/Listen-Tools.",
        +    "properties": {
        +      "count": {
        +        "description": "Anzahl zurückgegebener Einträge",
        +        "title": "Count",
        +        "type": "integer"
        +      },
        +      "has_more": {
        +        "default": false,
        +        "description": "Weitere Ergebnisse verfügbar",
        +        "title": "Has More",
        +        "type": "boolean"
        +      },
        +      "match_type": {
        +        "default": "exact",
        +        "description": "Trefferart (ARCH-003): 'exact' = direkte Suche, 'fuzzy' = gelockerte/erweiterte Suche nach 0 exakten Treffern, 'none' = keine Treffer",
        +        "enum": [
        +          "exact",
        +          "fuzzy",
        +          "none"
        +        ],
        +        "title": "Match Type",
        +        "type": "string"
        +      },
        +      "meta": {
        +        "anyOf": [
        +          {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Tool-spezifische Zusatzfelder",
        +        "title": "Meta"
        +      },
        +      "offset": {
        +        "anyOf": [
        +          {
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Paginierungs-Offset",
        +        "title": "Offset"
        +      },
        +      "results": {
        +        "description": "Datensätze (quellnah)",
        +        "items": {
        +          "additionalProperties": true,
        +          "type": "object"
        +        },
        +        "title": "Results",
        +        "type": "array"
        +      },
        +      "source": {
        +        "anyOf": [
        +          {
        +            "$ref": "#/$defs/SourceInfo"
        +          },
        +          {
        +            "items": {
        +              "$ref": "#/$defs/SourceInfo"
        +            },
        +            "type": "array"
        +          }
        +        ],
        +        "description": "Quelle(n) inkl. Lizenz",
        +        "title": "Source"
        +      },
        +      "total": {
        +        "anyOf": [
        +          {
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Gesamtzahl upstream verfügbar",
        +        "title": "Total"
        +      }
        +    },
        +    "required": [
        +      "source",
        +      "count"
        +    ],
        +    "title": "ResultEnvelope",
        +    "type": "object"
        +  },
        +  "SourceInfo": {
        +    "description": "Provenienz und Lizenz einer Datenquelle.",
        +    "properties": {
        +      "license": {
        +        "title": "License",
        +        "type": "string"
        +      },
        +      "name": {
        +        "title": "Name",
        +        "type": "string"
        +      },
        +      "url": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "title": "Url"
        +      }
        +    },
        +    "required": [
        +      "name",
        +      "license"
        +    ],
        +    "title": "SourceInfo",
        +    "type": "object"
        +  }
        +}
      • addedOutput schema / properties / result / anyOf
        Added value: +[
        +  {
        +    "$ref": "#/$defs/ResultEnvelope"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • removedOutput schema / properties / result / type
        Removed value: -"string"
    • Changedheritage_get_artist3 fields changed
      • addedOutput schema / $defs
        Added value: +{
        +  "ResultEnvelope": {
        +    "description": "Einheitlicher Response-Envelope für Such-/Listen-Tools.",
        +    "properties": {
        +      "count": {
        +        "description": "Anzahl zurückgegebener Einträge",
        +        "title": "Count",
        +        "type": "integer"
        +      },
        +      "has_more": {
        +        "default": false,
        +        "description": "Weitere Ergebnisse verfügbar",
        +        "title": "Has More",
        +        "type": "boolean"
        +      },
        +      "match_type": {
        +        "default": "exact",
        +        "description": "Trefferart (ARCH-003): 'exact' = direkte Suche, 'fuzzy' = gelockerte/erweiterte Suche nach 0 exakten Treffern, 'none' = keine Treffer",
        +        "enum": [
        +          "exact",
        +          "fuzzy",
        +          "none"
        +        ],
        +        "title": "Match Type",
        +        "type": "string"
        +      },
        +      "meta": {
        +        "anyOf": [
        +          {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Tool-spezifische Zusatzfelder",
        +        "title": "Meta"
        +      },
        +      "offset": {
        +        "anyOf": [
        +          {
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Paginierungs-Offset",
        +        "title": "Offset"
        +      },
        +      "results": {
        +        "description": "Datensätze (quellnah)",
        +        "items": {
        +          "additionalProperties": true,
        +          "type": "object"
        +        },
        +        "title": "Results",
        +        "type": "array"
        +      },
        +      "source": {
        +        "anyOf": [
        +          {
        +            "$ref": "#/$defs/SourceInfo"
        +          },
        +          {
        +            "items": {
        +              "$ref": "#/$defs/SourceInfo"
        +            },
        +            "type": "array"
        +          }
        +        ],
        +        "description": "Quelle(n) inkl. Lizenz",
        +        "title": "Source"
        +      },
        +      "total": {
        +        "anyOf": [
        +          {
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Gesamtzahl upstream verfügbar",
        +        "title": "Total"
        +      }
        +    },
        +    "required": [
        +      "source",
        +      "count"
        +    ],
        +    "title": "ResultEnvelope",
        +    "type": "object"
        +  },
        +  "SourceInfo": {
        +    "description": "Provenienz und Lizenz einer Datenquelle.",
        +    "properties": {
        +      "license": {
        +        "title": "License",
        +        "type": "string"
        +      },
        +      "name": {
        +        "title": "Name",
        +        "type": "string"
        +      },
        +      "url": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "title": "Url"
        +      }
        +    },
        +    "required": [
        +      "name",
        +      "license"
        +    ],
        +    "title": "SourceInfo",
        +    "type": "object"
        +  }
        +}
      • addedOutput schema / properties / result / anyOf
        Added value: +[
        +  {
        +    "$ref": "#/$defs/ResultEnvelope"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • removedOutput schema / properties / result / type
        Removed value: -"string"
    • Changedheritage_get_publication3 fields changed
      • addedOutput schema / $defs
        Added value: +{
        +  "ResultEnvelope": {
        +    "description": "Einheitlicher Response-Envelope für Such-/Listen-Tools.",
        +    "properties": {
        +      "count": {
        +        "description": "Anzahl zurückgegebener Einträge",
        +        "title": "Count",
        +        "type": "integer"
        +      },
        +      "has_more": {
        +        "default": false,
        +        "description": "Weitere Ergebnisse verfügbar",
        +        "title": "Has More",
        +        "type": "boolean"
        +      },
        +      "match_type": {
        +        "default": "exact",
        +        "description": "Trefferart (ARCH-003): 'exact' = direkte Suche, 'fuzzy' = gelockerte/erweiterte Suche nach 0 exakten Treffern, 'none' = keine Treffer",
        +        "enum": [
        +          "exact",
        +          "fuzzy",
        +          "none"
        +        ],
        +        "title": "Match Type",
        +        "type": "string"
        +      },
        +      "meta": {
        +        "anyOf": [
        +          {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Tool-spezifische Zusatzfelder",
        +        "title": "Meta"
        +      },
        +      "offset": {
        +        "anyOf": [
        +          {
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Paginierungs-Offset",
        +        "title": "Offset"
        +      },
        +      "results": {
        +        "description": "Datensätze (quellnah)",
        +        "items": {
        +          "additionalProperties": true,
        +          "type": "object"
        +        },
        +        "title": "Results",
        +        "type": "array"
        +      },
        +      "source": {
        +        "anyOf": [
        +          {
        +            "$ref": "#/$defs/SourceInfo"
        +          },
        +          {
        +            "items": {
        +              "$ref": "#/$defs/SourceInfo"
        +            },
        +            "type": "array"
        +          }
        +        ],
        +        "description": "Quelle(n) inkl. Lizenz",
        +        "title": "Source"
        +      },
        +      "total": {
        +        "anyOf": [
        +          {
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Gesamtzahl upstream verfügbar",
        +        "title": "Total"
        +      }
        +    },
        +    "required": [
        +      "source",
        +      "count"
        +    ],
        +    "title": "ResultEnvelope",
        +    "type": "object"
        +  },
        +  "SourceInfo": {
        +    "description": "Provenienz und Lizenz einer Datenquelle.",
        +    "properties": {
        +      "license": {
        +        "title": "License",
        +        "type": "string"
        +      },
        +      "name": {
        +        "title": "Name",
        +        "type": "string"
        +      },
        +      "url": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "title": "Url"
        +      }
        +    },
        +    "required": [
        +      "name",
        +      "license"
        +    ],
        +    "title": "SourceInfo",
        +    "type": "object"
        +  }
        +}
      • addedOutput schema / properties / result / anyOf
        Added value: +[
        +  {
        +    "$ref": "#/$defs/ResultEnvelope"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • removedOutput schema / properties / result / type
        Removed value: -"string"
    • Changedheritage_list_nb_collections3 fields changed
      • addedOutput schema / $defs
        Added value: +{
        +  "ResultEnvelope": {
        +    "description": "Einheitlicher Response-Envelope für Such-/Listen-Tools.",
        +    "properties": {
        +      "count": {
        +        "description": "Anzahl zurückgegebener Einträge",
        +        "title": "Count",
        +        "type": "integer"
        +      },
        +      "has_more": {
        +        "default": false,
        +        "description": "Weitere Ergebnisse verfügbar",
        +        "title": "Has More",
        +        "type": "boolean"
        +      },
        +      "match_type": {
        +        "default": "exact",
        +        "description": "Trefferart (ARCH-003): 'exact' = direkte Suche, 'fuzzy' = gelockerte/erweiterte Suche nach 0 exakten Treffern, 'none' = keine Treffer",
        +        "enum": [
        +          "exact",
        +          "fuzzy",
        +          "none"
        +        ],
        +        "title": "Match Type",
        +        "type": "string"
        +      },
        +      "meta": {
        +        "anyOf": [
        +          {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Tool-spezifische Zusatzfelder",
        +        "title": "Meta"
        +      },
        +      "offset": {
        +        "anyOf": [
        +          {
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Paginierungs-Offset",
        +        "title": "Offset"
        +      },
        +      "results": {
        +        "description": "Datensätze (quellnah)",
        +        "items": {
        +          "additionalProperties": true,
        +          "type": "object"
        +        },
        +        "title": "Results",
        +        "type": "array"
        +      },
        +      "source": {
        +        "anyOf": [
        +          {
        +            "$ref": "#/$defs/SourceInfo"
        +          },
        +          {
        +            "items": {
        +              "$ref": "#/$defs/SourceInfo"
        +            },
        +            "type": "array"
        +          }
        +        ],
        +        "description": "Quelle(n) inkl. Lizenz",
        +        "title": "Source"
        +      },
        +      "total": {
        +        "anyOf": [
        +          {
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Gesamtzahl upstream verfügbar",
        +        "title": "Total"
        +      }
        +    },
        +    "required": [
        +      "source",
        +      "count"
        +    ],
        +    "title": "ResultEnvelope",
        +    "type": "object"
        +  },
        +  "SourceInfo": {
        +    "description": "Provenienz und Lizenz einer Datenquelle.",
        +    "properties": {
        +      "license": {
        +        "title": "License",
        +        "type": "string"
        +      },
        +      "name": {
        +        "title": "Name",
        +        "type": "string"
        +      },
        +      "url": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "title": "Url"
        +      }
        +    },
        +    "required": [
        +      "name",
        +      "license"
        +    ],
        +    "title": "SourceInfo",
        +    "type": "object"
        +  }
        +}
      • addedOutput schema / properties / result / anyOf
        Added value: +[
        +  {
        +    "$ref": "#/$defs/ResultEnvelope"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • removedOutput schema / properties / result / type
        Removed value: -"string"
    • Changedheritage_search_artists3 fields changed
      • addedOutput schema / $defs
        Added value: +{
        +  "ResultEnvelope": {
        +    "description": "Einheitlicher Response-Envelope für Such-/Listen-Tools.",
        +    "properties": {
        +      "count": {
        +        "description": "Anzahl zurückgegebener Einträge",
        +        "title": "Count",
        +        "type": "integer"
        +      },
        +      "has_more": {
        +        "default": false,
        +        "description": "Weitere Ergebnisse verfügbar",
        +        "title": "Has More",
        +        "type": "boolean"
        +      },
        +      "match_type": {
        +        "default": "exact",
        +        "description": "Trefferart (ARCH-003): 'exact' = direkte Suche, 'fuzzy' = gelockerte/erweiterte Suche nach 0 exakten Treffern, 'none' = keine Treffer",
        +        "enum": [
        +          "exact",
        +          "fuzzy",
        +          "none"
        +        ],
        +        "title": "Match Type",
        +        "type": "string"
        +      },
        +      "meta": {
        +        "anyOf": [
        +          {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Tool-spezifische Zusatzfelder",
        +        "title": "Meta"
        +      },
        +      "offset": {
        +        "anyOf": [
        +          {
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Paginierungs-Offset",
        +        "title": "Offset"
        +      },
        +      "results": {
        +        "description": "Datensätze (quellnah)",
        +        "items": {
        +          "additionalProperties": true,
        +          "type": "object"
        +        },
        +        "title": "Results",
        +        "type": "array"
        +      },
        +      "source": {
        +        "anyOf": [
        +          {
        +            "$ref": "#/$defs/SourceInfo"
        +          },
        +          {
        +            "items": {
        +              "$ref": "#/$defs/SourceInfo"
        +            },
        +            "type": "array"
        +          }
        +        ],
        +        "description": "Quelle(n) inkl. Lizenz",
        +        "title": "Source"
        +      },
        +      "total": {
        +        "anyOf": [
        +          {
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Gesamtzahl upstream verfügbar",
        +        "title": "Total"
        +      }
        +    },
        +    "required": [
        +      "source",
        +      "count"
        +    ],
        +    "title": "ResultEnvelope",
        +    "type": "object"
        +  },
        +  "SourceInfo": {
        +    "description": "Provenienz und Lizenz einer Datenquelle.",
        +    "properties": {
        +      "license": {
        +        "title": "License",
        +        "type": "string"
        +      },
        +      "name": {
        +        "title": "Name",
        +        "type": "string"
        +      },
        +      "url": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "title": "Url"
        +      }
        +    },
        +    "required": [
        +      "name",
        +      "license"
        +    ],
        +    "title": "SourceInfo",
        +    "type": "object"
        +  }
        +}
      • addedOutput schema / properties / result / anyOf
        Added value: +[
        +  {
        +    "$ref": "#/$defs/ResultEnvelope"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • removedOutput schema / properties / result / type
        Removed value: -"string"
    • Changedheritage_search_helveticat3 fields changed
      • addedOutput schema / $defs
        Added value: +{
        +  "ResultEnvelope": {
        +    "description": "Einheitlicher Response-Envelope für Such-/Listen-Tools.",
        +    "properties": {
        +      "count": {
        +        "description": "Anzahl zurückgegebener Einträge",
        +        "title": "Count",
        +        "type": "integer"
        +      },
        +      "has_more": {
        +        "default": false,
        +        "description": "Weitere Ergebnisse verfügbar",
        +        "title": "Has More",
        +        "type": "boolean"
        +      },
        +      "match_type": {
        +        "default": "exact",
        +        "description": "Trefferart (ARCH-003): 'exact' = direkte Suche, 'fuzzy' = gelockerte/erweiterte Suche nach 0 exakten Treffern, 'none' = keine Treffer",
        +        "enum": [
        +          "exact",
        +          "fuzzy",
        +          "none"
        +        ],
        +        "title": "Match Type",
        +        "type": "string"
        +      },
        +      "meta": {
        +        "anyOf": [
        +          {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Tool-spezifische Zusatzfelder",
        +        "title": "Meta"
        +      },
        +      "offset": {
        +        "anyOf": [
        +          {
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Paginierungs-Offset",
        +        "title": "Offset"
        +      },
        +      "results": {
        +        "description": "Datensätze (quellnah)",
        +        "items": {
        +          "additionalProperties": true,
        +          "type": "object"
        +        },
        +        "title": "Results",
        +        "type": "array"
        +      },
        +      "source": {
        +        "anyOf": [
        +          {
        +            "$ref": "#/$defs/SourceInfo"
        +          },
        +          {
        +            "items": {
        +              "$ref": "#/$defs/SourceInfo"
        +            },
        +            "type": "array"
        +          }
        +        ],
        +        "description": "Quelle(n) inkl. Lizenz",
        +        "title": "Source"
        +      },
        +      "total": {
        +        "anyOf": [
        +          {
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Gesamtzahl upstream verfügbar",
        +        "title": "Total"
        +      }
        +    },
        +    "required": [
        +      "source",
        +      "count"
        +    ],
        +    "title": "ResultEnvelope",
        +    "type": "object"
        +  },
        +  "SourceInfo": {
        +    "description": "Provenienz und Lizenz einer Datenquelle.",
        +    "properties": {
        +      "license": {
        +        "title": "License",
        +        "type": "string"
        +      },
        +      "name": {
        +        "title": "Name",
        +        "type": "string"
        +      },
        +      "url": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "title": "Url"
        +      }
        +    },
        +    "required": [
        +      "name",
        +      "license"
        +    ],
        +    "title": "SourceInfo",
        +    "type": "object"
        +  }
        +}
      • addedOutput schema / properties / result / anyOf
        Added value: +[
        +  {
        +    "$ref": "#/$defs/ResultEnvelope"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • removedOutput schema / properties / result / type
        Removed value: -"string"
    • Changedheritage_search_museum_datasets3 fields changed
      • addedOutput schema / $defs
        Added value: +{
        +  "ResultEnvelope": {
        +    "description": "Einheitlicher Response-Envelope für Such-/Listen-Tools.",
        +    "properties": {
        +      "count": {
        +        "description": "Anzahl zurückgegebener Einträge",
        +        "title": "Count",
        +        "type": "integer"
        +      },
        +      "has_more": {
        +        "default": false,
        +        "description": "Weitere Ergebnisse verfügbar",
        +        "title": "Has More",
        +        "type": "boolean"
        +      },
        +      "match_type": {
        +        "default": "exact",
        +        "description": "Trefferart (ARCH-003): 'exact' = direkte Suche, 'fuzzy' = gelockerte/erweiterte Suche nach 0 exakten Treffern, 'none' = keine Treffer",
        +        "enum": [
        +          "exact",
        +          "fuzzy",
        +          "none"
        +        ],
        +        "title": "Match Type",
        +        "type": "string"
        +      },
        +      "meta": {
        +        "anyOf": [
        +          {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Tool-spezifische Zusatzfelder",
        +        "title": "Meta"
        +      },
        +      "offset": {
        +        "anyOf": [
        +          {
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Paginierungs-Offset",
        +        "title": "Offset"
        +      },
        +      "results": {
        +        "description": "Datensätze (quellnah)",
        +        "items": {
        +          "additionalProperties": true,
        +          "type": "object"
        +        },
        +        "title": "Results",
        +        "type": "array"
        +      },
        +      "source": {
        +        "anyOf": [
        +          {
        +            "$ref": "#/$defs/SourceInfo"
        +          },
        +          {
        +            "items": {
        +              "$ref": "#/$defs/SourceInfo"
        +            },
        +            "type": "array"
        +          }
        +        ],
        +        "description": "Quelle(n) inkl. Lizenz",
        +        "title": "Source"
        +      },
        +      "total": {
        +        "anyOf": [
        +          {
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Gesamtzahl upstream verfügbar",
        +        "title": "Total"
        +      }
        +    },
        +    "required": [
        +      "source",
        +      "count"
        +    ],
        +    "title": "ResultEnvelope",
        +    "type": "object"
        +  },
        +  "SourceInfo": {
        +    "description": "Provenienz und Lizenz einer Datenquelle.",
        +    "properties": {
        +      "license": {
        +        "title": "License",
        +        "type": "string"
        +      },
        +      "name": {
        +        "title": "Name",
        +        "type": "string"
        +      },
        +      "url": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "title": "Url"
        +      }
        +    },
        +    "required": [
        +      "name",
        +      "license"
        +    ],
        +    "title": "SourceInfo",
        +    "type": "object"
        +  }
        +}
      • addedOutput schema / properties / result / anyOf
        Added value: +[
        +  {
        +    "$ref": "#/$defs/ResultEnvelope"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • removedOutput schema / properties / result / type
        Removed value: -"string"
  3. 8 tool updatesv0.2.0
    • First observedheritage_browse_collection
    • First observedheritage_cross_search
    • First observedheritage_get_artist
    • First observedheritage_get_publication
    • First observedheritage_list_nb_collections
    • First observedheritage_search_artists
    • First observedheritage_search_helveticat
    • First observedheritage_search_museum_datasets

TDQS

A3.8/5.0

Scored across 11 tools

Disambiguation3/5

Most tools are clearly separated by source (SIKART, SNM, NB, Memobase/Dodis) and action (search vs. get), but `heritage_cross_search` and `search_heritage` both perform multi-source federated searches, which could cause an agent to pick the wrong one. The detailed descriptions clarify the different source sets, but the names alone are not sufficiently distinct.

Naming Consistency2/5

Naming conventions are inconsistent: some tools use `heritage_<verb>_<object>` (e.g., `heritage_search_artists`, `heritage_get_publication`), while others use `<verb>_heritage_<object>` (e.g., `search_heritage`, `get_heritage_item`, `list_heritage_collections`). The position of 'heritage' varies, and `heritage_cross_search` is an odd compound that doesn't follow the verb_noun pattern. This makes the tool set harder to navigate predictably.

Tool Count5/5

The 11 tools map cleanly to the three main institutions (SIKART, SNM, National Library) plus the federated facade for Memobase/Dodis. Each source has search and detail tools, plus discovery tools for collections. The count is well-scoped for the domain and there is no bloat.

Completeness4/5

The tool set covers search, retrieval, and collection discovery for each integrated source, with the ability to browse objects in SNM datasets. Missing are a unified cross-search across all five institutions (only grouped subsets exist) and any write operations, but those are not expected for a read-only heritage data API. Minor gaps, such as no SIKART collection listing, are workable.

Maintenance

ActivityMaintained
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers