MCP server for clinical trials from ClinicalTrials.gov API v2. Supports searching by keywords, disease, location with intelligent defaults (recruiting trials from past 3 months).
The server defines 3 tools with explicit schemas and descriptions, all READ_ONLY operations against ClinicalTrials.gov API. Schemas are present and properly typed (object properties with type declarations). Descriptions are substantive (100-200 chars), though generic in places. Key issues: (1) Parameter descriptions lack actionable constraints (e.g., 'months' has no min/max range; 'pageSize' says 'max 100' in description but no JSON Schema constraint); (2) No enum constraints for 'status' field despite listing valid options; (3) Output schema undocumented, LLMs don't know what fields to expect in responses; (4) Error handling present but minimal, no recovery guidance or classification; (5) STDIO transport caps protocol readiness at 50, further limiting overall score. Naming is solid (verb-first: search_, get_), and no destructive operations reduce some risk. Tool composition is adequate but not optimal, no batching support, no obvious chaining IDs in responses.
获取指定临床试验的详细信息,包括:PI研究者信息、各地医院地点、联系方式(电话/邮箱)、详细研究介绍、入选/排除标准、结果指标等全面信息
根据地理坐标搜索附近的临床试验。默认查询招募中且3个月内更新的30个最相关结果。
搜索临床试验。默认查询招募中且过去3个月内更新的试验,按更新时间降序返回30个最相关结果。支持根据关键词(如KRAS-12D)、疾病类型(如胰腺癌)、地理位置(国家/城市)等条件查询。
Output schemas are completely undocumented. Tools return JSON.stringify(results) but LLMs have no visibility into response structure, field names, types, nesting, pagination tokens. This forces LLMs to guess at downstream tool calls and wastes tokens parsing raw API responses.
Numeric parameters lack JSON Schema constraints (minimum, maximum). 'months' defaults to 3 with no declared range; 'pageSize' defaults to 30 with description saying 'max 100' but no maxItems constraint; 'radius' has no min/max. LLMs may pass invalid values (negative months, pageSize > 100) causing API failures.
'status' parameter accepts a free-form string with comma-separated options (RECRUITING, COMPLETED, NOT_YET_RECRUITING) but is not declared as an enum. LLMs may hallucinate invalid status values. Should be enum: ['RECRUITING', 'COMPLETED', 'NOT_YET_RECRUITING'] with oneOf or using JSON Schema enum.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 58 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 45 | - | v1 |
Error handling is minimal. CallToolRequest handler catches errors and returns isError: true with error.message, but provides no recovery guidance. E.g., if NCT ID is invalid, error is 'API call failed' with no suggestion to validate format or use search_clinical_trials first. No error classification (retryable vs user-fixable vs fatal).
Parameter descriptions include examples ('KRAS-12D', '胰腺癌', 'Beijing') which LLMs tend to reuse literally. Should use constraints and remove examples from descriptions per pattern:constrained-input guidance.
No response pagination metadata documented. search_clinical_trials and search_by_location accept pageToken for pagination, but response structure is unknown, LLMs don't know whether to expect 'nextPageToken', 'page_token', 'cursor', or something else. Forces agents to guess or fail silently.