A research librarian for the rest of us — a local research library with MCP tools for scholarly search, web search, web fetch, and library operations
ResearchZosho defines 7 tools with complete JSON Schema input parameters and descriptions. All tools are READ_ONLY, reducing risk. However, descriptions vary in quality and actionability. Scholar_search, web_search, and web_fetch have strong, context-rich descriptions (150-250 chars) that guide LLM selection. Library tools (library_ask, library_search, library_get, library_read) have longer descriptions (200-400 chars) but are dense and assume domain knowledge. Parameter descriptions are present but terse (10-50 chars). Output schemas are not documented, LLMs cannot predict response structure. Error handling is minimal; no recovery guidance. Tool naming follows verb_noun convention (search, fetch, ask, get, read) and is clear. No security issues detected (all READ_ONLY, no secrets in params). Composition is sound: tools chain logically (search → fetch → library_ask). Missing: output schema documentation, error classification, and per-parameter type constraints (e.g., limit bounds).
Ask The Librarian — the long-term research library. Returns the answer PACKAGE: full relevant entries (findings, shelf articles, captured documents) with states, claim types, sources and disputes, open frontier threads, and holds_nothing=true with NO entries when the library has nothing. Reviewed background: it never overrides direct evidence you gather yourself.
One entry in full by id: body, every source with locator and edition, supersedes / superseded_by, subjects, related entries, and the review record {round, reviewer, decision, stale}. An investigation also carries sections[] {heading, chars}, sources[] as rows {n, locator, title, edition, published, fetched, language, same_as}, claims[] (its findings with bodies) and open_questions[]. A write-up can run past what one call may carry: pass section (a heading; "answer" = the write-up without the harness's sections; "workers", "references", "evidence") to get one section, and offset / max_chars for a window of the body.
The captured raw text behind a source locator — the verbatim path: read the evidence, not only the claim. Returns title, edition, captured_at and the text (truncated at max_chars).
Search The Librarian's catalog (hybrid BM25 + dense, CJK-aware). Returns hits {id, kind, title, snippet, score, state, subjects[]} and next_cursor; use library_get for one entry in full.
Output schemas not documented. LLMs cannot predict response structure (fields, types, pagination). Forces trial-and-error parsing.
Parameter descriptions are terse (10-50 chars). 'How many works (default 8, max 20)' lacks format guidance. 'Optional: specific content to search for' does not explain matching behavior (substring, regex, semantic).
No error handling guidance. Tools return plain text errors ('ERROR: empty query', 'no works found') without recovery hints. LLM cannot determine if error is retryable, user-fixable, or fatal.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 66 | 2026-07-28+ | v2 |
Search the scholarly literature (Crossref and OpenAlex): papers, books and chapters, each with its DOI, venue, year and authors. Use it whenever the question touches a literature: medicine, science, history, law, the humanities: because its hits are primary sources a web engine ranks low. Then web_fetch the DOI or landing page to read.
Fetch a URL and return its readable text content. Use after web_search to actually READ a promising source. Long pages are EXCERPTED, not truncated: pass `find` with the specific thing you are looking for (e.g. 'sculpture 2009 height') and you get the passages that mention it, from anywhere in the page — not just the opening.
Web search via a self-hosted SearXNG meta-search instance (keyless, aggregates many engines — fits CodeZaiku's self-hosted ethos: local model, local embeddings, local search). Returns a compact ranked list of {title, url, snippet} for the research loop to triage before fetching.
Library tools (library_ask, library_search, library_get, library_read) have dense, domain-specific descriptions assuming familiarity with 'The Librarian' system. Descriptions do not explain when to use each tool or how they differ.
Numeric parameter bounds not enforced in schema. 'limit' accepts 1-20 (scholar_search) but schema has no minItems/maxItems. LLM could pass 0 or 100 without validation.