alterlab-biopython — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited alterlab-biopython (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Biopython is a comprehensive set of freely available Python tools for biological computation. It provides functionality for sequence manipulation, file I/O, database access, structural bioinformatics, phylogenetics, and many other bioinformatics tasks. The current version is Biopython 1.88 (August 2026), which supports Python 3.10–3.14 and requires NumPy.
Removed / changed APIs to watch for
>
- Command-line wrappers are gone.Bio.Applicationand everything built on it —Bio.Blast.Applications(Ncbiblastn/p/x…Commandline,NcbimakeblastdbCommandline) andBio.Align.Applications(ClustalOmegaCommandline,MuscleCommandline) — were deprecated in 1.78 and removed in 1.86. Call the executables throughsubprocess(seereferences/blast.mdandreferences/alignment.md). - PairwiseAligner gap scores changed in 1.86. The default gap score is now -1 (was 0), so an aligner left at defaults returns far fewer, non-degenerate alignments. The gap attributes were also renamed to insertion/deletion forms (open_internal_insertion_score, …); the*_gap_scorenames still work as meta-attributes. Thealphabetattribute is deprecated and unused. - `Bio.pairwise2` is deprecated — useBio.Align.PairwiseAligner. - `Bio.Blast.NCBIXML` is declared obsolete as of the 1.89 development line in favour of theBio.Blastparser added in 1.84 (Blast.parse/Blast.read,Blast.qblast). It still ships and works in 1.88; prefer the new API for new code. - Security fixes worth upgrading for: 1.87 fixed CVE-2025-68463 inBio.Entrez.Parser, and 1.88 removed anevalin theBio.Nexusparser that allowed code execution from a malicious NEXUS file. Treat downloaded records as untrusted input and keep Biopython current.
Use this skill when:
| Scenario | Use Instead |
|---|---|
Running local BLAST+ / makeblastdb from the command line, or DIAMOND | alterlab-blast |
| A one-line lookup of a gene, sequence, or structure | alterlab-gget |
| One call across many web services (UniProt + KEGG + ChEMBL in a pipeline) | alterlab-bioservices |
| SAM/BAM/CRAM record access, pileups, and read filtering | alterlab-pysam |
| Building an ML phylogeny from unaligned sequences (MAFFT + IQ-TREE) | alterlab-phylogenetics |
Biopython is organized into modular sub-packages, each addressing specific bioinformatics domains:
Install Biopython (requires Python 3 and NumPy). On this machine, prefer running scripts with uv run:
# Ad-hoc: run a script with Biopython available, no venv to manage
uv run --with biopython script.py
# Or add it to a project
uv add biopythonFor NCBI database access, always set your email address (required by NCBI):
from Bio import Entrez
Entrez.email = "[email protected]"
# Optional: API key for higher rate limits (10 req/s instead of 3 req/s)
Entrez.api_key = "your_api_key_here"This skill provides comprehensive documentation organized by functionality area. When working on a task, consult the relevant reference documentation:
Reference: references/sequence_io.md
Use for:
Quick example:
from Bio import SeqIO
# Read sequences from FASTA file
for record in SeqIO.parse("sequences.fasta", "fasta"):
print(f"{record.id}: {len(record.seq)} bp")
# Convert GenBank to FASTA
SeqIO.convert("input.gb", "genbank", "output.fasta", "fasta")Reference: references/alignment.md
Use for:
Quick example:
from Bio import Align
# Pairwise alignment
aligner = Align.PairwiseAligner()
aligner.mode = 'global'
alignments = aligner.align("ACCGGT", "ACGGT")
print(alignments[0])Reference: references/databases.md
Use for:
Quick example:
from Bio import Entrez
Entrez.email = "[email protected]"
# Search PubMed
handle = Entrez.esearch(db="pubmed", term="biopython", retmax=10)
results = Entrez.read(handle)
handle.close()
print(f"Found {results['Count']} results")Reference: references/blast.md
Use for:
Quick example (the Bio.Blast API introduced in 1.84 — NCBI requires a contact email):
from Bio import Blast
Blast.email = "[email protected]"
result_stream = Blast.qblast("blastn", "nt", "ATCGATCGATCG")
blast_record = Blast.read(result_stream)
# Each hit's alignments are Bio.Align objects; scores live in .annotations
for hit in blast_record[:5]:
print(f"{hit.target.id}: E-value={hit[0].annotations['evalue']}")Reference: references/structure.md
Use for:
Quick example:
from Bio.PDB import PDBParser
# Parse structure
parser = PDBParser(QUIET=True)
structure = parser.get_structure("1crn", "1crn.pdb")
# Calculate distance between alpha carbons
chain = structure[0]["A"]
distance = chain[10]["CA"] - chain[20]["CA"]
print(f"Distance: {distance:.2f} Å")Reference: references/phylogenetics.md
Use for:
Quick example:
from Bio import Phylo
# Read and visualize tree
tree = Phylo.read("tree.nwk", "newick")
Phylo.draw_ascii(tree)
# Calculate distance
distance = tree.distance("Species_A", "Species_B")
print(f"Distance: {distance:.3f}")Reference: references/advanced.md
Use for:
Quick example:
from Bio.SeqUtils import gc_fraction, molecular_weight
from Bio.Seq import Seq
seq = Seq("ATCGATCGATCG")
print(f"GC content: {gc_fraction(seq):.2%}")
print(f"Molecular weight: {molecular_weight(seq, seq_type='DNA'):.2f} g/mol")When a user asks about a specific Biopython task:
Example search patterns for reference files:
# Find information about specific functions
grep -n "SeqIO.parse" references/sequence_io.md
# Find examples of specific tasks
grep -n "BLAST" references/blast.md
# Find information about specific concepts
grep -n "alignment" references/alignment.mdFollow these principles when writing Biopython code:
from Bio import SeqIO, Entrez
from Bio.Seq import Seq Entrez.email = "[email protected]" # Common formats: "fasta", "genbank", "fastq", "clustal", "phylip" with open("file.fasta") as handle:
records = SeqIO.parse(handle, "fasta") for record in SeqIO.parse("large_file.fasta", "fasta"):
# Process one record at a time try:
handle = Entrez.efetch(db="nucleotide", id=accession)
except HTTPError as e:
print(f"Error: {e}")from Bio import Entrez, SeqIO
Entrez.email = "[email protected]"
# Fetch sequence
handle = Entrez.efetch(db="nucleotide", id="EU490707", rettype="gb", retmode="text")
record = SeqIO.read(handle, "genbank")
handle.close()
print(f"Description: {record.description}")
print(f"Sequence length: {len(record.seq)}")from Bio import SeqIO
from Bio.SeqUtils import gc_fraction
for record in SeqIO.parse("sequences.fasta", "fasta"):
# Calculate statistics
gc = gc_fraction(record.seq)
length = len(record.seq)
# Find ORFs, translate, etc.
protein = record.seq.translate()
print(f"{record.id}: {length} bp, GC={gc:.2%}")from Bio import Blast, Entrez, SeqIO
Entrez.email = Blast.email = "[email protected]"
# Run BLAST (Bio.Blast API, Biopython >= 1.84)
result_stream = Blast.qblast("blastn", "nt", sequence)
blast_record = Blast.read(result_stream)
# Get top hit accessions (hit.target is a SeqRecord)
accessions = [hit.target.name for hit in blast_record[:5]]
# Fetch sequences
for acc in accessions:
handle = Entrez.efetch(db="nucleotide", id=acc, rettype="fasta", retmode="text")
record = SeqIO.read(handle, "fasta")
handle.close()
print(f">{record.description}")from Bio import AlignIO, Phylo
from Bio.Phylo.TreeConstruction import DistanceCalculator, DistanceTreeConstructor
# Read alignment
alignment = AlignIO.read("alignment.fasta", "fasta")
# Calculate distances
calculator = DistanceCalculator("identity")
dm = calculator.get_distance(alignment)
# Build tree
constructor = DistanceTreeConstructor()
tree = constructor.nj(dm)
# Visualize
Phylo.draw_ascii(tree)Solution: This is just a warning. Set Entrez.email to suppress it.
Solution: Check that IDs/accessions are valid and properly formatted.
Solution: Verify file format matches the specified format string.
Solution: Ensure sequences are aligned before using AlignIO or MultipleSeqAlignment.
Solution: Use local BLAST for large-scale searches, or cache results.
Solution: Use PDBParser(QUIET=True) to suppress warnings, or investigate structure quality.
To locate information in reference files, use these search patterns:
# Search for specific functions
grep -n "function_name" references/*.md
# Find examples of specific tasks
grep -n "example" references/sequence_io.md
# Find all occurrences of a module
grep -n "Bio.Seq" references/*.mdBiopython provides comprehensive tools for computational molecular biology. When using this skill:
references/ directoryThe modular reference documentation ensures detailed, searchable information for every major Biopython capability.
Part of the AlterLab Academic Skills suite.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.