clinicaltrials-database by davila7/claude-code-templates
npx skills add https://github.com/davila7/claude-code-templates --skill clinicaltrials-databaseClinicalTrials.gov 是一个由美国国家医学图书馆维护的全球临床试验综合注册库。通过其 API v2 可以搜索试验、检索详细研究信息、按各种标准筛选以及导出数据进行分析。该 API 是公开的(无需身份验证),速率限制约为每分钟 50 个请求,支持 JSON 和 CSV 格式。
在涉及临床试验数据的场景中应使用此技能,例如:
使用辅助脚本搜索临床试验:
cd scientific-databases/clinicaltrials-database/scripts
python3 query_clinicaltrials.py
或者直接使用 Python 的 requests 库:
import requests
url = "https://clinicaltrials.gov/api/v2/studies"
params = {
"query.cond": "breast cancer",
"filter.overallStatus": "RECRUITING",
"pageSize": 10
}
response = requests.get(url, params=params)
data = response.json()
print(f"Found {data['totalCount']} trials")
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
使用 NCT ID 获取试验的详细信息:
import requests
nct_id = "NCT04852770"
url = f"https://clinicaltrials.gov/api/v2/studies/{nct_id}"
response = requests.get(url)
study = response.json()
# 访问特定模块
title = study['protocolSection']['identificationModule']['briefTitle']
status = study['protocolSection']['statusModule']['overallStatus']
使用 query.cond 参数查找研究特定医疗状况或疾病的试验。
示例:查找正在招募的糖尿病试验
from scripts.query_clinicaltrials import search_studies
results = search_studies(
condition="type 2 diabetes",
status="RECRUITING",
page_size=20,
sort="LastUpdatePostDate:desc"
)
print(f"Found {results['totalCount']} recruiting diabetes trials")
for study in results['studies']:
protocol = study['protocolSection']
nct_id = protocol['identificationModule']['nctId']
title = protocol['identificationModule']['briefTitle']
print(f"{nct_id}: {title}")
常见用例:
使用 query.intr 参数搜索测试特定干预措施、药物、设备或程序的试验。
示例:查找测试 Pembrolizumab 的 3 期试验
from scripts.query_clinicaltrials import search_studies
results = search_studies(
intervention="Pembrolizumab",
status=["RECRUITING", "ACTIVE_NOT_RECRUITING"],
page_size=50
)
# 在结果中按阶段筛选
phase3_trials = [
study for study in results['studies']
if 'PHASE3' in study['protocolSection'].get('designModule', {}).get('phases', [])
]
常见用例:
使用 query.locn 参数查找特定地点的试验。
示例:查找纽约的癌症试验
from scripts.query_clinicaltrials import search_studies
results = search_studies(
condition="cancer",
location="New York",
status="RECRUITING",
page_size=100
)
# 提取地点详情
for study in results['studies']:
locations_module = study['protocolSection'].get('contactsLocationsModule', {})
locations = locations_module.get('locations', [])
for loc in locations:
if 'New York' in loc.get('city', ''):
print(f"{loc['facility']}: {loc['city']}, {loc.get('state', '')}")
常见用例:
使用 query.spons 参数查找由特定组织进行的试验。
示例:查找由 NCI 申办的试验
from scripts.query_clinicaltrials import search_studies
results = search_studies(
sponsor="National Cancer Institute",
page_size=100
)
# 提取申办方信息
for study in results['studies']:
sponsor_module = study['protocolSection']['sponsorCollaboratorsModule']
lead_sponsor = sponsor_module['leadSponsor']['name']
collaborators = sponsor_module.get('collaborators', [])
print(f"Lead: {lead_sponsor}")
if collaborators:
print(f" Collaborators: {', '.join([c['name'] for c in collaborators])}")
常见用例:
使用 filter.overallStatus 参数按招募或完成状态筛选试验。
有效状态值:
RECRUITING - 当前正在招募参与者NOT_YET_RECRUITING - 尚未开放招募ENROLLING_BY_INVITATION - 仅通过邀请入组ACTIVE_NOT_RECRUITING - 活跃但不再招募SUSPENDED - 暂时停止TERMINATED - 提前终止COMPLETED - 研究已结束WITHDRAWN - 在入组前撤回示例:查找最近完成并带有结果的试验
from scripts.query_clinicaltrials import search_studies
results = search_studies(
condition="alzheimer disease",
status="COMPLETED",
sort="LastUpdatePostDate:desc",
page_size=50
)
# 筛选有结果的试验
trials_with_results = [
study for study in results['studies']
if study.get('hasResults', False)
]
print(f"Found {len(trials_with_results)} completed trials with results")
获取特定试验的全面信息,包括资格标准、结果、联系人和地点。
示例:提取资格标准
from scripts.query_clinicaltrials import get_study_details
study = get_study_details("NCT04852770")
eligibility = study['protocolSection']['eligibilityModule']
print(f"Eligible Ages: {eligibility.get('minimumAge')} - {eligibility.get('maximumAge')}")
print(f"Eligible Sex: {eligibility.get('sex')}")
print(f"\nInclusion Criteria:")
print(eligibility.get('eligibilityCriteria'))
示例:提取联系信息
from scripts.query_clinicaltrials import get_study_details
study = get_study_details("NCT04852770")
contacts_module = study['protocolSection']['contactsLocationsModule']
# 总体联系人
if 'centralContacts' in contacts_module:
for contact in contacts_module['centralContacts']:
print(f"Contact: {contact.get('name')}")
print(f"Phone: {contact.get('phone')}")
print(f"Email: {contact.get('email')}")
# 研究地点
if 'locations' in contacts_module:
for location in contacts_module['locations']:
print(f"\nFacility: {location.get('facility')}")
print(f"City: {location.get('city')}, {location.get('state')}")
if location.get('status'):
print(f"Status: {location['status']}")
使用分页高效处理大型结果集。
示例:检索所有匹配的试验
from scripts.query_clinicaltrials import search_with_all_results
# 获取所有试验(自动处理分页)
all_trials = search_with_all_results(
condition="rare disease",
status="RECRUITING"
)
print(f"Retrieved {len(all_trials)} total trials")
示例:手动控制分页
from scripts.query_clinicaltrials import search_studies
all_studies = []
page_token = None
max_pages = 10 # 限制以避免过多请求
for page in range(max_pages):
results = search_studies(
condition="cancer",
page_size=1000, # 最大页面大小
page_token=page_token
)
all_studies.extend(results['studies'])
# 检查是否有下一页
page_token = results.get('pageToken')
if not page_token:
break
print(f"Retrieved {len(all_studies)} studies across {page + 1} pages")
将试验数据导出为 CSV 格式,以便在电子表格软件或数据分析工具中进行分析。
示例:导出到 CSV 文件
from scripts.query_clinicaltrials import search_studies
# 请求 CSV 格式
results = search_studies(
condition="heart disease",
status="RECRUITING",
format="csv",
page_size=1000
)
# 保存到文件
with open("heart_disease_trials.csv", "w") as f:
f.write(results)
print("Data exported to heart_disease_trials.csv")
注意: CSV 格式返回的是字符串而不是 JSON 字典。
提取关键信息以快速概览或报告。
示例:创建试验摘要
from scripts.query_clinicaltrials import get_study_details, extract_study_summary
# 获取详细信息并提取摘要
study = get_study_details("NCT04852770")
summary = extract_study_summary(study)
print(f"NCT ID: {summary['nct_id']}")
print(f"Title: {summary['title']}")
print(f"Status: {summary['status']}")
print(f"Phase: {', '.join(summary['phase'])}")
print(f"Enrollment: {summary['enrollment']}")
print(f"Last Update: {summary['last_update']}")
print(f"\nBrief Summary:\n{summary['brief_summary']}")
组合多个筛选器进行针对性搜索。
示例:多标准搜索
from scripts.query_clinicaltrials import search_studies
# 查找加利福尼亚州针对肺癌的 2/3 期免疫疗法试验
results = search_studies(
condition="lung cancer",
intervention="immunotherapy",
location="California",
status=["RECRUITING", "NOT_YET_RECRUITING"],
page_size=100
)
# 进一步按阶段筛选
phase2_3_trials = [
study for study in results['studies']
if any(phase in ['PHASE2', 'PHASE3']
for phase in study['protocolSection'].get('designModule', {}).get('phases', []))
]
print(f"Found {len(phase2_3_trials)} Phase 2/3 immunotherapy trials")
提供用于常见查询模式的辅助函数的综合 Python 脚本:
search_studies() - 使用各种筛选器搜索试验get_study_details() - 检索特定试验的完整信息search_with_all_results() - 自动遍历所有结果的分页extract_study_summary() - 提取关键信息以快速概览直接运行脚本查看示例用法:
python3 scripts/query_clinicaltrials.py
详细的 API 文档,包括:
在处理不熟悉的 API 功能或排查问题时,请加载此参考文档。
API 的速率限制约为每分钟 50 个请求。对于批量数据检索:
import time
import requests
def search_with_rate_limit(params):
try:
response = requests.get("https://clinicaltrials.gov/api/v2/studies", params=params)
response.raise_for_status()
return response.json()
except requests.exceptions.HTTPError as e:
if e.response.status_code == 429:
print("Rate limited. Waiting 60 seconds...")
time.sleep(60)
return search_with_rate_limit(params) # 重试
raise
API 响应具有嵌套结构。常见信息的关键路径:
study['protocolSection']['identificationModule']['nctId']study['protocolSection']['identificationModule']['briefTitle']study['protocolSection']['statusModule']['overallStatus']study['protocolSection']['designModule']['phases']study['protocolSection']['eligibilityModule']study['protocolSection']['contactsLocationsModule']['locations']study['protocolSection']['armsInterventionsModule']['interventions']始终为网络请求实施适当的错误处理:
import requests
try:
response = requests.get(url, params=params, timeout=30)
response.raise_for_status()
data = response.json()
except requests.exceptions.HTTPError as e:
print(f"HTTP error: {e.response.status_code}")
except requests.exceptions.RequestException as e:
print(f"Request failed: {e}")
except ValueError as e:
print(f"JSON decode error: {e}")
并非所有试验都有完整信息。始终检查字段是否存在:
# 使用 .get() 安全导航
phases = study['protocolSection'].get('designModule', {}).get('phases', [])
enrollment = study['protocolSection'].get('designModule', {}).get('enrollmentInfo', {}).get('count', 'N/A')
# 访问前检查
if 'resultsSection' in study:
# 处理结果
pass
https://clinicaltrials.gov/api/v2有关完整的技术细节,请参阅 references/api_reference.md。
每周安装次数
145
代码库
GitHub 星标数
22.6K
首次出现
2026 年 1 月 21 日
安全审计
安装于
claude-code116
opencode113
gemini-cli109
cursor107
codex99
antigravity96
ClinicalTrials.gov is a comprehensive registry of clinical studies conducted worldwide, maintained by the U.S. National Library of Medicine. Access API v2 to search for trials, retrieve detailed study information, filter by various criteria, and export data for analysis. The API is public (no authentication required) with rate limits of ~50 requests per minute, supporting JSON and CSV formats.
This skill should be used when working with clinical trial data in scenarios such as:
Search for clinical trials using the helper script:
cd scientific-databases/clinicaltrials-database/scripts
python3 query_clinicaltrials.py
Or use Python directly with the requests library:
import requests
url = "https://clinicaltrials.gov/api/v2/studies"
params = {
"query.cond": "breast cancer",
"filter.overallStatus": "RECRUITING",
"pageSize": 10
}
response = requests.get(url, params=params)
data = response.json()
print(f"Found {data['totalCount']} trials")
Get detailed information about a trial using its NCT ID:
import requests
nct_id = "NCT04852770"
url = f"https://clinicaltrials.gov/api/v2/studies/{nct_id}"
response = requests.get(url)
study = response.json()
# Access specific modules
title = study['protocolSection']['identificationModule']['briefTitle']
status = study['protocolSection']['statusModule']['overallStatus']
Find trials studying specific medical conditions or diseases using the query.cond parameter.
Example: Find recruiting diabetes trials
from scripts.query_clinicaltrials import search_studies
results = search_studies(
condition="type 2 diabetes",
status="RECRUITING",
page_size=20,
sort="LastUpdatePostDate:desc"
)
print(f"Found {results['totalCount']} recruiting diabetes trials")
for study in results['studies']:
protocol = study['protocolSection']
nct_id = protocol['identificationModule']['nctId']
title = protocol['identificationModule']['briefTitle']
print(f"{nct_id}: {title}")
Common use cases:
Search for trials testing specific interventions, drugs, devices, or procedures using the query.intr parameter.
Example: Find Phase 3 trials testing Pembrolizumab
from scripts.query_clinicaltrials import search_studies
results = search_studies(
intervention="Pembrolizumab",
status=["RECRUITING", "ACTIVE_NOT_RECRUITING"],
page_size=50
)
# Filter by phase in results
phase3_trials = [
study for study in results['studies']
if 'PHASE3' in study['protocolSection'].get('designModule', {}).get('phases', [])
]
Common use cases:
Find trials in specific locations using the query.locn parameter.
Example: Find cancer trials in New York
from scripts.query_clinicaltrials import search_studies
results = search_studies(
condition="cancer",
location="New York",
status="RECRUITING",
page_size=100
)
# Extract location details
for study in results['studies']:
locations_module = study['protocolSection'].get('contactsLocationsModule', {})
locations = locations_module.get('locations', [])
for loc in locations:
if 'New York' in loc.get('city', ''):
print(f"{loc['facility']}: {loc['city']}, {loc.get('state', '')}")
Common use cases:
Find trials conducted by specific organizations using the query.spons parameter.
Example: Find trials sponsored by NCI
from scripts.query_clinicaltrials import search_studies
results = search_studies(
sponsor="National Cancer Institute",
page_size=100
)
# Extract sponsor information
for study in results['studies']:
sponsor_module = study['protocolSection']['sponsorCollaboratorsModule']
lead_sponsor = sponsor_module['leadSponsor']['name']
collaborators = sponsor_module.get('collaborators', [])
print(f"Lead: {lead_sponsor}")
if collaborators:
print(f" Collaborators: {', '.join([c['name'] for c in collaborators])}")
Common use cases:
Filter trials by recruitment or completion status using the filter.overallStatus parameter.
Valid status values:
RECRUITING - Currently recruiting participantsNOT_YET_RECRUITING - Not yet open for recruitmentENROLLING_BY_INVITATION - Only enrolling by invitationACTIVE_NOT_RECRUITING - Active but no longer recruitingSUSPENDED - Temporarily haltedTERMINATED - Stopped prematurelyCOMPLETED - Study has concludedWITHDRAWN - Withdrawn prior to enrollmentExample: Find recently completed trials with results
from scripts.query_clinicaltrials import search_studies
results = search_studies(
condition="alzheimer disease",
status="COMPLETED",
sort="LastUpdatePostDate:desc",
page_size=50
)
# Filter for trials with results
trials_with_results = [
study for study in results['studies']
if study.get('hasResults', False)
]
print(f"Found {len(trials_with_results)} completed trials with results")
Get comprehensive information about specific trials including eligibility criteria, outcomes, contacts, and locations.
Example: Extract eligibility criteria
from scripts.query_clinicaltrials import get_study_details
study = get_study_details("NCT04852770")
eligibility = study['protocolSection']['eligibilityModule']
print(f"Eligible Ages: {eligibility.get('minimumAge')} - {eligibility.get('maximumAge')}")
print(f"Eligible Sex: {eligibility.get('sex')}")
print(f"\nInclusion Criteria:")
print(eligibility.get('eligibilityCriteria'))
Example: Extract contact information
from scripts.query_clinicaltrials import get_study_details
study = get_study_details("NCT04852770")
contacts_module = study['protocolSection']['contactsLocationsModule']
# Overall contacts
if 'centralContacts' in contacts_module:
for contact in contacts_module['centralContacts']:
print(f"Contact: {contact.get('name')}")
print(f"Phone: {contact.get('phone')}")
print(f"Email: {contact.get('email')}")
# Study locations
if 'locations' in contacts_module:
for location in contacts_module['locations']:
print(f"\nFacility: {location.get('facility')}")
print(f"City: {location.get('city')}, {location.get('state')}")
if location.get('status'):
print(f"Status: {location['status']}")
Handle large result sets efficiently using pagination.
Example: Retrieve all matching trials
from scripts.query_clinicaltrials import search_with_all_results
# Get all trials (automatically handles pagination)
all_trials = search_with_all_results(
condition="rare disease",
status="RECRUITING"
)
print(f"Retrieved {len(all_trials)} total trials")
Example: Manual pagination with control
from scripts.query_clinicaltrials import search_studies
all_studies = []
page_token = None
max_pages = 10 # Limit to avoid excessive requests
for page in range(max_pages):
results = search_studies(
condition="cancer",
page_size=1000, # Max page size
page_token=page_token
)
all_studies.extend(results['studies'])
# Check for next page
page_token = results.get('pageToken')
if not page_token:
break
print(f"Retrieved {len(all_studies)} studies across {page + 1} pages")
Export trial data to CSV format for analysis in spreadsheet software or data analysis tools.
Example: Export to CSV file
from scripts.query_clinicaltrials import search_studies
# Request CSV format
results = search_studies(
condition="heart disease",
status="RECRUITING",
format="csv",
page_size=1000
)
# Save to file
with open("heart_disease_trials.csv", "w") as f:
f.write(results)
print("Data exported to heart_disease_trials.csv")
Note: CSV format returns a string instead of JSON dictionary.
Extract key information for quick overview or reporting.
Example: Create trial summary
from scripts.query_clinicaltrials import get_study_details, extract_study_summary
# Get details and extract summary
study = get_study_details("NCT04852770")
summary = extract_study_summary(study)
print(f"NCT ID: {summary['nct_id']}")
print(f"Title: {summary['title']}")
print(f"Status: {summary['status']}")
print(f"Phase: {', '.join(summary['phase'])}")
print(f"Enrollment: {summary['enrollment']}")
print(f"Last Update: {summary['last_update']}")
print(f"\nBrief Summary:\n{summary['brief_summary']}")
Combine multiple filters for targeted searches.
Example: Multi-criteria search
from scripts.query_clinicaltrials import search_studies
# Find Phase 2/3 immunotherapy trials for lung cancer in California
results = search_studies(
condition="lung cancer",
intervention="immunotherapy",
location="California",
status=["RECRUITING", "NOT_YET_RECRUITING"],
page_size=100
)
# Further filter by phase
phase2_3_trials = [
study for study in results['studies']
if any(phase in ['PHASE2', 'PHASE3']
for phase in study['protocolSection'].get('designModule', {}).get('phases', []))
]
print(f"Found {len(phase2_3_trials)} Phase 2/3 immunotherapy trials")
Comprehensive Python script providing helper functions for common query patterns:
search_studies() - Search for trials with various filtersget_study_details() - Retrieve full information for a specific trialsearch_with_all_results() - Automatically paginate through all resultsextract_study_summary() - Extract key information for quick overviewRun the script directly for example usage:
python3 scripts/query_clinicaltrials.py
Detailed API documentation including:
Load this reference when working with unfamiliar API features or troubleshooting issues.
The API has a rate limit of approximately 50 requests per minute. For bulk data retrieval:
import time
import requests
def search_with_rate_limit(params):
try:
response = requests.get("https://clinicaltrials.gov/api/v2/studies", params=params)
response.raise_for_status()
return response.json()
except requests.exceptions.HTTPError as e:
if e.response.status_code == 429:
print("Rate limited. Waiting 60 seconds...")
time.sleep(60)
return search_with_rate_limit(params) # Retry
raise
The API response has a nested structure. Key paths to common information:
study['protocolSection']['identificationModule']['nctId']study['protocolSection']['identificationModule']['briefTitle']study['protocolSection']['statusModule']['overallStatus']study['protocolSection']['designModule']['phases']study['protocolSection']['eligibilityModule']study['protocolSection']['contactsLocationsModule']['locations']study['protocolSection']['armsInterventionsModule']['interventions']Always implement proper error handling for network requests:
import requests
try:
response = requests.get(url, params=params, timeout=30)
response.raise_for_status()
data = response.json()
except requests.exceptions.HTTPError as e:
print(f"HTTP error: {e.response.status_code}")
except requests.exceptions.RequestException as e:
print(f"Request failed: {e}")
except ValueError as e:
print(f"JSON decode error: {e}")
Not all trials have complete information. Always check for field existence:
# Safe navigation with .get()
phases = study['protocolSection'].get('designModule', {}).get('phases', [])
enrollment = study['protocolSection'].get('designModule', {}).get('enrollmentInfo', {}).get('count', 'N/A')
# Check before accessing
if 'resultsSection' in study:
# Process results
pass
https://clinicaltrials.gov/api/v2For complete technical details, see references/api_reference.md.
Weekly Installs
145
Repository
GitHub Stars
22.6K
First Seen
Jan 21, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykWarn
Installed on
claude-code116
opencode113
gemini-cli109
cursor107
codex99
antigravity96
DOCX文件创建、编辑与分析完整指南 - 使用docx-js、Pandoc和Python脚本
48,500 周安装