
Tooluniverse Vaccine Design
- 180 installs
- 1.6k repo stars
- Updated August 4, 2026
- mims-harvard/tooluniverse
Prototype computational vaccine candidates—epitope selection, antigen design, and feasibility checks—before committing wet-lab or production pipelines.
About
Uses ToolUniverse vaccine-design tooling to prototype antigen and epitope strategies, run computational screens, and produce comparable candidate summaries for pre-build scientific validation.
- ToolUniverse vaccine-design tool orchestration
- Epitope and antigen prototyping
- In-silico feasibility screening
- Iterative candidate refinement
- Bridge from hypothesis to testable construct
Tooluniverse Vaccine Design by the numbers
- 180 all-time installs (skills.sh)
- +5 installs in the week ending Aug 4, 2026 (Skillselion tracking)
- Ranked #692 of 2,064 Data Science & ML skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/mims-harvard/tooluniverse --skill tooluniverse-vaccine-designAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 180 |
|---|---|
| repo stars | ★ 1.6k |
| Last updated | August 4, 2026 |
| Repository | mims-harvard/tooluniverse ↗ |
What it does
Prototype computational vaccine candidates—epitope selection, antigen design, and feasibility checks—before committing wet-lab or production pipelines.
Files
Vaccine Design
Computational pipeline for designing peptide/subunit vaccine candidates through epitope prediction, population coverage optimization, and immunogenicity assessment.
Reasoning Strategy
Vaccine design requires presenting the right epitopes to elicit protective immunity — not just any immune response, but one that is neutralizing, durable, and broadly applicable. For T-cell vaccines, the core tool is MHC binding prediction (IEDB tools): predict peptide-MHC affinity across multiple HLA alleles, then select epitopes with broad coverage of the target population. For antibody vaccines, prioritize surface-exposed conserved regions — a deeply buried or hypervariable region makes a poor antibody target. MHC binding does not equal immunogenicity; many good binders are not immunogenic in vivo due to tolerance, poor processing, or lack of T-cell help. A multi-epitope strategy (combining MHC-I for CD8+ CTL response, MHC-II for CD4+ helper response, and B-cell epitopes for antibody induction) is more robust than any single epitope. Conservation across pathogen strains is critical — an epitope that mutates under immune pressure (like HIV envelope hypervariable regions) is a poor vaccine target.
LOOK UP DON'T GUESS: Do not predict MHC binding or population coverage from memory — use IEDB_predict_mhci_binding / IEDB_predict_mhcii_binding for T-cell predictions, IEDB_predict_bcell_epitopes for antibody (B-cell) epitope prediction, and iedb_search_epitopes for validated experimental data. Do not assume what's on the pathogen surface; retrieve annotated sequences from UniProt or BVBRC.
Key principles: 1. Epitope-driven — vaccines work by presenting epitopes to T/B cells; start with epitope prediction 2. Population coverage matters — HLA diversity means no single epitope covers everyone; design for breadth 3. Multi-epitope is better — combine CD8+ (MHC-I) and CD4+ (MHC-II) epitopes for robust immunity 4. Conservation = broad protection — conserved epitopes across strains provide cross-protective immunity 5. Evidence grading — T1: clinical trial data, T2: in-vivo immunogenicity, T3: in-vitro binding, T4: computational prediction only
---
When to Use
- "Design a vaccine against [pathogen]"
- "Predict T-cell epitopes for [protein]"
- "What MHC-I epitopes does [protein] have?"
- "Assess population coverage of these epitopes"
- "Find conserved epitopes across [pathogen] strains"
Not this skill: For HLA typing or allele frequency only, use tooluniverse-hla-immunogenomics. For antibody engineering, use tooluniverse-antibody-engineering.
---
Core Tools
| Tool | Use For |
|---|---|
IEDB_predict_bcell_epitopes | De-novo predict linear B-cell (antibody) epitopes from sequence (BepiPred/Emini/…) |
iedb_search_epitopes | Search experimentally validated epitopes |
iedb_get_epitope_mhc | Get detailed epitope data (assay results, MHC restriction) |
iedb_search_mhc | Search validated MHC binding assay data |
IEDB_predict_mhci_binding | Predict MHC-I binding (NetMHCpan EL; rank < 0.5% = strong binder) |
IEDB_predict_mhcii_binding | Predict MHC-II binding (NetMHCIIpan EL; CD4+ helper epitopes) |
UniProt_get_entry_by_accession | Get antigen protein sequence |
UniProt_search | Find pathogen protein sequences |
BVBRC_search_genome_features | Search pathogen proteomes |
alphafold_get_prediction | Get/predict antigen 3D structure |
EnsemblVEP_annotate_hgvs | Check epitope conservation across variants |
PubMed_search_articles | Find published vaccine studies |
search_clinical_trials | Find ongoing vaccine clinical trials |
---
Workflow
Phase 0: Antigen Selection
Pathogen → essential surface proteins → sequence retrieval
|
Phase 1: T-Cell Epitope Prediction
MHC-I (CD8+ CTL) and MHC-II (CD4+ helper) binding prediction
|
Phase 2: B-Cell Epitope Prediction
Linear and conformational B-cell epitopes for antibody response
|
Phase 3: Population Coverage
HLA allele frequencies → design for target population
|
Phase 4: Conservation Analysis
Cross-strain epitope conservation → broad protection
|
Phase 5: Candidate Assembly & Report
Multi-epitope construct design → immunogenicity assessmentPhase 0: Antigen Selection
Best antigens for vaccines: Surface-exposed, essential for pathogen function, conserved across strains.
# Find pathogen surface proteins
UniProt_search(query="[organism] AND locations:(location:cell surface) AND reviewed:true")
# Or search BVBRC for annotated pathogen proteomes
BVBRC_search_genome_features(keyword="surface protein", genome_id="[taxon_id]")Antigen prioritization: prefer surface-exposed (secreted/outer membrane) over cytoplasmic; >95% conserved across strains; essential for pathogen viability; known immunogen in natural infection. Use UniProt subcellular location annotations and PubMed to verify these properties.
Phase 1: T-Cell Epitope Prediction
MHC-I epitopes (CD8+ cytotoxic T cells — kill infected cells):
# Option A: Search for KNOWN validated epitopes from IEDB
iedb_search_mhc(
mhc_class="I",
qualitative_measure="Positive",
filters={"source_organism_iri": "eq.NCBITaxon:2697049"}, # SARS-CoV-2
select=["linear_sequence", "mhc_restriction", "qualitative_measure"],
limit=50
)
# Option B: PREDICT novel peptide binding (recommended for new proteins)
IEDB_predict_mhci_binding(
sequence="YOUR_PROTEIN_SEQUENCE", # full protein or peptide
allele="HLA-A*02:01", # or H-2-Kd for mouse
method="netmhcpan_el", # EL = eluted ligand (recommended)
length=9 # 8-11 for MHC-I
)
# Returns peptides ranked by percentile_rank:
# < 0.5% = strong binder (include in vaccine)
# 0.5-2% = moderate binder (consider)
# > 2% = weak/non-binder (exclude)MHC-II epitopes (CD4+ helper T cells — activate B cells and CD8+ T cells):
iedb_search_mhc(
mhc_class="II",
qualitative_measure="Positive",
filters={"source_organism_iri": "eq.NCBITaxon:2697049"},
limit=50
)Binding affinity interpretation:
| IC50 (nM) | Classification | Vaccine Relevance |
|---|---|---|
| < 50 | Strong binder | Include — high presentation probability |
| 50-500 | Moderate binder | Consider — may contribute to response |
| 500-5000 | Weak binder | Exclude — unlikely to be presented |
| > 5000 | Non-binder | Exclude |
HLA supertype strategy: For broad coverage, predict against HLA supertypes:
- A2 supertype (A02:01, A02:06, A*68:02) — covers ~40% globally
- A3 supertype (A03:01, A11:01, A*31:01) — covers ~25%
- B7 supertype (B07:02, B35:01, B*51:01) — covers ~25%
- A2 + A3 + B7 + B44 combined — covers >90% of most populations
Phase 2: B-Cell Epitope Prediction
B-cell epitopes trigger antibody production. Look for:
- Linear epitopes: Continuous peptide sequences (easier to synthesize)
- Conformational epitopes: 3D surface patches (requires structural data)
# De-novo predict LINEAR B-cell epitopes along the antigen sequence (BepiPred).
# Returns contiguous predicted epitope regions + per-residue scores.
IEDB_predict_bcell_epitopes(sequence="[antigen_aa_sequence]", method="Bepipred")
# Cross-check against KNOWN experimentally validated epitopes
iedb_search_epitopes(query="[protein_name]", epitope_type="B cell")
# Get structure for conformational epitope prediction
alphafold_get_prediction(uniprot_id="[accession]")B-cell epitope criteria: Surface-exposed loops, hydrophilic regions, flexible regions (high B-factor). Prefer IEDB_predict_bcell_epitopes regions that also fall on surface-exposed loops in the structure; the method arg also supports Emini (surface accessibility), Kolaskar-Tongaonkar (antigenicity), and Parker (hydrophilicity).
Phase 3: Population Coverage
No HLA-frequency tool exists in ToolUniverse, but the coverage math is packaged in scripts/population_coverage.py. Pass the HLA alleles your selected epitopes bind (from the IEDB_predict_mhci/mhcii_binding results) and get the % of the population covered:
# Broad first-pass estimate (bundled average frequencies):
python scripts/population_coverage.py --alleles "HLA-A*02:01,HLA-A*01:01,HLA-A*03:01,HLA-A*24:02,HLA-B*07:02,HLA-B*08:01,HLA-B*44:02"
# -> {"overall_coverage": 73.6, "per_locus_coverage_pct": {"A": 62.9, "B": 28.9}, ...}
# Population-SPECIFIC: supply real allele frequencies (ALLELE<TAB>FREQ) for the
# target ethnicity from the Allele Frequency Net Database (allelefrequencies.net)
# or the IEDB population-coverage tool (tools.iedb.org/population):
python scripts/population_coverage.py --alleles-file covered.txt --freq-file afnd_han_chinese.tsvThe bundled default is an approximate broad average — do NOT report it as coverage for a specific ethnicity; use --freq-file with AFND/IEDB data for that. Also use the HLA supertype strategy to ensure your epitope set spans the common supertypes.
Population coverage targets:
| Coverage Level | Interpretation | Action |
|---|---|---|
| >90% | Excellent — vaccine will work in most individuals | Proceed to development |
| 70-90% | Good — most people covered; some populations underserved | Add more epitopes for uncovered HLA types |
| 50-70% | Moderate — significant gaps | Redesign with broader HLA coverage |
| <50% | Poor — vaccine will miss too many people | Fundamental redesign needed |
Phase 4: Conservation Analysis
Check if epitopes are conserved across pathogen strains/variants:
# Search for protein variants across strains
PubMed_search_articles(query="[pathogen] [protein] sequence variation strains")
# Check specific mutations in epitope regions
EnsemblVEP_annotate_hgvs(hgvs_notation="[variant_in_epitope]")Conservation interpretation:
- 100% conserved across all known strains → ideal vaccine target
- >95% conserved → good target; monitor emerging variants
- 80-95% conserved → may need strain-specific variants in construct
- <80% conserved → avoid; pathogen evolves to escape this epitope
Phase 5: Candidate Assembly & Report
Multi-epitope construct design principles: 1. Include 3-5 MHC-I epitopes (CD8+ response) 2. Include 2-3 MHC-II epitopes (CD4+ helper response) 3. Include 1-2 B-cell epitopes (antibody response) 4. Connect with appropriate linkers (AAY for MHC-I, GPGPG for MHC-II) 5. Add adjuvant sequence if needed (e.g., flagellin domain for TLR5)
Report structure: 1. Antigen Selection — rationale, conservation, essentiality 2. Epitope Map — all predicted epitopes with binding affinities and HLA restrictions 3. Top Epitopes — ranked by binding strength × conservation × population coverage 4. Population Coverage — % coverage per major world population 5. Conservation Analysis — strain coverage, escape risk assessment 6. Construct Design — multi-epitope sequence with linkers 7. Clinical Precedent — existing vaccines/trials for related antigens 8. Limitations — predicted only (T4 evidence); needs experimental validation
---
Limitations
- All predictions are computational (T4 evidence) — experimental validation (binding assays, immunogenicity studies) is required before any clinical development
- No immunogenicity guarantee — MHC binding ≠ immunogenicity; many good binders are not immunogenic in vivo
- B-cell epitope prediction is less reliable than T-cell; conformational epitopes require accurate structures
- No adjuvant optimization — adjuvant selection requires empirical testing
- Pathogen evasion — rapidly evolving pathogens (HIV, influenza) may escape epitope-based vaccines
#!/usr/bin/env python3
"""HLA population-coverage for a set of T-cell epitopes (IEDB-style algorithm).
Population coverage = the fraction of individuals in a target population that
carry at least one HLA allele able to present one of your epitopes. ToolUniverse
has no HLA-frequency tool, so this packages the coverage MATH (the reusable part)
plus a small bundled table of common HLA-A/HLA-B allele frequencies for a
first-pass "average / broad" estimate.
For population-SPECIFIC coverage, supply real allele frequencies with
--freq-file (one `ALLELE<TAB>FREQUENCY` per line) from the Allele Frequency Net
Database (allelefrequencies.net) or the IEDB population-coverage tool
(tools.iedb.org/population). Do not over-interpret the bundled default for a
specific ethnicity — it is an approximate average.
Coverage per locus (Hardy-Weinberg): an individual is covered at a locus if they
carry >=1 covered allele; with summed covered-allele frequency p, the covered
fraction = 1 - (1 - p)^2. Loci are combined assuming independence:
overall = 1 - prod_over_loci(1 - coverage_locus).
Usage:
python population_coverage.py --alleles "HLA-A*02:01,HLA-A*01:01,HLA-B*07:02"
python population_coverage.py --alleles-file covered.txt --freq-file afnd_eur.tsv
"""
from __future__ import annotations
import argparse
import re
import sys
# Approximate broad-average frequencies for common class-I alleles (illustrative
# first-pass default; use --freq-file with AFND data for a specific population).
DEFAULT_FREQ = {
"A*01:01": 0.083, "A*02:01": 0.146, "A*03:01": 0.077, "A*11:01": 0.058,
"A*24:02": 0.085, "A*26:01": 0.030, "A*29:02": 0.018, "A*31:01": 0.025,
"A*32:01": 0.022, "A*68:01": 0.030,
"B*07:02": 0.063, "B*08:01": 0.054, "B*15:01": 0.036, "B*18:01": 0.022,
"B*27:05": 0.018, "B*35:01": 0.044, "B*40:01": 0.038, "B*44:02": 0.040,
"B*44:03": 0.030, "B*51:01": 0.040,
}
def _locus(allele):
m = re.match(r"(?:HLA-)?([A-Z]+\d?)\*", allele)
return m.group(1) if m else allele.split("*")[0].replace("HLA-", "")
def _norm(allele):
return allele.strip().replace("HLA-", "")
def coverage(covered_alleles, freqs):
by_locus = {}
for a in covered_alleles:
a = _norm(a)
f = freqs.get(a)
if f is None:
continue
by_locus.setdefault(_locus(a), 0.0)
by_locus[_locus(a)] += f
locus_cov = {loc: 1.0 - (1.0 - min(p, 1.0)) ** 2 for loc, p in by_locus.items()}
not_covered = 1.0
for c in locus_cov.values():
not_covered *= 1.0 - c
overall = 1.0 - not_covered
return {
"overall_coverage": round(overall * 100, 1),
"per_locus_coverage_pct": {loc: round(c * 100, 1) for loc, c in locus_cov.items()},
"covered_allele_freq_sum_per_locus": {loc: round(p, 4) for loc, p in by_locus.items()},
"alleles_used": [a for a in (_norm(x) for x in covered_alleles) if a in freqs],
"alleles_unknown_freq": [a for a in (_norm(x) for x in covered_alleles) if a not in freqs],
}
def _read_list(path):
out = []
for line in open(path):
out += [x for x in re.split(r"[,\s]+", line.strip()) if x]
return out
def _read_freqs(path):
f = {}
for line in open(path):
parts = re.split(r"[\t,]", line.strip())
if len(parts) >= 2:
try:
f[_norm(parts[0])] = float(parts[1])
except ValueError:
continue
return f
def main(argv=None):
p = argparse.ArgumentParser(description=__doc__)
p.add_argument("--alleles", help="Comma-separated covered HLA alleles")
p.add_argument("--alleles-file")
p.add_argument("--freq-file", help="ALLELE<TAB>FREQ table (AFND/IEDB) for a specific population")
args = p.parse_args(argv)
alleles = _read_list(args.alleles_file) if args.alleles_file else (args.alleles or "").split(",")
alleles = [a for a in alleles if a.strip()]
if not alleles:
p.error("provide --alleles or --alleles-file (the HLA alleles your epitopes cover)")
freqs = _read_freqs(args.freq_file) if args.freq_file else DEFAULT_FREQ
import json
result = coverage(alleles, freqs)
result["frequency_source"] = args.freq_file or "bundled broad-average default (approximate)"
print(json.dumps(result, indent=2))
return 0
if __name__ == "__main__":
sys.exit(main())