MCP server + CLI to search Open-i (NLM) biomedical/medical/dental images from Claude Code and the terminal.
Two tools with clear, detailed descriptions and well-structured schemas. search_openi_images has excellent parameter documentation with filter codes and usage guidance; openi_reference is simpler but functional. Both tools are read-only with no destructive operations. Naming is clear and verb-driven. Main gaps: no tool annotations (readOnlyHint/destructiveHint), no error recovery guidance in descriptions, and parameter constraints could be more formally specified (enums for filter codes).
Return the Open-i filter code reference (image types, specialties, article types). Handy when you need to look up which filter code corresponds to what, without leaving the conversation.
Search Open-i (NLM) for medical, clinical, graphical and dental images. Open-i (https://openi.nlm.nih.gov) is the U.S. National Library of Medicine's open-access biomedical image search engine. It indexes figures, charts, X-rays, photographs and illustrations from PubMed Central articles and other collections. No API key is required. ┌──────────────────────────────────────────────────────────────────────┐ │ ⚠️ TRANSLATION RULE — READ THIS BEFORE CALLING THE TOOL │ │ │ │ The Open-i index is ENGLISH-ONLY. You (the LLM agent) MUST translate │ │ every Portuguese term the user gives you into English BEFORE putting │ │ it into `query`. Never send Portuguese to the API. │ │ │ │ "incisão oral" -> "oral incision" │ │ "odontolegista" -> "forensic dentistry" │ │ "anatomia dental" -> "dental anatomy" │ │ "radiografia panorâmica"-> "panoramic radiograph" │ │ "cárie" -> "dental caries" │ │ │ │ If the user writes in English already, pass it through unchanged. │ └──────────────────────────────────────────────────────────────────────┘ Args: query: The search terms, IN ENGLISH (translate first — see rule above). m: Start index of the result window (1-based). Default 1. n: End index of the result window. Default 10. Ask for a small window (e.g. m=1, n=10) unless the user wants more. it: Image Type filter. One or more comma-separated codes from [xg, xm, x, u, ph, p, mc, m, g, c]. Most useful: g = graphics / charts / diagrams / illustrations ph = photograph (clinical / gross photo) x = X-ray xm = mammography xg = angiography u = ultrasound c = CT m = MRI mc = microscopy / histology p = PET Leave empty to search all image types. sp: Specialties filter. Comma-separated codes, e.g. "d" for dentistry. Full set: [b, bc, c, ca, cc, d, de, dt, e, en, f, eh, g, ge, gr, gy, h, i, id, im, n, ne, nu, o, or, ot, p, py, pu, r, s, t, u, v, vil]. Leave empty for all specialties. at: Article Type filter. Comma-separated codes from [ab, bk, bf, cr, dp, di, ed, ib, in, lt, mr, ma, ne, ob, pr, or, re, ra, rw, sr, rr, os, hs, ot]. Leave empty for all article types. Returns: A dict with keys: query - the (English) query that was actually sent total - total number of matches Open-i reports returned - how many results are in this response api_url - the exact URL that was requested (for transparency) results - a clean list; each item has: title, image_url, thumbnail_url, summary, article_url, uid To show a result to the user, render the image with Markdown:  and cite the source with [Source](article_url). On failure the dict instead has: error - a human-readable message status - the HTTP status code if the API responded (400/500/…)
Filter code parameters (it, sp, at) lack enum constraints; documented as comma-separated strings with code lists in description text. LLMs cannot parse description text to extract valid values, should use JSON Schema enum arrays.
No tool annotations present. Both tools are read-only and idempotent, but lack readOnlyHint and idempotentHint annotations in schema. Agents cannot infer safety properties without explicit hints.
Error handling in search_openi_images returns dict with 'error' and 'status' keys on failure, but lacks recovery guidance. Description says 'On failure the dict instead has...' but does not tell LLM what to do next (retry? adjust query? check filters?).
openi_reference has empty input schema ({}). While correct for a no-argument tool, the description is brief (18 words) and does not explain when/why to call it relative to search_openi_images.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | 2026-07-28+ | v2 |
search_openi_images description includes a large ASCII warning box about Portuguese-to-English translation. While helpful for context, this is agent-facing guidance that should be in system prompt or tool annotation, not in the tool description itself. Wastes tokens in every invocation.