This is a well-structured, domain-specific MCP server exposing read-only CDISC Library metadata. All 11 tools are explicitly registered in server.py with consistent naming patterns (verb_noun: get_*, list_), non-empty descriptions, and proper JSON Schema input definitions. Tool annotations are applied uniformly (readOnlyHint=true, idempotentHint=true). However, several quality gaps prevent a higher score: (1) descriptions lack contextual depth and dependency hints, they state WHAT but not WHEN or WHY to call each tool; (2) no documented output schemas are visible in the source, the code returns dict[str, Any] with no field documentation; (3) parameter descriptions are minimal and lack examples of valid input formats; (4) no error handling guidance or recovery hints are visible; (5) no pagination strategy documented despite tools like get_codelist_terms claiming 'max 100 shown, check has_more' without explaining the pagination interface.
List all ADaM data structures for a given version. Args: version: ADaM version, e.g. "1.3" or "1-3", "2.1" or "2-1"
Get the definition of a specific ADaM variable. Args: version: ADaM version, e.g. "1.3" or "1-3" data_structure: Data structure name, e.g. "ADSL", "ADAE" variable: Variable name, e.g. "USUBJID", "AVAL"
Get all data collection fields for a CDASH domain. Args: version: CDASH version, e.g. "2.0" or "2-0" domain: Domain code, e.g. "DM", "AE", "VS"
List all CDASH domains for a given version. Args: version: CDASH version, e.g. "2.0" or "2-0", "1.1" or "1-1"
Get a specific Controlled Terminology codelist definition. Args: package_id: CT package identifier, e.g. "sdtmct-2024-03-29" codelist_id: Codelist concept ID or submission value, e.g. "C66781", "AGEU"
Output schemas not documented. All tools return dict[str, Any] with no field descriptions. LLMs cannot plan downstream tool calls or extract specific fields without knowing response structure.
Tool descriptions lack discovery guidance. No explicit instruction when to call list_products() first, when to chain tools, or how results feed into subsequent calls. E.g., get_sdtm_domains docs don't explain that you must first call list_products to discover valid versions.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | B | 70 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 48 | - | v1 |
List all valid terms in a CT codelist (max 100 shown, check has_more). Args: package_id: CT package identifier codelist_id: Codelist concept ID or submission value
Get all variables defined in an SDTM domain. Args: version: SDTM-IG version, e.g. "3.4" or "3-4" domain: Two-letter domain code, e.g. "DM", "AE", "LB"
List all SDTM domains for a given version. Args: version: SDTM-IG version, e.g. "3.4" or "3-4". Use list_products() first.
Get the full definition of a specific SDTM variable. Args: version: SDTM-IG version, e.g. "3.4" or "3-4" domain: Domain code, e.g. "AE" variable: Variable name, e.g. "AETERM", "AEDECOD"
List all available CDISC Controlled Terminology packages with release dates.
List all available CDISC standards and their published versions. Use this first to discover available versions before querying specific content.
Parameter descriptions are minimal. Descriptions like 'SDTM-IG version, e.g. "3.4" or "3-4"' use example values instead of formal constraints.
Pagination not clearly specified. get_codelist_terms claims 'max 100 shown, check has_more' but no offset/page/cursor parameters visible in schema. Pagination interface must be documented in tool description and schema.
No error handling guidance visible in tool definitions. Tools return dict[str, Any] with no documented error classification (retryable, user-fixable, fatal) or recovery hints.