Skip to main content
Glama
PancrePal-xiaoyibao

Clinical Trials MCP Server

search_by_location

Find nearby clinical trials by geographic coordinates to identify recruiting studies within a specified radius, with optional filters for conditions and keywords.

Instructions

根据地理坐标搜索附近的临床试验。默认查询招募中且3个月内更新的30个最相关结果。

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
latitudeYes纬度
longitudeYes经度
radiusNo搜索半径(英里),默认50英里
conditionNo疾病或状况(可选)
keywordsNo关键词(可选)
statusNo招募状态,默认RECRUITINGRECRUITING
monthsNo时间范围(月),默认3个月
pageSizeNo每页返回的结果数量,默认30

Implementation Reference

  • MCP tool handler for 'search_by_location': extracts latitude, longitude, radius and other params, validates required fields, calls ClinicalTrialsClient.searchByLocation, and returns JSON stringified results.
    case 'search_by_location': {
      const { latitude, longitude, radius = 50, ...otherParams } = args;
      
      if (latitude === undefined || longitude === undefined) {
        throw new Error('经纬度是必需的');
      }
      
      const results = await clinicalTrialsClient.searchByLocation(
        latitude,
        longitude,
        radius,
        otherParams
      );
      
      return {
        content: [
          {
            type: 'text',
            text: JSON.stringify(results, null, 2),
          },
        ],
      };
    }
  • Input schema for the 'search_by_location' tool defining parameters like latitude, longitude (required), radius, condition, keywords, status, months, pageSize with descriptions and defaults.
    inputSchema: {
      type: 'object',
      properties: {
        latitude: {
          type: 'number',
          description: '纬度',
        },
        longitude: {
          type: 'number',
          description: '经度',
        },
        radius: {
          type: 'number',
          description: '搜索半径(英里),默认50英里',
          default: 50,
        },
        condition: {
          type: 'string',
          description: '疾病或状况(可选)',
        },
        keywords: {
          type: 'string',
          description: '关键词(可选)',
        },
        status: {
          type: 'string',
          description: '招募状态,默认RECRUITING',
          default: 'RECRUITING',
        },
        months: {
          type: 'number',
          description: '时间范围(月),默认3个月',
          default: 3,
        },
        pageSize: {
          type: 'number',
          description: '每页返回的结果数量,默认30',
          default: 30,
        },
      },
      required: ['latitude', 'longitude'],
    },
  • src/index.js:96-141 (registration)
    Registration of the 'search_by_location' tool in the ListTools response, including name, description, and full input schema.
    {
      name: 'search_by_location',
      description: '根据地理坐标搜索附近的临床试验。默认查询招募中且3个月内更新的30个最相关结果。',
      inputSchema: {
        type: 'object',
        properties: {
          latitude: {
            type: 'number',
            description: '纬度',
          },
          longitude: {
            type: 'number',
            description: '经度',
          },
          radius: {
            type: 'number',
            description: '搜索半径(英里),默认50英里',
            default: 50,
          },
          condition: {
            type: 'string',
            description: '疾病或状况(可选)',
          },
          keywords: {
            type: 'string',
            description: '关键词(可选)',
          },
          status: {
            type: 'string',
            description: '招募状态,默认RECRUITING',
            default: 'RECRUITING',
          },
          months: {
            type: 'number',
            description: '时间范围(月),默认3个月',
            default: 3,
          },
          pageSize: {
            type: 'number',
            description: '每页返回的结果数量,默认30',
            default: 30,
          },
        },
        required: ['latitude', 'longitude'],
      },
    },
  • Core helper function implementing the search logic: constructs advanced filter query using geolocation DISTANCE operator, adds condition/keywords/status/date filters, fetches from ClinicalTrials.gov API v2 /studies endpoint, formats results.
    async searchByLocation(latitude, longitude, radius, otherParams = {}) {
      const queryParams = new URLSearchParams();
    
      // 使用 AREA 和 DISTANCE 操作符进行地理位置查询
      const geoQuery = `AREA[LocationGeoPoint]DISTANCE[${latitude},${longitude},${radius}mi]`;
      queryParams.append('filter.advanced', geoQuery);
    
      // 疾病/状况
      if (otherParams.condition) {
        queryParams.append('query.cond', otherParams.condition);
      }
    
      // 关键词
      if (otherParams.keywords) {
        queryParams.append('query.term', otherParams.keywords);
      }
    
      // 默认只查招募中的
      const status = otherParams.status || 'RECRUITING';
      queryParams.append('filter.overallStatus', status);
    
      // 时间过滤:默认3个月内
      const months = otherParams.months || 3;
      const endDate = new Date();
      const startDate = new Date();
      startDate.setMonth(startDate.getMonth() - months);
      
      const startDateStr = this.formatDate(startDate);
      const endDateStr = this.formatDate(endDate);
      
      const dateQuery = `AREA[LastUpdatePostDate]RANGE[${startDateStr},${endDateStr}]`;
      const existing = queryParams.get('filter.advanced');
      queryParams.set('filter.advanced', `${existing} AND ${dateQuery}`);
    
      // 分页:默认30个结果
      const pageSize = otherParams.pageSize || 30;
      queryParams.append('pageSize', pageSize.toString());
    
      if (otherParams.pageToken) {
        queryParams.append('pageToken', otherParams.pageToken);
      }
    
      // 指定返回字段
      queryParams.append('fields', [
        'NCTId',
        'BriefTitle',
        'OfficialTitle',
        'OverallStatus',
        'Condition',
        'InterventionName',
        'Phase',
        'StudyType',
        'LocationFacility',
        'LocationCity',
        'LocationState',
        'LocationCountry',
        'LocationStatus',
        'LocationGeoPoint',
        'ContactName',
        'ContactPhone',
        'ContactEmail',
        'BriefSummary',
      ].join(','));
    
      // 排序
      queryParams.append('sort', 'LastUpdatePostDate:desc');
      queryParams.append('countTotal', 'true');
    
      try {
        const response = await this.axios.get('/studies', {
          params: queryParams,
        });
    
        return this.formatSearchResults(response.data);
      } catch (error) {
        throw this.handleError(error);
      }
    }

Tool Definition Quality

Score is being calculated. Check back soon.

Install Server

Other Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/PancrePal-xiaoyibao/xiaoyibao-clinical-trials-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server