Source code for tooluniverse.dbsnp_tool
import requests
from .base_tool import BaseTool
from .tool_registry import register_tool
[docs]
@register_tool("DbSnpTool")
class DbSnpTool(BaseTool):
"""
Local tool wrapper for dbSNP via NCBI Variation Services.
Fetches variant by rsID using the refsnp endpoint.
"""
[docs]
def __init__(self, tool_config):
super().__init__(tool_config)
self.base = "https://api.ncbi.nlm.nih.gov/variation/v0"
self.session = requests.Session()
[docs]
def run(self, arguments):
rsid = arguments.get("rsid")
if not rsid:
return {"error": "Missing required parameter: rsid"}
# Clean rsid (remove 'rs' prefix if present)
if rsid.startswith("rs"):
rsid = rsid[2:]
url = f"{self.base}/refsnp/{rsid}"
resp = self.session.get(url, timeout=20)
resp.raise_for_status()
data = resp.json()
# Extract key fields from primary snapshot
primary = data.get("primary_snapshot_data", {})
placements = primary.get("placements_with_allele", [])
chrom = ""
pos = None
alleles = []
hgvs = []
if placements:
placement = placements[0]
chrom = (
placement.get("seq_id", "").replace("NC_0000", "").replace(".11", "")
)
if chrom.startswith("0"):
chrom = chrom[1:]
chrom = f"chr{chrom}"
allele_data = placement.get("alleles", [])
for allele in allele_data:
spdi = allele.get("allele", {}).get("spdi", {})
if spdi:
ref = spdi.get("deleted_sequence", "")
alt = spdi.get("inserted_sequence", "")
if ref and alt:
alleles.append(f"{ref}>{alt}")
elif ref:
alleles.append(ref)
hgvs_val = allele.get("hgvs", "")
if hgvs_val:
hgvs.append(hgvs_val)
return {
"refsnp_id": f"rs{rsid}",
"chrom": chrom,
"pos": pos,
"alleles": alleles,
"hgvs": hgvs,
}