A public-facing MCP server that lets an MCP-compatible agent search UB Library OneSearch for books, articles, journals, and other resources. Scope: public, unauthenticated search only.
Two read-only search/retrieval tools with well-structured schemas and descriptions. Both tools have action-verb names, documented input parameters with type constraints (enums, defaults, limits), and clear non-destructive semantics. Description lengths are adequate (150-180 chars). Input schemas are comprehensive with constraints like min_length, minimum, maximum, enum values. Output types are documented in code (SearchLibraryOutput, NormalizedRecord). However, output schema details are not fully visible in the provided excerpt, limiting certainty on field documentation. No tool annotations (readOnlyHint/idempotentHint) present in code. Error handling via ToolError union type suggests some error structure, but recovery guidance is not explicit in descriptions. Overall solid for a read-only service but lacks refinements expected of A-grade tools.
Retrieve a single library record by its record id (e.g. an Alma record id such as 'alma990000685930204803'), using a recent search_library cache when possible, otherwise running a targeted public lookup.
Search UB Library OneSearch for books, articles, journals, and other public resources. Returns normalized metadata and, when available, public physical availability/location info. Does not require or use any login/account credentials.
Output schemas not explicitly documented in source code. SearchLibraryOutput and NormalizedRecord types are referenced but their field structure and descriptions are not shown in the excerpt. LLMs cannot plan downstream calls without knowing what fields to expect.
No tool annotations (readOnlyHint, idempotentHint) present. Both tools are read-only and idempotent, but the code does not declare these hints. Modern MCP tools should include readOnlyHint=true for search/retrieval operations to signal safety to agents.
Error recovery guidance not present in tool descriptions. The ToolError union type suggests error responses exist, but descriptions do not tell LLMs what to do if a search fails, a record is not found, or the API is unreachable. E.g., 'If record not found, try search_library() first' or 'If search returns no results, try with fewer filters.'
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | B | 72 | 2026-07-28+ | v2 |
Parameter 'field' in search_library has enum constraint but the description does not explicitly state that 'any' is the default fallback. LLMs may not understand that omitting 'field' is equivalent to 'any'.
Resource type filter examples ('books', 'articles') are mentioned in parameter description as if they are the only valid values, but the schema shows resourceType is an open array of strings with no enum constraint. This invites LLMs to pass invalid resource types. Either document the closed set of valid types or remove the examples.