Model Context Protocol server for VuFind library catalogue integration with support for literature search, article search, availability checking via DAIA, and frontend links
VuFind MCP has significant definition quality gaps. Tool descriptions are generic and lack critical context. Parameter descriptions exist but are minimal. No output schemas are documented. Error handling is absent, tools return plain strings or unstructured lists without guidance on what to do with failures. Tool naming is somewhat reasonable (get_*, search_*, frontend_link) but inconsistent casing in frontend_link__article is awkward. Critical issue: output from search_literature, search_article, and get_availability returns a List[str], completely unstructured, making it impossible for LLMs to parse results or chain calls. The frontend_link tools return bare strings (URLs), which violates the pattern of returning structured objects with typed fields. No composition support, tools operate in isolation with no IDs returned to enable chaining.
returns a catalogue link for a given ppn.
returns a catalogue link for a given article ppn.
Get local availability for a document by PPN using the DAIA endpoint.
Search the VuFind catalogue for articles.
Search the VuFind catalogue.
Output schemas completely undocumented. search_literature, search_article, and get_availability return List[str], plain strings without structure. LLMs cannot parse results or extract IDs for downstream calls. Violates pattern:response-shaper.
No error recovery guidance. HTTPClient.get_lines() returns error strings like 'Error {status_code}' or 'Request failed: {exc}', no actionable advice for LLM. Should tell agent what to retry, which parameters to check, or when to ask user. Violates pattern:recovery-guide.
Tool descriptions lack context on when/why to use. E.g. 'Search the VuFind catalogue' doesn't explain: What fields are searched? Can I search by title, author, ISBN? What format are results? Does this also search articles or only books? Violates pattern:tool-description.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 48 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 28 | - | v1 |
No pagination documentation. get_availability, search_literature, search_article accept offset/limit but return unstructured lists. No total count or next_cursor. Large result sets will blow context window. Violates pattern:paginated-result.
frontend_link and frontend_link__article return bare URL strings. Violates pattern:response-shaper (should return structured objects). Also, inconsistent naming: frontend_link__article uses double underscore (awkward); should be frontend_link_article or get_article_url.
No tool chaining support. Search results do not return PPN (ppn field), so agent cannot immediately pass result to get_availability or frontend_link. Violates mxe:include-chaining-ids and pattern:tool-chain.
Parameter descriptions are minimal. 'search query string' for lookfor doesn't explain: full-text or field-specific? Boolean operators supported? Phrase search with quotes? Violates pattern:tool-description.
Defaults like lookfor='*' and ppn='*' are vague. '*' is regex/wildcard syntax but not explained. Does '*' mean all records? Search entire catalogue? Could be interpreted as the literal string '*'. Violates review:default-values.
Limit parameter default of 100 may be too high. Search results return List[str] (lines of text); 100 lines could easily exceed reasonable context budget. No documentation on typical result size or recommendation. Violates mxe:enforce-result-limits.