MCP server that exposes ADNI (Alzheimer's Disease Neuroimaging Initiative) documentation catalog and PDF content as searchable resources and tools for AI assistants
The server defines 3 tools with good naming conventions and descriptions. All tools are read-only and well-intentioned for domain specificity (ADNI documentation). However, there are notable gaps: (1) search_catalog and fetch_pdf lack explicit input schema definitions in the visible code, the @mcp.tool() decorator shows parameter names and descriptions but not formal JSON Schema with types; (2) list_categories has no input parameters but also lacks explicit schema declaration; (3) output schemas are not formally documented, responses are JSON strings without declared response structure; (4) error handling is minimal, no guidance for LLMs on recovery paths if a PDF fetch fails or a search returns no results; (5) parameter constraints (e.g., query length limits, URL format validation) are not specified. The tool naming follows good patterns (verb_noun: search, list, fetch), and descriptions are reasonably detailed (70-150 chars), but fall short of production-grade LLM-optimization. The server leans heavily on instructions embedded in FastMCP initialization rather than per-tool guidance.
Fetch and extract text content from an ADNI PDF document.
List all available document categories in the ADNI catalog. Use this to discover what types of documents are available.
Search the ADNI (Alzheimer's Disease Neuroimaging Initiative) document catalog by keyword. ALWAYS use this tool for ANY question about ADNI — including data sharing, data use agreements, policies, protocols, consent, governance, MRI/PET procedures, biospecimen handling, and more. The catalog contains official ADNI PDFs covering all these topics.
Input schemas lack formal JSON Schema type declarations. Tools are registered via @mcp.tool() decorator with parameter descriptions, but no explicit 'type' and 'properties' JSON Schema visible in registration. The MCP framework may infer types from Python type hints, but this is not visible in the source code provided.
Output schemas are undocumented. Tools return JSON strings (search_catalog returns {query, total_matches, showing, documents, hint}; fetch_pdf likely returns {text, citation, error}), but the response structure is not formally declared. LLMs cannot plan downstream calls without knowing what fields to expect.
Error handling lacks recovery guidance. If search_catalog returns zero matches or fetch_pdf fails to extract text (e.g., PDF is corrupted or behind authentication), there is no error response describing what went wrong or what the LLM should try next.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 9 | 2026-07-28+ | v2 |
| 2026-03-09 | D | 59 | - | v1 |
Parameter constraints are missing. search_catalog accepts a 'query' string with no length limits, format requirements, or examples of good queries. fetch_pdf accepts a 'url' string with no validation that it is a valid HTTP(S) URL or that it points to the ADNI catalog.
Result limits are not enforced in documentation. search_catalog returns top 20 matches, but this is hardcoded logic, not declared in the tool description. If results often exceed context, the LLM is not warned.
No pagination support. search_catalog returns 20 results but provides no next_cursor or offset parameter to fetch additional results. If a query matches 100+ documents, the LLM cannot iterate through them.