Open-source MCP server that helps patients find clinical trials on ClinicalTrials.gov.
Strong tool definitions with clear naming, comprehensive descriptions, and well-structured schemas. All 5 tools follow verb_noun convention (list_, search_, get_, compare_, parse_). Descriptions are detailed (200-400 chars) and include disclaimers. Input schemas use Zod with proper types and enums. However, output schemas are not documented in the code, responses are JSON-stringified without explicit type definitions. Error handling is basic (isKnownError wrapper). Missing tool annotations (readOnlyHint, idempotentHint) despite all tools being read-only. Pagination support in search_trials is well-designed with nextPageToken guidance.
Fetch 2-5 trials in one call for side-by-side comparison. Use this when the user has a shortlist and wants to compare them — don't call get_trial_details separately. Returns a map keyed by NCT ID plus a failed[] list for any IDs that weren't found. Present the comparison as a table to the user, highlighting key differences: phase, status, locations count, sponsor, enrollment count, key eligibility differences. Quote eligibility criteria verbatim when they differ between trials. ALWAYS surface the lastUpdated field; data can lag reality by weeks. This server provides information from ClinicalTrials.gov to help patients and caregivers discover clinical trials. It is NOT medical advice. Data may lag reality by weeks — always confirm current enrollment by calling the trial site and discuss any trial with the patient's treating physician before acting.
Fetch the full details for one trial by its NCT ID (e.g. "NCT01234567"). Returns identification, summary, status, eligibility criteria, per-site locations and contacts (phone/email where available), interventions, and references. When presenting eligibility to the user, QUOTE the criteria verbatim rather than summarizing — only a trial coordinator can confirm whether someone qualifies. Always mention the lastUpdated field and recommend calling the trial site to confirm current enrollment. Include the officialUrl so the user can view the source. This server provides information from ClinicalTrials.gov to help patients and caregivers discover clinical trials. It is NOT medical advice. Data may lag reality by weeks — always confirm current enrollment by calling the trial site and discuss any trial with the patient's treating physician before acting.
Look up candidate condition names on ClinicalTrials.gov for a patient's vague term (e.g. "breast cancer" -> "Triple Negative Breast Cancer", "HER2-positive Breast Cancer"). Use this FIRST when the user's condition could map to multiple subtypes. Show the returned conditions to the user and ask them which one to search. This server provides information from ClinicalTrials.gov to help patients and caregivers discover clinical trials. It is NOT medical advice. Data may lag reality by weeks — always confirm current enrollment by calling the trial site and discuss any trial with the patient's treating physician before acting.
Output schemas not documented. Tool responses are JSON-stringified without explicit return type definitions. LLMs cannot plan downstream operations or extract fields reliably.
Tool annotations missing. All tools are read-only and idempotent, but readOnlyHint and idempotentHint are not declared in tool registration. Agents cannot infer safety properties.
Error handling is minimal. errorResponse() returns only a message string. No error classification (retryable vs user-fixable vs fatal), no recovery guidance, no invalid value echoing.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | A | 82 | 2026-07-28+ | v2 |
Turn a trial's free-text eligibility criteria into structured inclusion/exclusion lists, age limits, and sex requirements. Call this with EITHER an nctId (we'll fetch the trial) OR raw criteriaText (for trials you've already fetched). Use the structured output to present the criteria to the user as two clear lists (inclusion / exclusion), then ask them targeted questions about each point so they can assess fit. Quote the criteria verbatim to the user — do NOT paraphrase. PRIVACY — IMPORTANT FOR HOW YOU USE THIS TOOL: never send the user's own health information BACK to this tool. This tool does not accept patient profiles, and this server does not store anything. The matching of user → criteria happens in YOUR conversation, not here. This server provides information from ClinicalTrials.gov to help patients and caregivers discover clinical trials. It is NOT medical advice. Data may lag reality by weeks — always confirm current enrollment by calling the trial site and discuss any trial with the patient's treating physician before acting.
Search ClinicalTrials.gov for trials matching a condition. Defaults to currently recruiting trials only. Accepts an optional free-form location string (e.g. "Denver, CO", "Texas", "80202"), optional radiusMiles for U.S. ZIP-code radius searches (e.g. location "80202" with radiusMiles 50), optional latitude/longitude with radiusMiles when exact coordinates are already known, and an optional phase ("1"-"4" or "any"). Returns up to pageSize trials (max 25). Radius searches include nearestSiteMiles on each trial when site coordinates are available. PAGINATION: The response includes a nextPageToken. If the user wants more results, call search_trials again with the SAME condition/location/radiusMiles/latitude/longitude/status/phase plus pageToken=<that nextPageToken>. A null nextPageToken means there are no more pages. ALWAYS surface the lastUpdated field when presenting a trial — data can lag reality by weeks. Include the officialUrl in your response so the user can verify on ClinicalTrials.gov. This server provides information from ClinicalTrials.gov to help patients and caregivers discover clinical trials. It is NOT medical advice. Data may lag reality by weeks — always confirm current enrollment by calling the trial site and discuss any trial with the patient's treating physician before acting.
Parameter descriptions lack format/constraint details. E.g., radiusMiles accepts 1-500 but description does not state min/max. nctId format is mentioned but not enforced with regex pattern in schema.
Response field naming inconsistency risk. search_trials returns nextPageToken; compare_trials returns a map keyed by NCT ID plus failed[]. No documented structure for list_conditions, get_trial_details, or parse_eligibility_criteria outputs.