- name
- variant-interpretation
- description
- ToolUniverse workflow — Variant Interpretation
- source
- https://github.com/mims-harvard/ToolUniverse/tree/main/skills/tooluniverse-variant-interpretation
- metadata
- null
---
name: tooluniverse-variant-interpretation
description: Systematic clinical variant interpretation from raw variant calls to ACMG-classified recommendations with structural impact analysis. Aggregates evidence from ClinVar, gnomAD, CIViC, UniProt, and PDB across ACMG criteria. Produces pathogenicity scores (0-100), clinical recommendations, and treatment implications. Use when interpreting genetic variants, classifying variants of uncertain significance (VUS), performing ACMG variant classification, or translating variant calls to clinical actionability.
---
---
name: tooluniverse-variant-interpretation
description: Systematic clinical variant interpretation from raw variant calls to ACMG-classified recommendations with structural impact analysis. Aggregates evidence from ClinVar, gnomAD, CIViC, UniProt, and PDB across ACMG criteria. Produces pathogenicity scores (0-100), clinical recommendations, and treatment implications. Use when interpreting genetic variants, classifying variants of uncertain significance (VUS), performing ACMG variant classification, or translating variant calls to clinical actionability.
---
# Clinical Variant Interpreter
Systematic variant interpretation skill using ToolUniverse - from raw variant calls to ACMG-classified clinical recommendations with structural impact analysis.
---
## Problem This Skill Solves
Clinical labs and researchers face critical challenges in variant interpretation:
1. **Variant classification uncertainty** - VUS (Variants of Uncertain Significance) comprise 40-60% of clinical variants
2. **Evidence aggregation burden** - Must integrate data from 10+ databases per variant
3. **Structural context missing** - Traditional annotation ignores 3D protein impact
4. **Clinical actionability unclear** - How does classification translate to patient care?
**This skill provides**: A systematic workflow that combines population databases, functional predictions, structural analysis (via AlphaFold2), and literature evidence into ACMG-compliant interpretations with clear clinical recommendations.
---
## Key Principles
1. **ACMG-Guided Classification** - Follow ACMG/AMP 2015 guidelines with explicit evidence codes
2. **Structural Evidence Integration** - Use AlphaFold2 for novel structural impact analysis
3. **Population Context** - gnomAD frequencies with ancestry-specific data
4. **Gene-Disease Validity** - ClinGen curation status for clinical relevance
5. **Actionable Output** - Clear recommendations, not just classifications
6. **English-first queries** - Always use English terms in tool calls (gene names, variant descriptions, disease names), even if the user writes in another language. Only try original-language terms as a fallback. Respond in the user's language
---
## Triggers
Use this skill when users:
- Ask about variant interpretation or classification
- Have VCF data needing clinical annotation
- Ask "what does this variant mean clinically?"
- Need ACMG classification for variants
- Want structural impact analysis for missense variants
- Ask about pathogenicity of specific variants
---
## Workflow Overview
```
┌─────────────────────────────────────────────────────────────────┐
│ VARIANT INTERPRETATION │
├─────────────────────────────────────────────────────────────────┤
│ │
│ Phase 1: VARIANT IDENTITY │
│ ├── Normalize variant notation (HGVS) │
│ ├── Map to gene, transcript, protein │
│ └── Get consequence type (missense, nonsense, etc.) │
│ │
│ Phase 2: CLINICAL DATABASES │
│ ├── ClinVar: Existing classifications │
│ ├── gnomAD: Population frequencies (all + ancestry) │
│ ├── OMIM: Gene-disease associations │
│ ├── ClinGen: Gene validity + dosage sensitivity (ENHANCED) │
│ │ └─ ClinGen_search_gene_validity, ClinGen_search_dosage │
│ └── SpliceAI: Splice variant prediction (NEW) │
│ │
│ Phase 2.5: REGULATORY CONTEXT (NEW - for non-coding variants) │
│ ├── ChIPAtlas: TF binding at position │
│ ├── ENCODE: Regulatory elements (enhancers, promoters) │
│ ├── Conservation in regulatory regions │
│ └── Functional annotation of regulatory impact │
│ │
│ Phase 3: COMPUTATIONAL PREDICTIONS │
│ ├── SIFT/PolyPhen: Damaging predictions │
│ ├── CADD: Deleteriousness score │
│ ├── SpliceAI: Splice impact (if applicable) │
│ └── Conservation: Cross-species alignment │
│ │
│ Phase 4: STRUCTURAL ANALYSIS (for VUS/novel missense) │
│ ├── Get protein structure (PDB or AlphaFold2) │
│ ├── Map variant to structure │
│ ├── Assess domain/functional site impact │
│ └── Predict structural destabilization │
│ │
│ Phase 4.5: EXPRESSION CONTEXT (NEW) │
│ ├── CELLxGENE: Cell-type specific expression │
│ ├── Tissue relevance to phenotype │
│ └── Expression validation │
│ │
│ Phase 5: LITERATURE EVIDENCE │
│ ├── PubMed: Functional studies │
│ ├── BioRxiv/MedRxiv: Recent preprints (NEW) │
│ ├── Case reports: Phenotype correlations │
│ └── Segregation data (if in literature) │
│ │
│ Phase 6: ACMG CLASSIFICATION │
│ ├── Apply evidence codes (PVS1, PM2, PP3, etc.) │
│ ├── Calculate classification │
│ ├── Identify limiting factors │
│ └── Generate clinical recommendations │
│ │
└─────────────────────────────────────────────────────────────────┘
```
---
## Phase Details
### Phase 1: Variant Identity & Normalization
**Goal**: Standardize variant notation and determine molecular consequence
**Tools**:
| Tool | Purpose |
|------|---------|
| `myvariant_query` | Get variant annotations from MyVariant.info |
| `Ensembl_get_variant_info` | Variant effect predictor data |
| `NCBI_gene_search` | Gene information |
**Key Information to Capture**:
- HGVS notation (c. and p.)
- Gene symbol and Ensembl ID
- Transcript (canonical/MANE Select)
- Consequence type
- Amino acid change (for missense)
- Exon/intron location
### Phase 2: Clinical Database Queries
**Goal**: Aggregate existing clinical knowledge
**Tools**:
| Tool | Purpose | Key Data |
|------|---------|----------|
| `clinvar_search` | Existing classifications | Classification, review status, submissions |
| `gnomad_search` | Population frequency | AF, ancestry-specific AFs, homozygotes |
| `OMIM_search`, `OMIM_get_entry` | Gene-disease | Inheritance, phenotypes |
| `ClinGen_gene_validity` | Curation status | Gene-disease validity level |
| `COSMIC_search_mutations` | **Somatic mutations (NEW)** | Cancer frequency, histology |
| `DisGeNET_search_gene` | **Gene-disease associations (NEW)** | Evidence scores, sources |
### 2.1 COSMIC for Somatic Context (NEW)
For cancer variants, check COSMIC for somatic mutation frequency:
```python
def get_somatic_context(tu, gene_symbol, variant_aa):
"""Get somatic mutation context from COSMIC."""
# Search for specific mutation
cosmic = tu.tools.COSMIC_search_mutations(
operation="search",
terms=f"{gene_symbol} {variant_aa}",
max_results=20,
genome_build=38
)
# Get all gene mutations for context
gene_mutations = tu.tools.COSMIC_get_mutations_by_gene(
operation="get_by_gene",
gene=gene_symbol,
max_results=100
)
# Determine if it's a hotspot
mutation_counts = Counter(m['MutationAA'] for m in gene_mutations.get('results', []))
is_hotspot = variant_aa in [m[0] for m in mutation_counts.most_common(10)]
return {
'cosmic_hits': cosmic.get('results', []),
'is_somatic_hotspot': is_hotspot,
'cancer_types': [m['PrimarySite'] for m in cosmic.get('results', [])],
'total_cosmic_count': cosmic.get('total_count', 0)
}
```
### 2.2 OMIM Gene-Disease Context (NEW)
```python
def get_omim_context(tu, gene_symbol):
"""Get OMIM gene-disease associations."""
# Search OMIM for gene
search = tu.tools.OMIM_search(
operation="search",
query=gene_symbol,
limit=5
)
omim_data = []
for entry in search.get('data', {}).get('entries', []):
mim = entry.get('mimNumber')
# Get detailed entry
details = tu.tools.OMIM_get_entry(
operation="get_entry",
mim_number=str(mim)
)
# Get clinical synopsis
synopsis = tu.tools.OMIM_get_clinical_synopsis(
operation="get_clinical_synopsis",
mim_number=str(mim)
)
omim_data.append({
'mim_number': mim,
'title': details.get('data', {}).get('titles', {}),
'inheritance': synopsis.get('data', {}).get('inheritance'),
'clinical_features': synopsis.get('data', {})
})
return omim_data
```
### 2.3 DisGeNET Gene-Disease Evidence (NEW)
```python
def get_disgenet_context(tu, gene_symbol, variant_rsid=None):
"""Get gene-disease associations from DisGeNET."""
# Gene-disease associations
gda = tu.tools.DisGeNET_search_gene(
operation="search_gene",
gene=gene_symbol,
limit=20
)
# Variant-disease associations (if rsID available)
vda = None
if variant_rsid:
vda = tu.tools.DisGeNET_get_vda(
operation="get_vda",
variant=variant_rsid,
limit=20
)
return {
'gene_associations': gda.get('data', {}).get('associations', []),
'variant_associations': vda.get('data', {}).get('associations', []) if vda else []
}
```
### 2.4 ClinGen Gene Validity & Dosage Sensitivity (NEW)
ClinGen provides authoritative curation of gene-disease relationships:
```python
def get_clingen_evidence(tu, gene_symbol):
"""
Get ClinGen gene validity and dosage sensitivity data.
CRITICAL for ACMG classification - establishes gene-disease validity.
"""
# 1. Gene-disease validity (Definitive/Strong/Moderate/Limited)
validity = tu.tools.ClinGen_search_gene_validity(gene=gene_symbol)
validity_data = []
if validity.get('data'):
for entry in validity.get('data', []):
validity_data.append({
'disease': entry.get('Disease Label'),
'classification': entry.get('Classification'), # Definitive, Strong, etc.
'inheritance': entry.get('Inheritance'),
'mondo_id': entry.get('Disease ID (MONDO)')
})
# 2. Dosage sensitivity (haploinsufficiency, triplosensitivity)
dosage = tu.tools.ClinGen_search_dosage_sensitivity(gene=gene_symbol)
dosage_data = {}
if dosage.get('data'):
for entry in dosage.get('data', []):
dosage_data = {
'haploinsufficiency_score': entry.get('Haploinsufficiency Score'),
'triplosensitivity_score': entry.get('Triplosensitivity Score'),
'disease': entry.get('Disease')
}
break # Usually one entry per gene
# 3. Clinical actionability (for incidental findings context)
actionability = tu.tools.ClinGen_search_actionability(gene=gene_symbol)
return {
'gene_validity': validity_data,
'dosage_sensitivity': dosage_data,
'actionability': actionability.get('data', {}),
'has_definitive_validity': any(v['classification'] == 'Definitive' for v in validity_data),
'is_haploinsufficient': dosage_data.get('haploinsufficiency_score') == '3'
}
```
**ClinGen Validity Levels** (for ACMG PM1/PP4):
| Classification | Meaning | ACMG Impact |
|----------------|---------|-------------|
| **Definitive** | Multiple concordant studies | Strong gene-disease support |
| **Strong** | Extensive evidence | Moderate-strong support |
| **Moderate** | Some evidence | Moderate support |
| **Limited** | Minimal evidence | Weak support, use caution |
| **Disputed** | Conflicting evidence | Do not use for classification |
| **Refuted** | Evidence against | Gene NOT associated |
**Dosage Sensitivity Scores** (for CNV interpretation):
| Score | Meaning | Interpretation |
|-------|---------|----------------|
| **3** | Sufficient evidence | Haploinsufficiency/triplosensitivity established |
| **2** | Emerging evidence | Some support, not definitive |
| **1** | Little evidence | Minimal support |
| **0** | No evidence | Unknown |
### 2.5 SpliceAI Splice Variant Prediction (NEW)
~15% of pathogenic variants affect splicing. SpliceAI is the gold standard for splice prediction:
```python
def get_spliceai_prediction(tu, chrom, pos, ref, alt, genome="38"):
"""
Get SpliceAI splice effect predictions.
Delta scores:
- DS_AG: Acceptor gain
- DS_AL: Acceptor loss
- DS_DG: Donor gain
- DS_DL: Donor loss
Thresholds:
- ≥0.8: High pathogenicity (strong PP3)
- 0.5-0.8: Moderate (supporting PP3)
- 0.2-0.5: Low (weak evidence)
- <0.2: Likely benign
"""
# Format variant for SpliceAI
variant = f"chr{chrom}-{pos}-{ref}-{alt}"
# Get full splice predictions
result = tu.tools.SpliceAI_predict_splice(
variant=variant,
genome=genome
)
if result.get('data'):
max_score = result['data'].get('max_delta_score', 0)
interpretation = result['data'].get('interpretation', '')
# Determine ACMG support
if max_score >= 0.8:
acmg = 'PP3 (strong) - high splice impact'
elif max_score >= 0.5:
acmg = 'PP3 (supporting) - moderate splice impact'
elif max_score >= 0.2:
acmg = 'PP3 (weak) - possible splice impact'
else:
acmg = 'BP7 (if synonymous) - splice benign'
return {
'max_delta_score': max_score,
'interpretation': interpretation,
'acmg_support': acmg,
'scores': result['data'].get('scores', [])
}
return None
def quick_splice_check(tu, variant, genome="38"):
"""Quick triage using max delta score only."""
result = tu.tools.SpliceAI_get_max_delta(
variant=variant,
genome=genome
)
return result.get('data', {})
```
**When to Use SpliceAI**:
- **Intronic variants** near splice sites (±50bp)
View on GitHub