Skip to content
Back to skills

By Database

ASecurity

Use the BY MCP database tools to query PDB, UniProt, and SAbDab for target characterization, antibody scaffold selection, and competition analysis. ---

  • 117 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added October 16, 2026
ai-agentspythongobashapidatabasedocumentation

Works with

  • cli
  • api
  • mcp

Security analysis

A92/100
  • mediumInstalls packages at runtime which could introduce malicious dependencies

Pro scans all 6 files and shows the line behind each finding

Scanned October 16, 2026

npx -y skills add 001TMF/blatant-why --skill by-database --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of By Database?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for By Database
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/001tmf-by-database/badge)](https://www.skillsdirectory.com/skills/001tmf-by-database)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
id: "skill_7b1465f73e1a4c5c9cd7591d123dac91"
name: "by-database"
display-name: "BY Database Queries (PDB / UniProt / SAbDab)"
short-description: "Query the BY MCP database servers (PDB, UniProt, SAbDab) for target characterization, antibody scaffold selection, and competition analysis. Use when you need structural metadata, sequence/domain annotations, or known antibody-antigen complexes for a target."
category: "research"
keywords: "PDB, RCSB, UniProt, SAbDab, antibody database, structure lookup, interface residues, CDR sequences, hotspot, scaffold selection"
version: "1.0"
last-updated: "2026-05-20"
mcp_tools: [
  "mcp__by-pdb__pdb_search",
  "mcp__by-pdb__pdb_fetch_structure",
  "mcp__by-pdb__pdb_get_chains",
  "mcp__by-pdb__pdb_interface_residues",
  "mcp__by-pdb__pdb_download",
  "mcp__by-uniprot__uniprot_search",
  "mcp__by-uniprot__uniprot_fetch_protein",
  "mcp__by-uniprot__uniprot_get_domains",
  "mcp__by-uniprot__uniprot_get_variants",
  "mcp__by-sabdab__sabdab_search_antibodies",
  "mcp__by-sabdab__sabdab_get_structure",
  "mcp__by-sabdab__sabdab_cdr_sequences",
  "mcp__by-sabdab__sabdab_search_by_antigen"
]
---

# Skill: by-database

Use the BY MCP database tools to query PDB, UniProt, and SAbDab for target
characterization, antibody scaffold selection, and competition analysis.

---

## When to Use This Skill

Use this skill when you need:

- ✅ Structural metadata for a target (resolution, method, organism, chains)
- ✅ Interface residue lists for hotspot selection in PXDesign / BoltzGen
- ✅ Canonical UniProt sequence, domain boundaries, or known variants
- ✅ Existing antibody-antigen complexes for scaffold selection or competition analysis
- ✅ Cross-referencing PDB residue numbering with UniProt positions
- ✅ Verifying chain composition before generating a design spec

**Don't use this skill for:**

- ❌ Full target research narrative or literature review → use `by-research`
- ❌ Epitope hotspot scoring or surface analysis → use `by-epitope-analysis`
- ❌ Scoring designs (ipSAE, ipTM, liabilities) → use `by-scoring` / `by-screening`
- ❌ Web search or PubMed lookups → fall back to PubMed/bioRxiv tools then WebSearch
- ❌ Submitting compute jobs → use `boltzgen`, `pxdesign`, `protenix` skills

---

## Quick Start

Look up a target end-to-end in three calls:

```text
mcp__by-pdb__pdb_search(query="PD-L1", max_results=10)
mcp__by-uniprot__uniprot_search(query="CD274 human", max_results=5)
mcp__by-sabdab__sabdab_search_by_antigen(antigen_name="PD-L1", max_results=20)
```

For batch enrichment of a known list of PDB IDs without an MCP loop:

```bash
python scripts/batch_pdb_lookup.py --ids 7S4S 6XWG 5JDS --out enriched.csv
```

✅ **VERIFICATION:** Expect `✓ batch_pdb_lookup completed: 3 rows -> enriched.csv`.

---

## Inputs

**Required (at least one of):**

- **PDB ID** — 4-character RCSB identifier (e.g. `7S4S`). Source: `mcp__by-pdb__pdb_search`.
- **UniProt accession** — e.g. `Q9NZQ7`. Source: `mcp__by-uniprot__uniprot_search`.
- **Target name / gene symbol** — e.g. `"PD-L1"`, `"CD274"`. Used as free-text query.
- **Antigen name** — for SAbDab antibody lookups (e.g. `"HER2"`).

**Optional:**

- **Chain IDs** — author chain IDs from `mcp__by-pdb__pdb_get_chains` (e.g. `A`, `H`, `L`).
- **Distance cutoff** — Angstroms for interface analysis (default 5.0; 4.0 strict, 6.0 extended).
- **Species filter** — for SAbDab queries (e.g. `"HOMO SAPIENS"`).
- **Output directory** — for `mcp__by-pdb__pdb_download`.

See [references/pdb-quality-metrics.md](references/pdb-quality-metrics.md) for
resolution and completeness thresholds.

---

## Outputs

All MCP tools return JSON strings. Parse before display — never show raw JSON to the user.

**PDB tool outputs:**

- `pdb_search` → list of `{pdb_id, title, method, resolution, release_date}`.
- `pdb_fetch_structure` → object with `polymer_entity_count`, `organism`, plus the search fields.
- `pdb_get_chains` → list of `{chain_id, entity_id, molecule_name, sequence, length}`.
- `pdb_interface_residues` → `{chain1_residues:[{resname,resseq}], chain2_residues:[...], contact_count}`.
- `pdb_download` → `{path, size_bytes}`. Files are CIF (preferred) or PDB.

**UniProt tool outputs:**

- `uniprot_search` → list of `{accession, name, organism, gene_name, length, reviewed}`.
- `uniprot_fetch_protein` → full record incl. `sequence`, `function_description`, `subcellular_location`.
- `uniprot_get_domains` → list of `{type, description, start, end}`.
- `uniprot_get_variants` → list of `{type, position, original, variation, description}`.

**SAbDab tool outputs:**

- `sabdab_search_antibodies` / `sabdab_search_by_antigen` → list of antibody PDB records.
- `sabdab_get_structure` → detailed record incl. `r_free`, `cdr_lengths`, `chain_pairings`.
- `sabdab_cdr_sequences` → `{H1, H2, H3, L1, L2, L3}` with `{sequence, length}` each.

**Script outputs (this skill's `scripts/`):**

- `batch_pdb_lookup.py` → CSV with one row per PDB ID (resolution, organism, chain count, ligands).
- `find_similar_targets.py` → CSV with related UniProt/PDB entries ranked by % sequence identity.

---

## Clarification Questions

**⚠️ CRITICAL: ASK THIS FIRST.** Confirm the user actually has identifiers in hand.

1. **Identifiers** (ASK THIS FIRST):
   - Do you have a PDB ID, UniProt accession, gene symbol, or just a target name?
   - If only a target name, we will start with `mcp__by-pdb__pdb_search` and
     `mcp__by-uniprot__uniprot_search` to resolve canonical IDs.

2. **Organism:**
   - Human, mouse, viral, other?
   - Determines which UniProt entry is canonical and which PDB structures are relevant.

3. **Modality intent (drives SAbDab usage):**
   - Antibody (Fab/IgG), nanobody (VHH), or non-antibody binder?
   - Nanobody designs need templates with `light_chain = ""`. Fabs need both H and L.

4. **Resolution threshold:**
   - Default ≤2.5 Å for X-ray. Cryo-EM may go to 3.0–3.5 Å.
   - Lower the bar for novel targets where nothing better exists.

5. **Bound vs apo state:**
   - For interface analysis you need holo (bound) structures.
   - Apo structures are fine for general topology but miss the binding interface.

6. **Downstream tool:**
   - PXDesign (de novo binder), BoltzGen (antibody/nanobody), or Protenix (refold only)?
   - This affects which fields you must extract (e.g. hotspot range notation vs. CDR lengths).

7. **Cross-reference need:**
   - Do you need PDB→UniProt numbering reconciliation?
   - Required when reporting hotspot positions across data sources.

---

## Standard Workflow

🚨 **MANDATORY: USE MCP TOOLS AS THE PRIMARY DATA PATH** 🚨

Do not WebSearch for data that exists in PDB, UniProt, or SAbDab. Batch your MCP
calls and present one consolidated summary — never expose raw JSON.

### Target Characterization (PDB-first)

1. `mcp__by-pdb__pdb_search(query="<target>")` — find available structures.
2. `mcp__by-pdb__pdb_fetch_structure(pdb_id="<top>")` — compare resolution + method.
3. `mcp__by-pdb__pdb_get_chains(pdb_id="<top>")` — identify target chain vs. binder vs. ligands.
4. `mcp__by-uniprot__uniprot_search(query="<gene> <organism>")` then
   `mcp__by-uniprot__uniprot_fetch_protein` — sequence, function, location.
5. `mcp__by-uniprot__uniprot_get_domains(accession=...)` — domain boundaries.
6. `mcp__by-pdb__pdb_interface_residues(pdb_id=..., chain1=..., chain2=...)` — epitope residues.
7. `mcp__by-uniprot__uniprot_get_variants(accession=...)` — flag polymorphic hotspots.
8. `mcp__by-pdb__pdb_download(pdb_id=..., format="cif")` — local file for BY design tools.

### Antibody Scaffold Selection (SAbDab-first)

1. `mcp__by-sabdab__sabdab_search_by_antigen(antigen_name="<target>")` — known antibodies.
2. `mcp__by-sabdab__sabdab_get_structure(pdb_id="<top>")` — resolution, species, subclass, CDR lengths.
3. `mcp__by-sabdab__sabdab_cdr_sequences(pdb_id="<top>")` — CDR architectures.
4. Match CDRH3 length to target depth (10–15 standard, 15–20+ deep pockets, 8–10 flat).
5. Pick a high-resolution human (or humanized) scaffold.
6. `mcp__by-pdb__pdb_fetch_structure(pdb_id="<scaffold>")` — final quality check.

### Competition Analysis

1. `mcp__by-sabdab__sabdab_search_by_antigen` — all known antibodies.
2. `mcp__by-pdb__pdb_search` — non-antibody binders too.
3. `mcp__by-pdb__pdb_interface_residues` on each competitor — map epitopes.
4. Compare interface residues across binders → conserved hotspots vs. novel epitope opportunities.
5. `mcp__by-uniprot__uniprot_get_variants` — does any escape mutation hit competitor sites?

### Batch Lookups (use scripts)

For >5 PDB IDs or >5 UniProt accessions, prefer the scripts in this skill — they
deduplicate, retry on transient errors, and emit a single CSV instead of N JSON blobs:

```bash
python scripts/batch_pdb_lookup.py --ids 7S4S 6XWG 5JDS 4HHB --out targets.csv
python scripts/find_similar_targets.py --uniprot P01375 --max-hits 25 --out homologs.csv
```

✅ **VERIFICATION:** Each script prints `✓ <name> completed: N rows -> <path>`.

---

## When Scripts Fail

Hierarchy (apply in order):

1. **Fix and retry (90%)** — Install missing dep (`pip install httpx biopython`),
   then re-run with the same args.
2. **Modify script (5%)** — Edit the local script file (e.g. tighten resolution
   filter, change e-value threshold for BLAST).
3. **Use as reference (4%)** — Read the script and call the MCP tools manually
   for one-off cases.
4. **Write from scratch (1%)** — Only if the underlying RCSB / UniProt / SAbDab
   API has changed in a way that breaks the script. Document why.

Decision tree:
- HTTP 429 / rate limit → step 1 (the script retries with backoff; re-run).
- Missing `httpx` / `biopython` → step 1 (`pip install`).
- Wrong output columns → step 2 (modify script).
- Tool unavailable in environment → step 3 (MCP fallback).
- API schema changed upstream → step 4 (rewrite + report).

---

## Decision Points

### When to prefer X-ray vs. cryo-EM

See [references/pdb-quality-metrics.md](references/pdb-quality-metrics.md). Short
form: X-ray ≤2.5 Å for interface work; cryo-EM acceptable to ~3.0 Å for large
complexes where X-ray is impossible.

### Holo vs. apo selection

For interface residues you MUST use a holo (bound) structure. Apo can confirm
domain architecture but contact residues will be missing or rearranged.

### Reviewed vs. unreviewed UniProt

Always prefer reviewed (Swiss-Prot). Unreviewed (TrEMBL) entries may lack
domain, variant, and function annotations. See
[references/uniprot-fields.md](references/uniprot-fields.md).

### Antigen-deposited vs. validated SAbDab entries

SAbDab indexes the PDB; presence in SAbDab does NOT mean affinity has been
independently validated. See [references/sabdab-best-practices.md](references/sabdab-best-practices.md).

---

## Common Issues

| Issue | Possible Cause | Solution | Details |
|-------|----------------|----------|---------|
| `pdb_search` returns empty list | Target name doesn't match any title or keyword | Try gene symbol, organism, or UniProt accession via `uniprot_search` first | [references/pdb-quality-metrics.md](references/pdb-quality-metrics.md) |
| `pdb_interface_residues` errors `Chain not found` | Wrong chain ID (case, label vs. auth) | Run `pdb_get_chains` first; use the exact `chain_id` field returned | [references/pdb-quality-metrics.md](references/pdb-quality-metrics.md) |
| Interface residue count is zero | `distance_cutoff` too strict, or apo structure | Increase cutoff to 6.0 Å; switch to a holo PDB ID | [references/pdb-quality-metrics.md](references/pdb-quality-metrics.md) |
| Resolution shows `null` | Cryo-EM entry without combined resolution, or NMR | Check `method`; for NMR resolution is not defined; report ensemble size instead | [references/pdb-quality-metrics.md](references/pdb-quality-metrics.md) |
| `uniprot_fetch_protein` returns sparse fields | Unreviewed (TrEMBL) entry | Search with `reviewed:true` or pick the canonical Swiss-Prot accession | [references/uniprot-fields.md](references/uniprot-fields.md) |
| Wrong isoform sequence | Default canonical does not match construct | Inspect isoforms; choose the one matching your PDB chain length | [references/uniprot-fields.md](references/uniprot-fields.md) |
| PDB resseq does not match UniProt position | Construct tags, truncations, or signal peptide cleavage | Align PDB chain sequence to UniProt; offset = first matched residue | [references/uniprot-fields.md](references/uniprot-fields.md) |
| SAbDab keyword search is slow | Tool downloads full DB (~8 MB) then filters | Use PDB-code lookups when possible; cache results between calls | [references/sabdab-best-practices.md](references/sabdab-best-practices.md) |
| `sabdab_search_by_antigen` returns zero hits | No deposited antibody co-crystals | Fall back to `pdb_search` for non-antibody binders; consider homolog targets | [references/sabdab-best-practices.md](references/sabdab-best-practices.md) |
| CDRH3 length mismatch with target depth | Picked the wrong scaffold | Match CDRH3 within ±2 residues (10–15 standard, 15–20 deep pockets, 8–10 flat) | [references/sabdab-best-practices.md](references/sabdab-best-practices.md) |
| `batch_pdb_lookup.py` reports `httpx` missing | Dependency not installed | `pip install httpx` and re-run | See script header |
| `find_similar_targets.py` BLAST returns 503 | UniProt REST BLAST is rate-limited | Re-run after 30 s; script applies exponential backoff automatically | See script header |
| Antibody scaffold has light_chain but you want VHH | Picked a Fab template by mistake | Filter SAbDab results where `light_chain == ""` | [references/sabdab-best-practices.md](references/sabdab-best-practices.md) |
| Engineered / chimeric SAbDab record | Scaffold is not natively the listed species | Check `engineered` field; prefer fully natural human / camelid scaffolds for therapeutics | [references/sabdab-best-practices.md](references/sabdab-best-practices.md) |

---

## Best Practices

1. 🚨 **CRITICAL:** Always resolve identifiers via search before assuming an accession or PDB ID exists.
2. ✅ Prefer reviewed (Swiss-Prot) UniProt entries.
3. ✅ Prefer X-ray ≤2.5 Å, holo (bound) structures for interface analysis.
4. ✅ Always run `pdb_get_chains` before `pdb_interface_residues` so chain IDs are exact.
5. ✅ Cross-reference PDB residue numbers (`resseq`) with UniProt positions by sequence alignment.
6. ✅ Match CDRH3 length to target topology; do not blindly default to a popular scaffold.
7. ✅ Use mmCIF (`format="cif"`) — handles large structures and multi-character chain IDs.
8. ❌ DON'T expose raw MCP JSON to the user; summarize into tables.
9. ❌ DON'T WebSearch when an MCP database tool can answer the question.
10. ✨ Batch >5 identifier lookups through `scripts/batch_pdb_lookup.py` instead of looped MCP calls.

---

## Suggested Next Steps

After running this skill, hand off to one of:

- **`by-research`** — when you need a synthesized target dossier with literature
  triangulation, critique, and design recommendation. This skill is the data
  layer underneath `by-research` Phase 3.
- **`by-epitope-analysis`** — once you have interface residues, score epitope
  drugability and select hotspots for design.
- **`by-scoring`** / **`by-screening`** — when you already have designs and
  need to evaluate ipSAE, ipTM, and liabilities.
- **`boltzgen`** — once a target chain, hotspot range, and scaffold candidates
  are confirmed, hand off CDR templates and the holo PDB to BoltzGen.
- **`pxdesign`** — for non-antibody binders, hand off the holo CIF and hotspot
  range notation to PXDesign.

Why this chaining works: database lookups are the deterministic, citation-grade
input layer. Downstream skills assume the data is already canonical (correct
accession, correct chain IDs, correct residue numbering). Skipping this skill is
the single biggest cause of failed campaigns.

---

## Related Skills

**Upstream:**
- `by-session` — environment + config check before any database work.

**Downstream:**
- `by-research` — full research dossier with literature.
- `by-epitope-analysis` — hotspot scoring from interface residues.
- `boltzgen`, `pxdesign`, `protenix` — design and refold using the PDB/CIF you fetched.

**Alternative / Complementary:**
- `by-knowledge` — query the project knowledge graph for prior campaigns on the same target.

---

## References

**Detailed documentation:**

- [references/pdb-quality-metrics.md](references/pdb-quality-metrics.md) —
  Resolution thresholds, holo vs. apo, organism filtering, missing residues,
  structural completeness; X-ray vs. cryo-EM selection.
- [references/uniprot-fields.md](references/uniprot-fields.md) — Important
  UniProt fields for design (sequence, domains, PTMs, isoforms, species) and
  efficient query patterns.
- [references/sabdab-best-practices.md](references/sabdab-best-practices.md) —
  Antibody database queries (by target, germline, affinity) and the
  deposited-vs-validated caveat.

**Scripts:**

- [scripts/batch_pdb_lookup.py](scripts/batch_pdb_lookup.py) — CLI that reads
  a list of PDB IDs and writes an enriched CSV (resolution, method, organism,
  chain count, ligands).
- [scripts/find_similar_targets.py](scripts/find_similar_targets.py) — CLI that
  takes a UniProt accession or PDB ID and returns a ranked list of related
  entries by sequence identity.

**Official documentation:**

- RCSB Data API — https://data.rcsb.org/
- RCSB Search API — https://search.rcsb.org/
- UniProt REST — https://www.uniprot.org/help/api
- SAbDab — https://opig.stats.ox.ac.uk/webapps/sabdab-sabpred/sabdab

**Identifier quick reference:**

| Database | Identifier | Example | Source |
|----------|-----------|---------|--------|
| PDB | 4-char ID | 7S4S | `mcp__by-pdb__pdb_search` |
| UniProt | Accession | Q9NZQ7 | `mcp__by-uniprot__uniprot_search` |
| SAbDab | PDB ID | 1ahw | `mcp__by-sabdab__sabdab_search_antibodies` |
| Chain | Auth chain ID | A, B, H, L | `mcp__by-pdb__pdb_get_chains` |
| Residue | resseq (int) | 115 | `mcp__by-pdb__pdb_interface_residues` |

Files in this skill

  • SKILL.md17.8 KB
  • references/pdb-quality-metrics.md5.9 KB
  • references/sabdab-best-practices.md7.7 KB
  • references/uniprot-fields.md7.5 KB
  • scripts/batch_pdb_lookup.py7.8 KB
  • scripts/find_similar_targets.py12.4 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.