Source code for tooluniverse.clinvar_tool

import requests
from .base_tool import BaseTool
from .tool_registry import register_tool


[docs] @register_tool("ClinVarTool") class ClinVarTool(BaseTool): """ Local tool wrapper for ClinVar via NCBI E-utilities. Uses esearch + esummary to fetch variant records. """
[docs] def __init__(self, tool_config): super().__init__(tool_config) self.base = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils" self.session = requests.Session()
[docs] def run(self, arguments): query = arguments.get("query") retmax = arguments.get("retmax", 5) if not query: return {"error": "Missing required parameter: query"} # 1) esearch to get UIDs search_url = f"{self.base}/esearch.fcgi" search_params = { "db": "clinvar", "term": query, "retmode": "json", "retmax": retmax, } search_resp = self.session.get(search_url, params=search_params, timeout=20) search_resp.raise_for_status() search_data = search_resp.json() uids = search_data.get("esearchresult", {}).get("idlist", []) if not uids: return [] # 2) esummary to get details summary_url = f"{self.base}/esummary.fcgi" summary_params = { "db": "clinvar", "id": ",".join(uids), "retmode": "json", } summary_resp = self.session.get(summary_url, params=summary_params, timeout=30) summary_resp.raise_for_status() summary_data = summary_resp.json() results = [] for uid in uids: record = summary_data.get("result", {}).get(uid, {}) if not record: continue # Extract key fields variation_set = record.get("variation_set", []) gene = "" chr_name = "" start = None stop = None spdi = "" if variation_set: var = variation_set[0] gene = record.get("genes", [{}])[0].get("symbol", "") var_loc = var.get("variation_loc", [{}])[0] chr_name = var_loc.get("chr", "") start = var_loc.get("start") stop = var_loc.get("stop") spdi = var.get("canonical_spdi", "") clinical_sig = record.get("germline_classification", {}).get( "description", "" ) results.append( { "uid": uid, "accession": record.get("accession", ""), "title": record.get("title", ""), "gene": gene, "chr": chr_name, "start": start, "stop": stop, "spdi": spdi, "clinical_significance": clinical_sig, } ) return results