trials_search
Search active clinical trials by condition, ICD-10 code, or intervention. Get detailed results including NCT ID, phase, enrollment, and eligibility.
Instructions
Search active clinical trials by condition, ICD-10 code, or intervention. Returns trial details including NCT ID, phase, enrollment, and eligibility. Source: ClinicalTrials.gov (public domain).
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| condition | No | Medical condition to search for | |
| code | No | ICD-10 code (auto-mapped to condition) | |
| intervention | No | Drug or intervention name | |
| status | No | Trial status filter (default: RECRUITING) | |
| limit | No | Max results (default 10, max 50) |
Implementation Reference
- src/tools.js:146-159 (schema)Tool definition and input schema for 'trials_search'. Defines name, description, price ($0.03), endpoint (/agent/v1/trials/search), and Zod schema with optional parameters: condition, code, intervention, status (enum), and limit.
// --- Clinical Trials (ClinicalTrials.gov — free, no license) --- { name: 'trials_search', description: 'Search active clinical trials by condition, ICD-10 code, or intervention. Returns trial details including NCT ID, phase, enrollment, and eligibility. Source: ClinicalTrials.gov (public domain).', price: '$0.03', endpoint: '/agent/v1/trials/search', schema: { condition: z.string().optional().describe('Medical condition to search for'), code: z.string().optional().describe('ICD-10 code (auto-mapped to condition)'), intervention: z.string().optional().describe('Drug or intervention name'), status: z.enum(['RECRUITING', 'ACTIVE_NOT_RECRUITING', 'COMPLETED', 'NOT_YET_RECRUITING']).optional().describe('Trial status filter (default: RECRUITING)'), limit: z.number().optional().describe('Max results (default 10, max 50)'), }, }, - src/index.js:19-61 (registration)Registration of all MCP tools (including 'trials_search') via s.tool(). The generic handler makes an HTTP POST to the tool's endpoint with params and returns the JSON response. No separate handler exists; the logic is a generic fetch-based proxy.
for (const tool of MCP_TOOLS) { s.tool(tool.name, tool.description, tool.schema, async (params) => { const toolDef = getToolByName(tool.name); if (!toolDef) { return { content: [{ type: 'text', text: `Unknown tool: ${tool.name}` }], isError: true }; } try { const response = await fetch(`${API_BASE_URL}${toolDef.endpoint}`, { method: 'POST', headers: { 'Content-Type': 'application/json', ...(API_KEY && { 'X-API-Key': API_KEY }), 'X-Agent-ID': 'mcp-client', 'User-Agent': '@mymedi-ai/mcp-server/1.2.1', }, body: JSON.stringify(params), }); if (response.status === 402) { const paymentInfo = await response.json(); return { content: [{ type: 'text', text: JSON.stringify({ error: 'payment_required', message: `This tool costs ${toolDef.price} per call. Register at ${API_BASE_URL}/bot-marketplace/register for an API key with 10 free starter credits, or pay per call with on-chain USDC (no signup) via the x402 protocol.`, price: toolDef.price, register: `${API_BASE_URL}/bot-marketplace/register`, ...paymentInfo, }, null, 2) }], isError: true, }; } if (!response.ok) { const error = await response.json().catch(() => ({ message: response.statusText })); return { content: [{ type: 'text', text: JSON.stringify({ error: true, status: response.status, ...error }, null, 2) }], isError: true }; } const data = await response.json(); const creditsSpent = response.headers.get('X-Credits-Spent'); const creditsRemaining = response.headers.get('X-Credits-Remaining'); if (creditsSpent) { data._billing = { creditsSpent: parseInt(creditsSpent, 10), creditsRemaining: creditsRemaining ? parseInt(creditsRemaining, 10) : undefined, priceUSD: toolDef.price }; } return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] }; } catch (err) { return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: err.message, hint: 'Ensure MCP_API_BASE_URL and MCP_API_KEY environment variables are set.' }, null, 2) }], isError: true }; } }); } - src/index.js:66-73 (registration)Sandbox server registration for 'trials_search'. Returns 'sandbox' text instead of calling the real API.
export function createSandboxServer() { const sandboxServer = new McpServer({ name: 'mymedi-ai', version: '1.2.1' }); for (const tool of MCP_TOOLS) { sandboxServer.tool(tool.name, tool.description, tool.schema, async () => ({ content: [{ type: 'text', text: 'sandbox' }] })); } return sandboxServer; }