Skip to main content
Glama
malkreide

swiss-cultural-heritage-mcp

by malkreide

heritage_search_helveticat

Read-onlyIdempotent

Search the Swiss National Library catalog for publications. Use full-text queries or browse collections, filter by date, and retrieve titles, authors, years, keywords, and identifiers.

Instructions

Durchsucht die Schweizerische Nationalbibliothek (Helveticat).

Zwei Zugänge derselben Quelle, und der Aufruf wählt sie:

  • query ohne set_spec → SRU, eine echte serverseitige Volltextsuche über den Gesamtbestand, mit Trefferzahl. Findet die Anfrage nichts, wird einmal gelockert wiederholt (alle Wörter statt der Wortfolge) und das Ergebnis als match_type: fuzzy markiert.

  • set_spec (mit oder ohne Zeitfenster) → OAI-PMH, das eine Sammlung seitenweise ausliefert. query filtert dann nur noch innerhalb der abgerufenen Seite; die Ausgabe sagt das.

Die Trennung ist nicht Geschmack, sondern gemessen: SRU kennt die OAI-Sets nicht (alma.mms_memberOf="helveticat" → 0 Treffer), und OAI-PMH kennt keine Volltextsuche. Beide Identifier sind dieselben, also frisst heritage_get_publication jedes Ergebnis von beiden Wegen.

Args: params (HelvticatSearchInput): - query (str | None): Suchbegriff (serverseitig ohne set_spec) - set_spec (str | None): Sammlung aus heritage_list_nb_collections - from_date (str | None): Änderungsdatum von (nur mit set_spec) - until_date (str | None): Änderungsdatum bis (nur mit set_spec) - 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.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
resultYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed4 schema fields changedv0.6.0
    • changedInput schema / $defs / HelvticatSearchInput / properties / from_date / description
      Previous value: -"Publikationen ab diesem Datum (YYYY oder YYYY-MM-DD)"New value: +"Nur Katalogsätze, die seit diesem Datum geändert wurden (YYYY-MM-DD). ACHTUNG: Änderungsdatum des Katalogsatzes, NICHT Erscheinungsjahr — ein Buch von 1890 kann letzte Woche bearbeitet worden sein. Nur zusammen mit `set_spec`."
    • changedInput schema / $defs / HelvticatSearchInput / properties / query / description
      Previous value: -"Suchbegriff für clientseitige Filterung (Titel, Autor, Schlagwort) — z. B. 'Volksschule Zürich', 'Gottfried Keller', 'Bildungspolitik'. Hinweis: OAI-PMH unterstützt keine serverseitige Volltextsuche."New value: +"Suchbegriff (Titel, Autor·in, Schlagwort) — z. B. 'Volksschule Zürich', 'Gottfried Keller', 'Bildungspolitik'. Ohne `set_spec` läuft er als serverseitige Volltextsuche über den ganzen Bestand; zusammen mit `set_spec` filtert er nur innerhalb der abgerufenen Seite dieser Sammlung."
    • changedInput schema / $defs / HelvticatSearchInput / properties / set_spec / description
      Previous value: -"OAI-Set-Bezeichner (aus heritage_list_nb_collections) — z. B. 'swissbook'"New value: +"Sammlung durchblättern statt suchen — OAI-Set-Bezeichner aus heritage_list_nb_collections (z. B. 'swissbook', 'xrara'). Schliesst die serverseitige Volltextsuche aus: die Sammlungen sind dort nicht abbildbar."
    • changedInput schema / $defs / HelvticatSearchInput / properties / until_date / description
      Previous value: -"Publikationen bis zu diesem Datum (YYYY oder YYYY-MM-DD)"New value: +"Nur Katalogsätze, die bis zu diesem Datum geändert wurden (YYYY-MM-DD). Änderungsdatum, nicht Erscheinungsjahr. Nur zusammen mit `set_spec`."
  2. Changed3 schema fields changedv0.3.0
    • 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. First observedv0.2.0

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint/openWorldHint/idempotentHint=true and destructiveHint=false, covering the safety profile. The description adds genuinely valuable behavioral context beyond that: the one-time loosened fuzzy retry marked as match_type: fuzzy, the pagination semantics of OAI-PMH (query filters only within the fetched page), and the measured incompatibility of the two protocols. This is rich additional disclosure, though the date-parameter caveat partly lives in the schema.

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 dense but every sentence earns its place: purpose, two-mode bullet list, the bolded measured-split rationale, then a compact Args list and Returns line. It is front-loaded with the purpose and scannable via bullets. Only modest over-length from the appended protocol-comparison paragraph, which is justified by the tool's genuine complexity.

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 combining two protocols with conditional parameters, a fuzzy retry, date-semantics caveats, and an output-format choice (markdown/json), the description covers purpose, both usage paths, param constraints, and return shape ('Liste von Publikationen mit Titel, Autor, Jahr, Schlagwörtern und Identifier'). It is near-complete; the only minor gap is no explicit statement of how the markdown vs json output differs.

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's Args section adds key interaction semantics the schema alone cannot convey: query is a server-side full-text search WITHOUT set_spec but only filters within the fetched page WITH it; from_date/until_date apply solely with set_spec. While the schema properties do carry their own descriptions, the conditional relationships and the two-protocol branching are unique to the description. Strong compensation despite the 0% schema-coverage signal.

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 opening line 'Durchsucht die Schweizerische Nationalbibliothek (Helveticat)' names a specific verb, resource, and institution. The description then distinguishes two concrete access modes (SRU full-text vs OAI-PMH collection browse), and explicitly references the sibling heritage_get_publication for consuming results — clearly differentiating it from siblings like heritage_search_artists and heritage_browse_collection.

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

Usage Guidelines5/5

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

The description gives explicit when-to-use guidance for each mode: 'query ohne set_spec' → SRU full-text search, 'set_spec' → OAI-PMH collection browse, and explains why they are not interchangeable ('SRU kennt die OAI-Sets nicht... OAI-PMH kennt keine Volltextsuche'). It names the alternative heritage_get_publication for fetching results and heritage_list_nb_collections for obtaining set specs. Nothing is left to inference.

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