clinicaltrialsgov-mcp-server
Version:
ClinicalTrials.gov Model Context Protocol (MCP) Server that provides a suite of tools for interacting with the official ClinicalTrials.gov v2 API. Enables AI agents and LLMs to programmatically search, retrieve, and analyze clinical trial data.
78 lines (77 loc) • 3.48 kB
JavaScript
import { ErrorHandler, logger, requestContextService, } from "../../../utils/index.js";
import { SearchStudiesInputSchema, searchStudiesLogic, SearchStudiesOutputSchema, } from "./logic.js";
/**
* Registers the 'clinicaltrials_search_studies' tool with the MCP server.
* @param server - The MCP server instance.
*/
export const registerSearchStudiesTool = async (server) => {
const toolName = "clinicaltrials_search_studies";
const toolDescription = "Searches for clinical studies using a combination of query terms and filters. Supports pagination, sorting, and geographic filtering.";
server.registerTool(toolName, {
title: "Search Clinical Studies",
description: toolDescription,
inputSchema: SearchStudiesInputSchema.shape,
outputSchema: SearchStudiesOutputSchema.shape,
annotations: { readOnlyHint: true },
}, async (params, callContext) => {
const handlerContext = requestContextService.createRequestContext({
toolName,
parentContext: callContext,
});
try {
const result = await searchStudiesLogic(params, handlerContext);
const studies = result.studies;
const studySummaries = studies?.map((study) => {
const idModule = study.protocolSection?.identificationModule;
const statusModule = study.protocolSection?.statusModule;
const descriptionModule = study.protocolSection?.descriptionModule;
const interventionsModule = study.protocolSection?.armsInterventionsModule;
const sponsorModule = study.protocolSection?.sponsorCollaboratorsModule;
const interventions = interventionsModule?.interventions
?.map((i) => i.name)
.join(", ") ?? "N/A";
return `
- **NCT ID:** ${idModule?.nctId ?? "N/A"}
- **Title:** ${idModule?.briefTitle ?? "N/A"}
- **Status:** ${statusModule?.overallStatus ?? "N/A"}
- **Summary:** ${descriptionModule?.briefSummary ?? "N/A"}
- **Interventions:** ${interventions}
- **Sponsor:** ${sponsorModule?.leadSponsor?.name ?? "N/A"}
`;
}) ?? [];
let summaryText = `Successfully retrieved ${studies?.length ?? 0} studies.\n` +
studySummaries.join("\n---\n");
if (result.nextPageToken) {
summaryText += `\nNext Page Token: ${result.nextPageToken}`;
}
if (result.totalCount) {
summaryText += `\nTotal Count: ${result.totalCount}`;
}
return {
structuredContent: result,
content: [{ type: "text", text: summaryText }],
};
}
catch (error) {
logger.error(`Error in ${toolName} handler`, {
error,
...handlerContext,
});
const mcpError = ErrorHandler.handleError(error, {
operation: toolName,
context: handlerContext,
input: params,
});
return {
isError: true,
content: [{ type: "text", text: mcpError.message }],
structuredContent: {
code: mcpError.code,
message: mcpError.message,
details: mcpError.details,
},
};
}
});
logger.info(`Tool '${toolName}' registered successfully.`);
};