Boltz Protein Design
OpenAIOfficialCreated by BoltzDistributed by OpenAI
- Skill
- Tool integration
- Science and research
- MIT
- Low risk
- Has scripts
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
This skill provides a structured workflow for designing new protein binders. It guides users through target normalization, binder specification selection, and campaign sizing. The process includes a mandatory cost estimation step and requires explicit user authorization before initiating any design run. It supports multiple design modalities, including curated antibody/nanobody scaffolds, structure-templated redesigns, and sequence-based generation.
What it does
- Designs de novo protein, peptide, antibody, and nanobody candidates.
- Supports target exploration for unknown or complex binding sites.
- Provides cost estimation for design campaigns based on target and binder parameters.
- Manages the submission and background download of generated design results.
- Ranks generated binders based on binding confidence and interaction metrics.
When to use it
- When you need to generate novel protein binders for a specific target.
- When you require antibody or nanobody candidates.
- When you have a well-characterized binding site and want to design directly.
- When you need to explore potential binding sites on a new or large target.
Advantages
- Integrates directly with the Boltz API for end-to-end design workflows.
- Enforces a mandatory spending gate to prevent unauthorized costs.
- Provides standardized ranking metrics for evaluating generated binder candidates.
- Supports flexible design specifications from curated scaffolds to custom motifs.
Usage examples
- “I need to design a nanobody for this target protein structure.”
- The agent will initiate the target exploration or direct design workflow, confirm the use of curated nanobody scaffolds, and guide you through cost estimation before submission.
- “Design a peptide binder for this specific epitope.”
- The agent will normalize the target, configure the peptide design parameters, and prepare the payload for cost estimation.
Install
Download the skill as a ZIP:
https://mp-staging.autogineer.com/agent-skills/openai/boltz-protein-design/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip boltz-protein-design.zip -d .agents/skills
Documentation by Boltz
Workflow
If boltz-api is missing from PATH, use boltz-cli-setup for install/update guidance before retrying.
If a command reports missing or expired authentication, use boltz-cli-setup to start boltz-api auth login --device-code before retrying; do not ask permission first.
If the agent host sandbox blocks boltz-api install/auth/API calls, use boltz-cli-setup to request the host sandbox bypass/escalation needed for user-wide CLI install, browser login, credential storage, temp files, or API access before retrying.
Use this skill when the user wants de novo protein / peptide / antibody / nanobody binders.
Decide on target exploration first (new targets). For a new target where the user hasn't already fixed the binding site and crop, your first action — before authoring a payload, normalizing the target, or running
estimate-cost— is to raise the choice between a target-exploration pass and designing directly, with a recommendation for this target:Unknown site, or a multi-domain / large target → recommend exploration (it scouts different input configurations for generation, ≈50 designs each, and finds the best before a full run).
A well-characterized site → it's fine to recommend going (mostly) direct, perhaps with a quick check of whether conditioning on the epitope beats letting the model find its own spot. State this plainly, as part of a conversation with the user about their target and goals, and let them choose.
Phrase it as a question that works with the user (they may know their target's biology), e.g.:
"This is a fresh target — I'd suggest a quick exploration pass that scouts a few framings and picks the best before a full run. Or, if you already know the site and crop, we can design directly. Which would you like?"
Do not mention a campaign size or tier here — not even folded into this opening approach question. The full-run size is settled later, after the scouting runs pick a winner (its yield informs the tier), so don't ask it up front when exploration is on the table. If the user opts into exploration — or has already said they want to explore / let the design find its own epitope — read references/target-exploration.md, follow it, then resume at step 8 with the chosen framing and recommended
num_proteins. If they want to design directly, continue below.Normalize the target (same shape as protein-screen):
structure_templateif a CIF/PDB is available, elseno_template.Pick the
binder_specificationvariant. Supported variants include:boltz_curated— recommended default for antibody and nanobody design. Boltz selects from maintained scaffold/template lists (binder: boltz_antibodyorboltz_nanobody).structure_template— redesign motifs in an existing binder scaffold (CIF +design_motifswithreplacement/insertionsegments).no_template— generate from the sequence DSL (fixed residues + designed segments like5..10or8).
For antibody or nanobody requests, ask before authoring the payload: "I recommend Boltz's curated antibody/nanobody scaffolds for this. Do you want the curated default, or do you have custom scaffold structures/CDR motifs to use?" If the user picks curated, use
type: boltz_curated; if they want custom scaffold control, usetype: structure_template.Pick
modality:peptide,antibody,nanobody, orcustom_proteinforstructure_templateandno_template(usecustom_proteinfor a "miniprotein" or generic "protein binder"). If the user already named the modality, take it as given — don't ask again. Do not includemodalityonboltz_curated; usebinderinstead.Pick
num_proteins— see Run sizing. Valid range is 10 to 1,000,000 (server rejects outside it); 10 is the hard floor but it is a test size, not a campaign. When the user has not given a count, propose a campaign tier (default 50,000), not the floor.Supported optional features include rules such as excluded amino acids, excluded sequence motifs with
Xwildcards, and max hydrophobic fraction. Addrulesonly on request; read references/api.md for exact shapes and examples.Author the payload YAML or JSON, then run
estimate-costand apply the spending gate (Always Do This) beforestart. (Cost model — tiered by total complex length,estimate-costis the only source: see## Costin api.md.)startto submit. Capture the ID.Launch
download-resultswith the agent runtime's background/non-blocking command facility. In Claude Code, use Bash withrun_in_background: true. In Codex, rundownload-resultsas a foreground shell command withyield_time_ms: 1000; if Codex returns asession_id, keep it for optional same-thread polling, but treatdownload-statusplus the run directory as the durable source of truth. In Codex app/desktop runtimes that expose same-thread heartbeat automations, create a heartbeat that checksdownload-statusperiodically and posts a concise completion or failure update when the download reaches a terminal state. After launching the downloader, always report the job ID, run name, and output directory. Include the next check cadence if the heartbeat was created; otherwise include thedownload-statuscommand.Rank from
<output-root>/<run-name>/results/index.jsonlbybinding_confidencedescending. Useiptmandmin_interaction_paeas tiebreakers.optimization_scoreis not emitted for this endpoint. Read references/results.md for output layout and metric details.
Run sizing
De novo design is a generate-and-filter campaign: you make many binders and keep the rare good ones, so a real run is large. Do not anchor on the num_proteins floor of 10 — that is only useful for a quick setup test. When the user names a count, honor it (≥10). When they do not, explain the tiers and propose one:
| Tier | num_proteins | When |
|---|---|---|
| Small screen | 20,000 | Quick look / tight budget |
| Medium (recommended) | 50,000 | Default for a real campaign |
| Large | 100,000 | Hard target / maximal coverage |
Present the tiers as design counts, not dollars: don't put a price next to a tier unless estimate-cost returned it — run estimate-cost on the tier the user leans toward and show that figure, and never extrapolate one estimate across the others. Then apply the spending gate (Always Do This) before submitting. If the setup is unproven, suggest a small test run (tens of designs) or the full target-exploration pass first.
Command Pattern
# Replace placeholders with concrete absolute paths before running.
# Use a short descriptive run name, for example: protein-design-<modality>-<target>-v1
boltz-api protein:design estimate-cost \
--input @yaml:///absolute/path/payload.yaml
boltz-api protein:design start \
--idempotency-key "<run-name>" \
--input @yaml:///absolute/path/payload.yaml \
--raw-output --transform id
# Copy the printed job ID into this command, then launch it in the agent
# runtime's background/non-blocking mode.
# Claude Code: Bash with run_in_background=true.
# Codex: foreground shell command with yield_time_ms=1000; keep the returned session_id if one is provided.
# Do not append "&" or use nohup in Codex.
boltz-api download-results \
--id "<job-id-from-start>" --name "<run-name>" \
--root-dir "/absolute/path/boltz-experiments" \
--poll-interval-seconds 60Payload keys are num_proteins, target, binder_specification — API body field names.
Always Do This
For a new target, your first move is the step-1 conversation — never jump straight to a payload. Establish what the binder is for and whether the user has already fixed the binding site/crop, then recommend a target-exploration pass vs. designing directly and let them choose (step 1). Only normalize the target and author a payload after that. If they've already fixed the site/crop or explicitly want to design directly, proceed.
Enforce
10 <= num_proteins <= 1,000,000before callingestimate-cost(server rejects outside that range), but 10 is the floor, not a campaign — see Run sizing and propose a tier (default 50,000) when the user gives no count.Spending gate — explicit go-ahead before every
start.startspends real money. A plan you already described, an earlier phase's approval, or a cost that looks "trivial" are not authorization — even a cheap run needs a fresh yes. Runestimate-cost, show theestimated_cost_usdit returns (summed for a batch), and wait for the user to say go. This holds even when tool calls are pre-approved (accept-edits / auto-accept / bypass modes) — there you are the only cost gate. Never quote or assume a dollar figure you didn't get fromestimate-cost(cost model:## Costin api.md).For antibody or nanobody design, recommend
binder_specification.type: boltz_curatedand ask the user to confirm they do not want custom scaffold/CDR control before building the payload. Usebinder: boltz_antibodyfor antibody/Fab requests andbinder: boltz_nanobodyfor nanobody/VHH requests.Residue indices are 0-based everywhere (
design_motifs.start_index/end_index,after_residue_index,epitope_residues,flexible_residues, bonds, constraints).For CIF/PDB bytes, use
@data:///abs/path/file.cifinsidestructure.data. Don't use bare@path.Sequence DSL for
designed_protein.value: uppercase letters = fixed residues; integerN= exactlyNdesigned residues;MIN..MAX= variable-length designed segment. Examples:"20","5..10","ACDE8GHI","MKTAYI5..10VKSHFSRQ".Keep payload field names exactly as the API body names shown in
references/api.md.Use absolute paths for the output root, payload files, and embedded target files. Do not
cdinto the run directory for follow-up commands; pass the same--root-dirand use absolute paths so later relative paths do not drift.Prefer one merged top-level payload via
--input @yaml:///absolute/path/payload.yamlor@json:///absolute/path/payload.jsonforestimate-costandstart. Keep--idempotency-keyand--workspace-idtop-level; if they also appear inside--input, the top-level flags win.Direct object flags still work as overrides, such as
--target @yaml:///absolute/path/target.yamlor--binder-specification @json:///absolute/path/binder.json. Piped YAML / JSON on stdin also works, but it must use API body field names. Use the same slug for both--idempotency-keyand--name.In permission-gated agents such as Claude Code, keep each Boltz call as a top-level command that starts with
boltz-api. Prefer concrete arguments oversh -c, inline environment assignments, aliases, wrapper scripts, loops, or pipelines around theboltz-apiinvocation unless the user already allowed that exact command form. Use--raw-output --transform id, read the printed ID, then paste that literal ID into the nextdownload-resultscommand.Prefer the agent runtime's background/non-blocking command mode for
download-results. In Codex specifically, keepdownload-resultsin the foreground and set the shell tool yield to 1000 ms; Codex will return asession_idif the command is still running. Do not append&or usenohupin Codex because the tool runner may clean up shell-backgrounded descendants before.boltz-run.jsonis fully written.After the background/session starts, do not manually wait on it or run ad hoc polling loops. Wall-clock time scales roughly with
num_proteins: under 100 often finishes in a few minutes, 100-1,000 may take several minutes to tens of minutes, and larger runs can take longer or hours depending on inputs and system load. Don't quote a fixed duration.--poll-interval-seconds 60is a sensible downloader default.download-resultsemits JSONL progress on stderr by default; add--progress-format text --verboseonly when you explicitly want human-readable logs.In Codex app/desktop runtimes with same-thread heartbeat automation support, schedule a heartbeat after launching
download-results. The heartbeat should runboltz-api --format json download-status --name "<run-name>" --root-dir "/absolute/path/boltz-experiments"and stop once terminal. Choose cadence bynum_proteins: under 100 -> every 1-2 minutes; 100-1,000 -> every 5 minutes; over 1,000 -> every 15 minutes. Post only material status changes or terminal completion/failure. Poll the savedsession_idwith an emptywrite_stdinonly for interactive, user-requested progress checks. Never run a manual poll loop in the current turn.If the current host has no heartbeat automation support, do not claim an automatic next check. Report the job ID, run name, output directory, and the command needed to check
download-status.If detached download needs to be restarted, re-run
boltz-api download-resultswith the same--name "<run-name>"and the same--root-dir.Only add
ruleson explicit user request.
Escape Hatch
Payload reference: https://api.boltz.bio/docs/api/resources/protein/subresources/design/methods/start/
CLI flag names:
boltz-api protein:design start --help
Read references/api.md for all binder_specification variants, motif shapes, sequence DSL, rules, modalities, and target variants. Read references/results.md after download when ranking designed binders or explaining outputs.
Outputs
Rank from results/index.jsonl after download-results; use references/results.md for local file layout, metric meanings, and the designed-binder entity type gotcha.
Files
- ATTRIBUTION.mdAdded by AutoGineer918 B
- LICENSELicence file added by AutoGineer1.0 KiB
- SKILL.md13.9 KiB
- agents/openai.yaml223 B
- references/api.md12.0 KiB
- references/results.md1.1 KiB
- references/target-exploration.md16.1 KiB
- scripts/_common.pyScript2.7 KiB
- scripts/analyze_results.pyScript2.4 KiB
- scripts/crop_radius.pyScript2.8 KiB
- scripts/detect_disorder.pyScript3.2 KiB
- scripts/requirements.txt227 B
- scripts/scan_sites.pyScript6.3 KiB
- scripts/terminus.pyScript1.6 KiB
references/api.md
Protein Design — Payload Reference
Covers the protein:design endpoint. Prefer a single merged top-level --input payload. Field names are API body field names.
Minimal CLI pattern:
boltz-api protein:design estimate-cost --input @yaml:///absolute/path/payload.yaml
boltz-api protein:design start --idempotency-key "<run-name>" --input @yaml:///absolute/path/payload.yaml --raw-output --transform idIn permission-gated agents, keep the submit command as a top-level boltz-api ... start invocation. Read the printed job ID from stdout and paste it into the later download-results command.
Keep --idempotency-key and --workspace-id top-level; if they also appear inside --input, the top-level flags win. Direct object flags still work as overrides, such as --target @yaml:///absolute/path/target.yaml or --binder-specification @json:///absolute/path/binder.json. Piped YAML / JSON on stdin remains supported when you need it, but the body must use API field names.
Contents
Top-level request
num_proteinsminimumCost
binder_specification— variant 1:boltz_curatedbinder_specification— variant 2:structure_templatebinder_specification— variant 3:no_templateSequence DSL (
designed_protein.value)rulestarget— variant 1:structure_templatetarget— variant 2:no_templatebondsandconstraintsshapesOutputs (after
download-results)Escape hatch
Top-level request
# payload.yaml
num_proteins: 10
target:
type: structure_template
structure:
type: base64
media_type: chemical/x-cif
data: "@data:///abs/path/target.cif"
chain_selection:
A:
chain_type: polymer
crop_residues: all
epitope_residues: [42, 43, 44]
binder_specification:
type: boltz_curated
binder: boltz_nanobody
rules:
max_hydrophobic_fraction: 0.5Top-level fields:
num_proteins(required) — number to generate. Must be between 10 and 1,000,000 (server rejects outside this range).target(required) — discriminated union:structure_templateorno_template. Identical shape to protein-screen.binder_specification(required) — discriminated union:boltz_curated,structure_template, orno_template. See below.
Also passed as separate start flags:
--idempotency-key <slug>--workspace-id <id>(admin keys only)
num_proteins minimum
Server rejects num_proteins < 10 or > 1000000 with VALIDATION_ERROR. Validate client-side before submitting.
Cost
Cost is tiered by total complex length (target crop + binder), not flat per design, and both the target crop and the designed binder count toward the length — so the tier is easy to misjudge. estimate-cost returns breakdown.{application, cost_per_unit_usd, num_units} — num_units equals num_proteins, and the complex-length effect rides in cost_per_unit_usd (small targets cost less per design, large ones materially more). It is the only source to use: quote estimated_cost_usd from it and never compute, estimate, or state a cost yourself.
binder_specification — variant 1: boltz_curated
Recommended default for antibody and nanobody design. Boltz chooses from maintained antibody/nanobody scaffold template lists during design. In the API docs this shape appears as BoltzCuratedBinderSpec on requests and BoltzCuratedBinderSpecResponse on retrieved run records. Before using it, ask the user to confirm they want the curated default rather than a custom scaffold with explicit CDR/motif control.
Use boltz_nanobody for nanobody/VHH requests and boltz_antibody for antibody/Fab requests. Do not include modality, entities, structure, or chain_selection in this variant.
binder_specification:
type: boltz_curated
binder: boltz_nanobody # or boltz_antibody
rules:
excluded_sequence_motifs: [NXS] # optional; only add rules on requestbinder_specification — variant 2: structure_template
Use when redesigning regions of an existing binder scaffold.
binder_specification:
type: structure_template
modality: peptide # or antibody | nanobody | custom_protein
structure:
type: url
url: "https://example.com/binder.cif"
chain_selection:
B:
chain_type: polymer
crop_residues: all # or [0, 1, 2, ...]
design_motifs:
- type: replacement
start_index: 0 # 0-based, inclusive
end_index: 5 # 0-based, **inclusive** — residues start_index..end_index are replaced
design_length_range:
min: 4
max: 8
rules:
excluded_amino_acids: [C, P]structure source variants
URL or base64 — same as target:
structure:
type: base64
media_type: chemical/x-cif
data: "@data:///abs/path/binder.cif" # prefer @data:// for local CIF/PDB byteschain_selection values
Polymer chain:
B:
chain_type: polymer
crop_residues: all # or [int, ...]
design_motifs: # see motif types below
- ...Ligand chain:
B:
chain_type: ligandMotif types
replacement
- type: replacement
start_index: 0 # 0-based, inclusive
end_index: 5 # 0-based, **inclusive**
design_length_range:
min: 4
max: 8Residues from start_index to end_index inclusive are replaced with a new designed segment. Example: on a 17-mer scaffold with start_index: 2, end_index: 15, residues 2..15 (14 residues) are redesigned and residues 0..1 + 16 stay fixed. Verify sequence length on a test output before committing to a template.
insertion
- type: insertion
after_residue_index: 12 # 0-based; use -1 to insert before residue 0
design_length_range:
min: 3
max: 6All residue indices are 0-based.
binder_specification — variant 3: no_template
Use when generating from sequence components + the DSL. For antibody or nanobody requests, prefer boltz_curated unless the user confirms they want direct sequence/scaffold control.
binder_specification:
type: no_template
modality: custom_protein # or peptide | antibody | nanobody
entities:
- type: designed_protein
chain_ids: [B]
value: "MKTAYI5..10VKSHFSRQ"
bonds: [] # optional
rules:
max_hydrophobic_fraction: 0.5Constraints:
At least one entity must be
type: designed_protein.modificationson fixedprotein/rna/dnaentities is optional (defaults to[]).designed_proteindoes NOT takemodifications.If
bondsreferences an atom in a designed protein chain, residue indices are counted against the minimum designed length for each DSL segment. Example: in1..3C1..2, the fixedCis residue index 1 (0-based) because the first designed segment uses its minimum length of 1.
Allowed entity types in binder_specification.entities (for no_template):
designed_protein— the sequence DSL targetprotein,rna,dna— fixed partnersligand_smiles,ligand_ccd— fixed cofactors
Sequence DSL (designed_protein.value)
Uppercase amino acid letters stay fixed.
Bare integer
Nmeans a designed segment of exactly lengthN.MIN..MAXmeans a designed segment with variable length fromMINtoMAX.
Examples:
"20"— generate a 20-residue designed sequence"5..10"— variable-length designed segment"ACDE8GHI"— fixedACDE, then 8 designed residues, then fixedGHI"MKTAYI5..10VKSHFSRQ"— fixed prefix and suffix with a variable-length designed middle
rules
Optional, applies to all binder_specification variants. Any of:
excluded_amino_acids: [<one-letter codes>]— never emit these residues in designed positions.excluded_sequence_motifs: [<motif strings>]— reject designs containing these patterns. UseXas a single-position wildcard (e.g."XPX").max_hydrophobic_fraction: <float>— cap hydrophobic content in designed regions.
target — variant 1: structure_template
target:
type: structure_template
structure:
type: url
url: "https://example.com/target.cif"
chain_selection:
A:
chain_type: polymer
crop_residues: all # or [int, ...]
epitope_residues: [42, 43, 44] # optional; subset of crop_residues
flexible_residues: [40, 41, 42] # optional; subset of crop_residues
non_binding_residues: [50, 51] # optional; subset of crop_residues, must NOT overlap epitope_residuesSame semantics as protein-screen: epitope_residues / flexible_residues must be subsets of crop_residues, all 0-based.
target — variant 2: no_template
target:
type: no_template
entities:
- type: protein
chain_ids: [A]
value: "MKTAYIAKQRQISFVKSHFSRQ"
epitope_residues:
A: [42, 43, 44] # optional; 0-based
non_binding_residues:
A: [50, 51] # optional; 0-based; must NOT overlap epitope_residues
epitope_ligand_chains: [L] # optional
bonds: [] # optional
constraints: [] # optionalOptional fields: epitope_residues, non_binding_residues (residues where binder contact is discouraged — 0-based, within crop_residues, must not overlap epitope_residues), epitope_ligand_chains, bonds, constraints.
bonds and constraints shapes
Same as the structure-and-binding skill — see references/api.md of that skill for full detail. Only include when the user explicitly asks for geometry constraints.
Outputs (after download-results)
Under <output-root>/<run-name>/:
.boltz-run.jsonrun.json— sanitized remote run recordresults/index.jsonl— one generated design per line, copied from list-results metadata plus local artifact pathsresults/<pres_*>/metadata.json— per-result metadata copied from the list-results recordresults/<pres_*>/archive.tar.gz— one dir per generated designresults/<pres_*>/files/result/{metrics.json, <result-id>_predicted.cif, pae.npz}(the CIF is named<pres_*>_predicted.cif— prefer thepaths.structurefield fromindex.jsonlover hard-coding the filename)
Per-result fields (available in results/index.jsonl, results/<pres_*>/metadata.json, and the list-results stream):
id— server-assignedpres_*IDentities— generated designs. Type-flip gotcha: the binder entity comes back astype: "protein"(not"designed_protein"), with the DSL resolved to a real AA sequence invalue. Select the binder bychain_ids(the ID assigned at submit time), not bytype == "designed_protein"— the latter match returns zero results.metrics.binding_confidence— primary ranking metricmetrics.structure_confidencemetrics.iptm(higher is better)metrics.min_interaction_pae(lower is better)metrics.helix_fraction,metrics.sheet_fraction,metrics.loop_fractionartifacts.structure.url,artifacts.archive.url(presigned, short-lived)warnings— optional array of{code, message}quality flags (e.g.low_confidence,unusual_geometry); empty or absent on clean results. Surface them when presenting top designs.
optimization_score is not emitted for protein:design. Sorting by it yields an empty list.
Rank from results/index.jsonl after download-results by binding_confidence descending. Use iptm (higher better) and min_interaction_pae (lower better) as tiebreakers.
Escape hatch
https://api.boltz.bio/docs/api/resources/protein/subresources/design/methods/start/
boltz-api protein:design start --help
Requirements and compatibility
Written for: OpenAI Codex
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Needs Python
Security
What our scanner noticed· Low risk
- Instructions that use the network
- Scripts that your agent may run
This skill includes scripts that your agent may run. Read them before you use it.
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Created by
- Boltz
- Publisher
- OpenAI (Official)
- Distributed by
- OpenAI
- Source
- openai/plugins · plugins/boltz-api-cli/skills/boltz-protein-design · commit d420d13
- Licence
- MIT License (redistribution allowed)
- LICENSE (added by AutoGineer from plugins/boltz-api-cli/LICENSE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by Boltz or OpenAI.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download boltz-protein-design.zip