{"server":"com.seqbench/workbench","count":100,"tools":[{"name":"alphafold_lookup","title":"Look up an AlphaFold structure prediction","description":"Look up a UniProt accession in the AlphaFold Protein Structure Database (CC-BY 4.0). Returns confidence, model version and structure file URLs, or {found:false} when no prediction exists for that accession.","input_schema":{"type":"object","required":["accession"],"properties":{"accession":{"type":"string","description":"UniProt accession, e.g. \"P04637\"."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Look up an AlphaFold structure prediction","readOnlyHint":true,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"annealing_temperature","title":"Annealing temperature by polymerase","description":"Annealing temperature and a full cycling program for a primer PAIR, under the rule the polymerase's own vendor publishes — which is not one rule, and is only defined against the vendor's own Tm. For NEB products the Tm is computed exactly as NEB's Tm calculator computes it (SantaLucia 1998 nearest-neighbor with NEB's salt correction, at that product's own buffer and primer concentration — the same primer's Tm moves ~10 °C between NEB buffers) and NEB's calculator rule is applied to it: Q5 at Tm + 1, Phusion at 0.93 × Tm + 7.5 (both ABOVE the Tm), Taq/OneTaq/LongAmp at Tm − 5, Vent/Deep Vent at Tm − 2 above 20 nt, with NEB's ceilings. Toyobo KOD One is Tm − 5 at the salt and oligo concentration its manual names, Takara PrimeSTAR Max a FIXED 55 °C the primer Tm plays no part in (its own 2(A+T)+4(G+C)−5 sets only the annealing time), and a generic Taq/Pfu row applies the Tm − 3 to − 5 rule of thumb to a default-condition nearest-neighbor Tm. Returns denaturation/annealing/extension steps, cycle count, magnesium guidance, the Tm basis and vendor document behind each figure, and the same primers under every other polymerase in the table for comparison.","input_schema":{"type":"object","required":["forwardPrimer","reversePrimer","polymerase"],"properties":{"ampliconBp":{"type":"integer","description":"Expected product length (bp), used for the extension time. Omit to get the per-kb rate without a time."},"polymerase":{"type":"string","description":"Polymerase or master mix. One of: q5, phusion, neb_taq, onetaq, vent, deepvent, longamp, primestar_max, kod_one, taq, pfu. Common product spellings are accepted (e.g. \"Q5 Hot Start\", \"KOD One\", \"PrimeSTAR Max\")."},"forwardPrimer":{"type":"string","residues":"nt","description":"Forward primer, 5'→3'."},"reversePrimer":{"type":"string","residues":"nt","description":"Reverse primer, 5'→3'."},"highComplexityTemplate":{"type":"boolean","default":false,"description":"Genomic or otherwise complex template. Where the vendor publishes a second, slower extension rate for one, it is used."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Annealing temperature by polymerase","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"aso_design","title":"ASO Gapmer Designer","description":"Design antisense-oligonucleotide (ASO) gapmers against an mRNA target: scans candidate sites, builds the antisense oligo in the standard 5-10-5 architecture (chemically-modified wings, central DNA gap for RNase H1, phosphorothioate backbone), and screens each for known liabilities (G-quadruplex motifs, CpG immunostimulation, self-complementarity, GC extremes). No transcriptome-wide off-target search.","input_schema":{"type":"object","required":["target"],"properties":{"wing":{"type":"integer","default":5,"minimum":0,"description":"Modified-wing length on each side (nt); the central gap = length − 2×wing, so 2×wing must be less than length."},"length":{"type":"integer","default":20,"maximum":50,"minimum":8,"description":"Total gapmer length (nt). A real RNase H1 gapmer is 12-25."},"target":{"type":"string","residues":"nt","description":"Nucleotide sequence (raw or FASTA; IUPAC accepted)."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"ASO Gapmer Designer","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"assembly_outcomes","title":"Assembly outcomes (what else you might have built)","description":"Enumerate the specific wrong plasmids a multi-part Golden Gate or Gibson assembly can produce — a part dropped, inverted, duplicated, two parts swapped, the backbone self-circularized — as full sequences, ranked by how few independent mis-ligations each needs. Golden Gate outcomes are annotated with the MEASURED overhang cross-talk they would have to exploit (Potapov/Pryor ligation data). Feed the result to diagnostic_digest to pick a screening enzyme. Reports no probability per outcome: the ligation data does not measure transformation or vector background.","input_schema":{"type":"object","required":["fragments"],"properties":{"names":{"type":"array","items":{"type":"string"},"description":"Optional labels for the parts, in the same order (\"backbone\", \"promoter\", \"CDS\"). Used in every outcome label."},"enzyme":{"type":"string","default":"BsaI","description":"Golden Gate only — the Type IIS enzyme, which fixes the overhang length (BsaI, BbsI, Esp3I (BsmBI))."},"method":{"enum":["goldengate","gibson"],"type":"string","default":"goldengate","description":"How the parts are joined. Golden Gate junctions are the Type IIS fusion overhangs; Gibson junctions are the homology arms."},"dataset":{"enum":["generic-t4-37c-1h","bsai-hfv2"],"type":"string","default":"generic-t4-37c-1h","description":"Which ligation dataset to read overhang cross-talk from (Golden Gate only)."},"circular":{"type":"boolean","default":true,"description":"Circular product. Only circular assemblies are covered — a linear product's leading end is a free terminus, not a junction."},"fragments":{"type":"array","items":{"type":"string"},"description":"The parts in assembly order, raw or FASTA — the same list cloning_simulate takes. 2-8 parts."},"overlapLen":{"type":"number","default":20,"description":"Gibson only — homology arm length, which must match what the assembly was designed with."},"maxAlternatives":{"type":"number","default":12,"description":"Cap on returned alternatives, most accessible first. The pre-cap count is always reported as alternativesEnumerated."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Assembly outcomes (what else you might have built)","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"band_traceback","title":"Band traceback (where the extra band came from)","description":"Explain a band you measured on a gel. Given the template, both primers and the observed size, it enumerates every pair of priming sites — including a single primer priming both strands — that would give a product that size, and ranks them by how much of each primer's 3' end matches without interruption, which is what decides whether a mispriming event can extend at all. Reports no yield and assigns no share of the band: the band is the input, not the output. Says plainly when nothing on this template explains the size, and what that points to instead.","input_schema":{"type":"object","required":["template","forwardPrimer","reversePrimer","observedSize"],"properties":{"circular":{"type":"boolean","default":false,"description":"Template is circular (a plasmid)."},"template":{"type":"string","residues":"nt","description":"The template you amplified, raw or FASTA. Max 200,000 bp."},"toleranceBp":{"type":"number","description":"Override the tolerance with a fixed window in bp."},"observedSize":{"type":"number","description":"The band size you measured off the gel, in bp."},"forwardPrimer":{"type":"string","residues":"nt","description":"Forward primer, 5'→3'."},"maxCandidates":{"type":"integer","default":40,"description":"Cap on returned candidates, best-anchored first."},"maxMismatches":{"type":"integer","default":3,"description":"Mismatches tolerated per primer while looking for sites (max 6). Higher finds more explanations and more coincidences."},"reversePrimer":{"type":"string","residues":"nt","description":"Reverse primer, 5'→3'."},"tolerancePercent":{"type":"number","default":10,"description":"How far off the size read may be, as a percentage. A percentage rather than a fixed number of bases because ±10% of 200 bp is not the same reading precision as ±10% of 5 kb."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Band traceback (where the extra band came from)","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"barcode_audit","title":"Measure a set of barcodes you already have","description":"Take a set of barcodes and report the minimum edit distance in it, which pairs sit at that distance, any duplicates, the GC range and the longest homopolymer. The pairs are the point: 'minimum distance 2' is a number, and 'these two barcodes are one substitution apart' is something to fix. Use before committing a pool you inherited or assembled by hand — a single close pair makes two constructs indistinguishable in the data and nothing downstream can detect it.","input_schema":{"type":"object","required":["barcodes"],"properties":{"metric":{"enum":["levenshtein","hamming"],"type":"string","default":"levenshtein","description":"'levenshtein' counts substitutions, insertions and deletions — the right choice for nanopore or PacBio, and the safe default. 'hamming' counts substitutions only, which is faster and adequate when the platform's errors are substitutions (Illumina), but gives NO protection against an indel shifting one barcode into another."},"barcodes":{"type":"string","description":"The barcodes, as FASTA, one per line, or comma-separated. Max 1,000, because every pair is compared."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Measure a set of barcodes you already have","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"barcode_design","title":"Design a set of sequencing barcodes","description":"Build a set of DNA barcodes that are pairwise at least a chosen edit distance apart, so a read error cannot turn one barcode in the pool into another. Honours a GC window, a homopolymer cap and excluded motifs (the restriction sites you clone with) during the search rather than filtering afterwards, and can extend a set you already have rather than replacing it. Reports the distance ACHIEVED — re-derived over the finished pool, not assumed from the search — plus how many read errors that distance lets you correct and detect. Deterministic given a seed. Returns fewer barcodes than asked, with a reason, when the constraints leave no room.","input_schema":{"type":"object","required":[],"properties":{"seed":{"type":"integer","default":1,"description":"Seeds the search. Change it for a different set from the same constraints; keep it to reproduce one."},"count":{"type":"integer","default":96,"maximum":1000,"minimum":1,"description":"How many barcodes to design (max 1000). A plate is 96 or 384."},"gcMax":{"type":"number","default":75,"maximum":100,"minimum":0,"description":"Highest GC% a barcode may have."},"gcMin":{"type":"number","default":25,"maximum":100,"minimum":0,"description":"Lowest GC% a barcode may have."},"length":{"type":"integer","default":12,"maximum":40,"minimum":4,"description":"Barcode length in bases (default 12). Longer barcodes make a given distance far easier to reach."},"metric":{"enum":["levenshtein","hamming"],"type":"string","default":"levenshtein","description":"'levenshtein' counts substitutions, insertions and deletions — the right choice for nanopore or PacBio, and the safe default. 'hamming' counts substitutions only, which is faster and adequate when the platform's errors are substitutions (Illumina), but gives NO protection against an indel shifting one barcode into another."},"exclude":{"type":"array","items":{"type":"string"},"description":"Motifs no barcode may contain, checked on both strands — the restriction sites you clone with. Literal ACGT only."},"existing":{"type":"array","items":{"type":"string"},"description":"Barcodes you already use. They are held fixed and the new ones are kept distant from them, so a second plate does not collide with the first."},"minDistance":{"type":"integer","default":3,"minimum":1,"description":"Minimum edit distance between any two barcodes (default 3). Distance 3 corrects one read error and detects two; distance 5 corrects two. Distance 1 only means 'not identical' and corrects nothing."},"maxHomopolymer":{"type":"integer","default":3,"minimum":1,"description":"Longest run of one base allowed (default 3). Homopolymers miscall on every platform and are the one composition rule worth keeping tight."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Design a set of sequencing barcodes","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"base_editing_design","title":"Base Editing Designer","description":"Design cytosine (CBE, C→T) or adenine (ABE, A→G) base-editing gRNAs for an SpCas9 target: for each NGG gRNA it reports every editable base inside the editor's activity window, flags bystander edits (more than one editable base in the window), and — with a CDS reading frame — classifies each edit's amino-acid consequence (silent / missense / nonsense / stop-loss). Bystander-free guides are ranked first. Handles both strands (a C→T on the protospacer of a reverse-strand guide is reported as the forward-strand G→A).","input_schema":{"type":"object","required":["target"],"properties":{"editor":{"enum":["be3","be4max","abe7.10","abe8e"],"type":"string","default":"be4max","description":"Base editor: be3/be4max (CBE, C→T) or abe7.10/abe8e (ABE, A→G)."},"target":{"type":"string","residues":"nt","description":"Nucleotide sequence (raw or FASTA; IUPAC accepted)."},"frameStart":{"type":"integer","description":"Optional 1-based CDS reading-frame start, to classify each edit's amino-acid consequence."},"targetPosition":{"type":"integer","description":"Optional 1-based forward-strand position of the base you intend to edit; only guides whose window covers it are returned."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Base Editing Designer","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"base_edit_quant","title":"Base editing quantification from Sanger traces (EditR equivalent)","description":"Quantify CBE/ABE base editing from a pair of Sanger traces — an unedited control and the edited pool — without NGS. At each editable position in the activity window the edited trace is treated as a mixture of the unedited and converted peaks, and the control's OWN alt-channel signal at that same position is subtracted as background, because dye crosstalk is position- and context-dependent and a global constant would be wrong per position. Significance comes from a null built from the same sample (every control position outside the window carrying the same base), so the threshold adapts to the run's chemistry instead of being hardcoded. Returns per-position percentages with z-scores, the target and its bystanders, the background distribution (including a robust estimate of its spread and a count of its outliers), and the noise floor — the percentage the background alone reaches, or null when the run's own null has no spread to derive one from. A window position whose control already carries the converted base is reported but not quantified, because the (1 − b) rescale amplifies error by 1/(1 − b) and turns a 0.1-point wobble into half the pool. Locate the window with an editor id plus the protospacer, or give it explicitly. Blind to indels, which shift the trace rather than mixing a base. PREDICTED, NOT MEASURED. None is published for this implementation. Every run instead reports what it rests on: the background mean, sd, robust (MAD-based) sd, outlier count and n, and a noiseFloorPercent that says how much apparent editing the background alone reaches at the significance threshold — null, rather than 0, when the run has no null with any spread to derive a limit from. This implementation's recovery of known synthetic mixtures (to under a percentage point) is deliberately NOT offered as validation — it tests the arithmetic and the coordinate handling, not whether the linear mixture model fits a real capillary trace. Two properties ARE characterized. The bias is directional and one-sided: the (1 − b) rescale assumes a fully converted position would read as alt fraction 1.0, which real chemistry does not reach, so percentages run low by roughly the crosstalk fraction (order 5-10% relative at typical 3% bleed). The variance is not constant across positions: dividing by (1 − b) amplifies the error in a and b by 1/(1 − b), so the variance of the estimate goes as 1/(1 − b)². Positions whose control alt fraction b exceeds 0.25 are therefore reported but NOT quantified, which bounds that amplification at 1.33x on everything the tool does quantify. Valid for: A pool edited by a cytosine or adenine base editor, read on the same amplicon and chemistry as an unedited control that starts within ±40 bases of it, where the editing is a SUBSTITUTION. Not valid for indels — a base editor also makes them, and an indel-bearing allele shifts the downstream trace so that it degrades the fit at every window position rather than showing up anywhere. Not valid where the control read already carries the alt base at a window position (a pre-existing variant, or the wrong control), since then there is nothing left to correct against — that condition is DETECTED rather than only described: a window position whose control alt fraction exceeds 0.25 is reported with an excludedReason and an editedPercent of 0 instead of a number, warned about, and failed by the hard control-supports-the-window-base-calls gate check. Reported percentages are pool-level: Sanger sees the superposition, so which allele carries which combination of bystander edits is not recoverable from it at all.","input_schema":{"type":"object","required":["controlBases","controlChannels","editedBases","editedChannels"],"properties":{"to":{"type":"string","residues":"nt","description":"Explicit-window mode: the base it converts to, as READ on the control strand."},"from":{"type":"string","residues":"nt","description":"Explicit-window mode: the base the editor converts, as READ on the control strand (C for a CBE read forward, G for one read reverse)."},"editor":{"enum":["be3","be4max","abe7.10","abe8e"],"type":"string","description":"Base editor id (be3, be4max, abe7.10, abe8e) — fixes the converted bases and the activity window in protospacer coordinates. Requires \"protospacer\". Mutually exclusive with the explicit window arguments."},"offset":{"type":"number","description":"Override the alignment offset between the reads (edited position p matches control position p + offset). Whole numbers only. By default it is found from the base calls outside the window; either way the identity reported back is the identity AT THE OFFSET USED, so overriding it does not hide a bad alignment behind the best-scoring one."},"windowEnd":{"type":"number","description":"Explicit window end, 1-based inclusive, in CONTROL coordinates. Window length is capped at 40."},"zThreshold":{"type":"number","default":3,"maximum":10,"minimum":1,"description":"Significance threshold in standard deviations of the sample's own background. Must be between 1 and 10 — a value outside that range is REJECTED, not clamped, because a run silently retested at a threshold the caller did not choose looks exactly like one that was. Raising it raises the reported noise floor with it."},"editedBases":{"type":"string","residues":"nt","description":"Base calls of the edited pool's read."},"protospacer":{"type":"string","residues":"nt","description":"The 20-nt spacer, located in the CONTROL read. Found on either strand; a reverse-complement match numbers the protospacer right-to-left along the read and complements the converted bases (a CBE's C→T reads as G→A), which is handled. Must match exactly once."},"windowStart":{"type":"number","description":"Explicit window start, 1-based in CONTROL read coordinates. Requires windowEnd, from and to."},"controlBases":{"type":"string","residues":"nt","description":"Base calls of the UNEDITED control read."},"editedChannels":{"type":"array","items":{"type":"array","items":{"type":"number"}},"description":"Per-base [A, C, G, T] intensities of the edited read, same convention."},"targetPosition":{"type":"number","description":"1-based CONTROL position of the intended edit. Give it when you know it: without it the most-edited significant position is labeled the target and the rest become bystanders, which relabels a bystander-dominant result as a clean one."},"controlChannels":{"type":"array","items":{"type":"array","items":{"type":"number"}},"description":"Per-base [A, C, G, T] intensities of the control read, one row per called base, read at that base's peak location (trace arrays are indexed by scan, not by base)."},"targetProtospacerPosition":{"type":"number","description":"1-based protospacer position of the intended edit (PAM-distal = 1). Editor mode only."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Base editing quantification from Sanger traces (EditR equivalent)","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"batch","title":"Batch (one tool over many records)","description":"Run one batchable SeqBench tool over many records. Returns a table of per-record results and typed failures.","input_schema":{"type":"object","required":["tool","input"],"properties":{"args":{"type":"object","description":"Shared arguments applied to every record.","additionalProperties":true},"tool":{"type":"string","description":"Batchable tool name (for example gc_content or translate)."},"input":{"type":"string","description":"Multi-FASTA or one sequence/identifier per line."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Batch (one tool over many records)","readOnlyHint":true,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"blast_poll","title":"Collect a BLAST search","description":"Check a BLAST search submitted with blast_submit. Returns {ready:false} while it is still running; once ready, returns each hit's accession, title, organism, best HSP (bit score, expect, percent identity, span on both query and subject) and the percentage of the QUERY it covers, with overlapping HSPs merged so coverage cannot exceed 100%. A search of several FASTA records also returns `queries`: each record's title, length and hits, in submission order (`hits` is the first record's). A request id NCBI no longer recognises is reported as either a typo or an expired search, which is the same answer it gives for both.","input_schema":{"type":"object","required":["rid"],"properties":{"rid":{"type":"string","description":"The request id returned by blast_submit."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Collect a BLAST search","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"blast_submit","title":"Search a sequence against GenBank (BLAST)","description":"Submit a sequence to NCBI BLAST and get a request id back immediately — poll it with blast_poll. The program is inferred from the sequence (nucleotide to blastn, protein to blastp) unless you name one, and a query whose type does not match the named program is refused rather than silently returning nothing. Databases: blastn: nt, refseq_rna (default nt); blastx: nr (default nr); blastp: nr, swissprot (default nr); tblastn: nt (default nt). typeMaterial: true limits nt to sequences from type material (Entrez sequence_from_type) — what a 16S or ITS read should be identified against, since every hit is then a named species. Up to 20,000 residues per sequence. A multi-FASTA of up to 96 records is ONE search with each record reported separately (blast_poll's `queries`), never one concatenated query. Searches typically take 20-60 seconds; NCBI asks that a single search is polled no more than once a minute.","input_schema":{"type":"object","required":["sequence"],"properties":{"evalue":{"type":"number","description":"Report only hits at or below this expect value. NCBI's default is 10."},"program":{"enum":["blastn","blastp","blastx","tblastn"],"type":"string","description":"BLAST program. Omit to infer from the sequence: blastn for nucleotide, blastp for protein. blastx translates a nucleotide query and searches proteins; tblastn searches translated nucleotide databases with a protein query."},"database":{"type":"string","description":"Database to search. Omit for the program's default. blastn: nt, refseq_rna (default nt); blastx: nr (default nr); blastp: nr, swissprot (default nr); tblastn: nt (default nt)."},"sequence":{"type":"string","description":"DNA or protein to search, raw or FASTA. Up to 20,000 residues; several FASTA records are searched as separate queries in one request."},"megablast":{"type":"boolean","default":true,"description":"blastn only. Megablast (the default) finds near-identical sequences and is what identifies a clone; set false for a slower search that also finds diverged ones. Left unset, a query shorter than megablast's 28-base seed runs as plain blastn, since megablast cannot seed it at all."},"hitlistSize":{"type":"integer","default":20,"description":"Most database sequences to report (1-100)."},"typeMaterial":{"type":"boolean","default":false,"description":"Limit an nt search to sequences from type material — the strains species names are defined by. Use it to identify a 16S or ITS read: unfiltered nt ranks uncultured clones and misfiled isolates beside them."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Search a sequence against GenBank (BLAST)","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"build_route_plan","title":"How to build it, and what each way costs","description":"Compare the ways one construct can actually be made — order it whole as a sequence-verified clonal gene, buy only the pieces you cannot amplify, PCR everything out of plasmids you already have, edit one plasmid by mutagenesis, or anneal oligos for a short piece — each costed off a published US list price with the page and the date it was read. It first works out which stretches of the target occur in the templates you give it (either strand, through a circular origin), since the stretch you already hold is the one you do not have to buy. Costs cover ORDERED items only: synthesis, oligos and sequencing. Enzymes, master mixes and competent cells are not costed, because no vendor publishes a price for them without an account and they are much the same whichever route you take. Nothing here predicts whether a reaction will work; each route states its own failure mode instead.","input_schema":{"type":"object","required":["target"],"properties":{"target":{"type":"string","residues":"nt","description":"The construct you want, as bases, FASTA or a GenBank record."},"circular":{"type":"boolean","default":true,"description":"Is the finished construct a plasmid? Reported back, not used to price."},"templates":{"type":"string","description":"What you already have in the freezer: a multi-record FASTA (headers become the names), a single GenBank record, or bare bases. Omitted, the only route is to buy the whole thing."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"How to build it, and what each way costs","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"centrifuge_conversion","title":"RPM ↔ RCF converter","description":"Convert between rotor speed (RPM) and relative centrifugal force (×g) for a given rotor radius, in either direction. The conversion is exact physics — RCF = ω²r/g — and the only judgement in it is which radius: a protocol's ×g conventionally means the rotor's MAXIMUM radius, and using the wrong one scales the force by the ratio of the two.","input_schema":{"type":"object","required":["radiusCm"],"properties":{"rcf":{"type":"number","description":"Relative centrifugal force in ×g. Give this OR rpm."},"rpm":{"type":"number","description":"Speed in revolutions per minute. Give this OR rcf."},"radiusCm":{"type":"number","description":"Rotor radius in cm — the maximum radius, from the rotor manual. Required: there is no typical rotor to assume."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"RPM ↔ RCF converter","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"characterize_sequence","title":"Characterize sequence","description":"One-paste 'tell me everything': auto-detects DNA/RNA/protein, then reports composition, ORFs, single-cutter enzymes, end primers or protein properties, plus a BLAST link.","input_schema":{"type":"object","required":["sequence"],"properties":{"maxOrfs":{"type":"integer","default":8,"description":"Maximum number of ORFs to return, longest first."},"minOrfAa":{"type":"integer","default":40,"description":"Minimum ORF length in amino acids (nucleotide input only)."},"sequence":{"type":"string","residues":"any","description":"Nucleotide or protein sequence (raw or FASTA; IUPAC accepted). The alphabet is detected."},"endPrimerLength":{"type":"integer","default":20,"description":"Length of the naive end primers taken from each end."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Characterize sequence","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"cloning_diagnose","title":"Cloning failure diagnosis (ranked causes from design + observation)","description":"Work out why a cloning experiment failed: no colonies, every clone empty vector, or no PCR band. Takes your design (method, parts, enzymes, primers, host methylation state) plus what you actually observed (colony counts on the plate and on each control, screening tally, band sizes, whether the ladder ran) and returns causes ranked by evidence — each with the deterministic fact from the design or the observation that implicates it, the cheapest observation that would separate it from the next candidate, and the next experiment. Causes the observations eliminate are reported as eliminated, naming the observation that did it; causes the design makes impossible are not listed. No probability is computed anywhere — the ordering is of evidence, not of likelihood, and `ranking.evidenceBased` says so when the inputs separate nothing.","input_schema":{"type":"object","required":["symptom","method"],"properties":{"parts":{"type":"array","items":{"type":"string"},"maxItems":8,"description":"Parts in assembly order (Golden Gate / Gibson), or [vector, insert] for a restriction ligation. Raw or FASTA. Up to 8; 300,000 bp total across parts and template."},"method":{"enum":["goldengate","gibson","restriction_ligation","pcr"],"type":"string","description":"How the construct was made. Decides which cause set applies and which design checks can run."},"enzymes":{"type":"array","items":{"type":"string"},"maxItems":4,"description":"The Type IIS enzyme for Golden Gate (BsaI, BbsI, Esp3I (BsmBI)), or the one or two restriction enzymes the insert and vector were cut with. An unrecognized name is rejected rather than skipped: every methylation and site-geometry verdict here reads \"no site found\" when the enzyme is missing, so a typo would come back as a clean bill of health."},"symptom":{"enum":["no_colonies","wrong_clones","no_pcr_band"],"type":"string","description":"The complaint. \"no_colonies\" = the plate is blank; \"wrong_clones\" = colonies grew but the clones are empty vector / rearranged / the original template; \"no_pcr_band\" = the gel lane is empty or the band is the wrong size."},"colonies":{"type":"number","description":"Colonies on the experimental plate. Omitting this is different from giving 0."},"screened":{"type":"object","required":["total","correct"],"properties":{"total":{"type":"number","description":"Clones screened."},"correct":{"type":"number","description":"Clones that were the intended construct."},"rearranged":{"type":"number","description":"Clones that were a real plasmid but not the intended arrangement of parts."},"emptyVector":{"type":"number","description":"Clones carrying no insert."},"originalTemplate":{"type":"number","description":"Clones that turned out to be the plasmid the insert was amplified from."}},"description":"Screening tally, up to 100,000 clones. The buckets must not add up to more than total — an inconsistent tally is rejected rather than reasoned over, because every verdict drawn from the screen compares a count against that total."},"template":{"type":"string","residues":"nt","description":"PCR template, raw or FASTA."},"ladderRan":{"type":"boolean","description":"Was the ladder itself visible in the same gel? A true here eliminates the whole stain-and-imaging branch in one observation."},"partNames":{"type":"array","items":{"type":"string"},"description":"Labels for the parts, in the same order (\"backbone\", \"promoter\", \"CDS\"). Used in every fact that names a part."},"overlapLen":{"type":"number","default":20,"description":"Gibson only — the homology arm length the assembly was designed with."},"insertSource":{"enum":["plasmid_pcr","genomic_pcr","synthesis","digest","unknown"],"type":"string","description":"Where the insert came from. Only \"plasmid_pcr\" changes a verdict: a plasmid template replicates and selects on its own, so it can give colonies with no ligation at all."},"vectorMarker":{"enum":["amp","ampicillin","bla","cam","carb","carbenicillin","chlor","chloramphenicol","gent","gentamicin","hyg","hygromycin","kan","kanamycin","neo","spec","spectinomycin","strep","tet","tetracycline","zeo","zeocin"],"type":"string","description":"Selection marker on the vector. Compared against the plate's antibiotic by identity, not by guessing at free text."},"primerForward":{"type":"string","residues":"nt","description":"Forward primer, up to 200 nt."},"primerReverse":{"type":"string","residues":"nt","description":"Reverse primer, up to 200 nt."},"agarosePercent":{"type":"number","default":1,"description":"Agarose percentage of the gel. Snapped to the nearest tabulated value; decides the resolving window a band is placed against."},"annealingTempC":{"type":"number","description":"Annealing temperature actually used, °C. Compared against each primer's own nearest-neighbor Tm."},"hostMethylation":{"enum":["dam_dcm_plus","dam_dcm_minus","unknown"],"type":"string","default":"unknown","description":"Dam/Dcm state of the DNA that was CUT — a property of the strain the plasmid was prepared from, not the one it was transformed into. Standard cloning strains are dam+/dcm+. \"dam_dcm_minus\" eliminates every methylation-blocking cause; \"unknown\" leaves the sequence overlap stated as a fact and the methylation as an open question."},"plateAntibiotic":{"enum":["amp","ampicillin","bla","cam","carb","carbenicillin","chlor","chloramphenicol","gent","gentamicin","hyg","hygromycin","kan","kanamycin","neo","spec","spectinomycin","strep","tet","tetracycline","zeo","zeocin"],"type":"string","description":"Antibiotic on the plate. amp and carbenicillin count as the same selection (both select bla)."},"templateCircular":{"type":"boolean","default":false,"description":"Treat the template as a plasmid, so a product across the origin is found."},"gelBandsObservedBp":{"type":"array","items":{"type":"number"},"maxItems":30,"description":"Band sizes read off the lane, bp. An empty array (\"I looked and there was nothing\") is not the same as omitting the field."},"phosphataseTreated":{"type":"boolean","description":"Was the cut vector dephosphorylated (rSAP/CIP) before ligation?"},"noDnaControlColonies":{"type":"number","description":"Colonies from the same cells and plate with NO DNA added. Non-zero means the plate is not selecting."},"noInsertControlColonies":{"type":"number","description":"Colonies from the identical reaction with the insert (or one part) left out."},"positiveControlColonies":{"type":"number","description":"Colonies from an intact, uncut plasmid into the same cell aliquot. Non-zero eliminates \"the cells never took up DNA\"."},"positiveControlSameMarker":{"type":"boolean","description":"Did that control plasmid carry the SAME selection marker? If not, it eliminates the cells but says nothing about the plate — the tool reports the difference."},"uncutVectorControlColonies":{"type":"number","description":"Colonies from the digested but UNLIGATED vector. Measures intact vector that survived the digest, with no help from the ligase."},"transformationEfficiencyCfuPerUg":{"type":"number","description":"cfu/µg from a control transformation, where it was measured."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Cloning failure diagnosis (ranked causes from design + observation)","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"cloning_next_observation","title":"Which experiment to run next, and how many are left","description":"Rank every observation you have not yet made by how many open causes it settles WHICHEVER WAY IT COMES OUT, then return the smallest set of observations that settles all of them. Takes the same arguments as cloning_diagnose. The ranking is computed by re-running the diagnosis at each possible outcome of each observation and intersecting, so every count is a worst case rather than an average — and causes that no observation can settle are named, because those need a different experiment rather than more observing. No probabilities anywhere.","input_schema":{"type":"object","required":["symptom","method"],"properties":{"parts":{"type":"array","items":{"type":"string"},"maxItems":8,"description":"Parts in assembly order (Golden Gate / Gibson), or [vector, insert] for a restriction ligation. Raw or FASTA. Up to 8; 300,000 bp total across parts and template."},"method":{"enum":["goldengate","gibson","restriction_ligation","pcr"],"type":"string","description":"How the construct was made. Decides which cause set applies and which design checks can run."},"enzymes":{"type":"array","items":{"type":"string"},"maxItems":4,"description":"The Type IIS enzyme for Golden Gate (BsaI, BbsI, Esp3I (BsmBI)), or the one or two restriction enzymes the insert and vector were cut with. An unrecognized name is rejected rather than skipped: every methylation and site-geometry verdict here reads \"no site found\" when the enzyme is missing, so a typo would come back as a clean bill of health."},"symptom":{"enum":["no_colonies","wrong_clones","no_pcr_band"],"type":"string","description":"The complaint. \"no_colonies\" = the plate is blank; \"wrong_clones\" = colonies grew but the clones are empty vector / rearranged / the original template; \"no_pcr_band\" = the gel lane is empty or the band is the wrong size."},"colonies":{"type":"number","description":"Colonies on the experimental plate. Omitting this is different from giving 0."},"screened":{"type":"object","required":["total","correct"],"properties":{"total":{"type":"number","description":"Clones screened."},"correct":{"type":"number","description":"Clones that were the intended construct."},"rearranged":{"type":"number","description":"Clones that were a real plasmid but not the intended arrangement of parts."},"emptyVector":{"type":"number","description":"Clones carrying no insert."},"originalTemplate":{"type":"number","description":"Clones that turned out to be the plasmid the insert was amplified from."}},"description":"Screening tally, up to 100,000 clones. The buckets must not add up to more than total — an inconsistent tally is rejected rather than reasoned over, because every verdict drawn from the screen compares a count against that total."},"template":{"type":"string","residues":"nt","description":"PCR template, raw or FASTA."},"ladderRan":{"type":"boolean","description":"Was the ladder itself visible in the same gel? A true here eliminates the whole stain-and-imaging branch in one observation."},"partNames":{"type":"array","items":{"type":"string"},"description":"Labels for the parts, in the same order (\"backbone\", \"promoter\", \"CDS\"). Used in every fact that names a part."},"overlapLen":{"type":"number","default":20,"description":"Gibson only — the homology arm length the assembly was designed with."},"insertSource":{"enum":["plasmid_pcr","genomic_pcr","synthesis","digest","unknown"],"type":"string","description":"Where the insert came from. Only \"plasmid_pcr\" changes a verdict: a plasmid template replicates and selects on its own, so it can give colonies with no ligation at all."},"vectorMarker":{"enum":["amp","ampicillin","bla","cam","carb","carbenicillin","chlor","chloramphenicol","gent","gentamicin","hyg","hygromycin","kan","kanamycin","neo","spec","spectinomycin","strep","tet","tetracycline","zeo","zeocin"],"type":"string","description":"Selection marker on the vector. Compared against the plate's antibiotic by identity, not by guessing at free text."},"primerForward":{"type":"string","residues":"nt","description":"Forward primer, up to 200 nt."},"primerReverse":{"type":"string","residues":"nt","description":"Reverse primer, up to 200 nt."},"agarosePercent":{"type":"number","default":1,"description":"Agarose percentage of the gel. Snapped to the nearest tabulated value; decides the resolving window a band is placed against."},"annealingTempC":{"type":"number","description":"Annealing temperature actually used, °C. Compared against each primer's own nearest-neighbor Tm."},"hostMethylation":{"enum":["dam_dcm_plus","dam_dcm_minus","unknown"],"type":"string","default":"unknown","description":"Dam/Dcm state of the DNA that was CUT — a property of the strain the plasmid was prepared from, not the one it was transformed into. Standard cloning strains are dam+/dcm+. \"dam_dcm_minus\" eliminates every methylation-blocking cause; \"unknown\" leaves the sequence overlap stated as a fact and the methylation as an open question."},"plateAntibiotic":{"enum":["amp","ampicillin","bla","cam","carb","carbenicillin","chlor","chloramphenicol","gent","gentamicin","hyg","hygromycin","kan","kanamycin","neo","spec","spectinomycin","strep","tet","tetracycline","zeo","zeocin"],"type":"string","description":"Antibiotic on the plate. amp and carbenicillin count as the same selection (both select bla)."},"templateCircular":{"type":"boolean","default":false,"description":"Treat the template as a plasmid, so a product across the origin is found."},"gelBandsObservedBp":{"type":"array","items":{"type":"number"},"maxItems":30,"description":"Band sizes read off the lane, bp. An empty array (\"I looked and there was nothing\") is not the same as omitting the field."},"phosphataseTreated":{"type":"boolean","description":"Was the cut vector dephosphorylated (rSAP/CIP) before ligation?"},"noDnaControlColonies":{"type":"number","description":"Colonies from the same cells and plate with NO DNA added. Non-zero means the plate is not selecting."},"noInsertControlColonies":{"type":"number","description":"Colonies from the identical reaction with the insert (or one part) left out."},"positiveControlColonies":{"type":"number","description":"Colonies from an intact, uncut plasmid into the same cell aliquot. Non-zero eliminates \"the cells never took up DNA\"."},"positiveControlSameMarker":{"type":"boolean","description":"Did that control plasmid carry the SAME selection marker? If not, it eliminates the cells but says nothing about the plate — the tool reports the difference."},"uncutVectorControlColonies":{"type":"number","description":"Colonies from the digested but UNLIGATED vector. Measures intact vector that survived the digest, with no help from the ligase."},"transformationEfficiencyCfuPerUg":{"type":"number","description":"cfu/µg from a control transformation, where it was measured."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Which experiment to run next, and how many are left","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"cloning_simulate","title":"Cloning simulator","description":"Assemble fragments by Gibson/overlap, Golden Gate (Type IIS), restriction–ligation (sticky or blunt), TOPO/TA, LIC or SLIC (T4-polymerase chew-back) or In-Fusion/CPEC, returning the product, the junctions and — for the primer-design methods — the junction primers. Each method is modeled as its own chemistry rather than as one product model with different labels: LIC's chew-back stops at the first occurrence of the single dNTP supplied, so a tail carrying that base stops it early and a tail without one lets it run past the junction, and both are refused with the offending base and position named.","input_schema":{"type":"object","required":["method"],"properties":{"names":{"type":"array","items":{"type":"string"},"description":"Optional labels for each fragment."},"enzyme":{"type":"string","default":"BsaI","description":"Type IIS enzyme for Golden Gate — one of BsaI, BbsI, Esp3I (BsmBI); \"BsmBI\" also resolves to Esp3I. Any other name is rejected rather than substituted."},"insert":{"type":"string","residues":"nt","description":"Insert sequence (restriction, topo and lic methods)."},"method":{"enum":["gibson","goldengate","restriction","topo","lic","slic","infusion","gateway","homology"],"type":"string","default":"gibson","description":"Assembly method. gibson/goldengate design the junction primers for bare fragments; restriction and topo build a product from a vector and an insert; lic and slic model T4-polymerase chew-back (sequence-defined and time-stopped respectively); infusion is In-Fusion/CPEC, 15 bp terminal homology with no exonuclease, and works out the fragment ORDER for itself; gateway runs a BP or LR recombination between att sites (see `reaction`); homology starts from the CIRCULAR vector instead of a linear fragment — say how to open it with `openWith` and it designs the arm-carrying primers for the insert (NEBuilder/ClonExpress/In-Fusion kits)."},"openAt":{"type":"integer","minimum":1,"description":"homology method, inverse-pcr: 1-based base the linearised vector starts at."},"vector":{"type":"string","residues":"nt","description":"Vector sequence (restriction, topo and lic methods; for lic, the LINEARIZED vector)."},"enzyme3":{"type":"string","default":"BamHI","description":"Insert 3′ enzyme (restriction method)."},"enzyme5":{"type":"string","default":"EcoRI","description":"Insert 5′ enzyme (restriction method)."},"circular":{"type":"boolean","default":true,"description":"Produce a circular product."},"deleteTo":{"type":"integer","minimum":1,"description":"homology method, inverse-pcr: delete openAt..deleteTo (inclusive, wrapping past the origin) instead of only opening."},"openWith":{"enum":["single","double","inverse-pcr"],"type":"string","default":"single","description":"homology method: how the circular vector is opened. single uses vectorEnzyme5 and REFUSES if it does not cut exactly once; double removes the arc running forward from vectorEnzyme5's cut to vectorEnzyme3's; inverse-pcr opens at `openAt` and, with `deleteTo`, deletes that span."},"reaction":{"enum":["BP","LR"],"type":"string","default":"LR","description":"gateway method: BP recombines ONE attB-flanked PCR product (`fragments[0]`, a bare sequence is fine) into an attP donor (`vector`) to make an attL entry clone; LR recombines one to four ORDERED attL/attR entry clones (`fragments`) into an attR destination (`vector`) to make the attB expression clone. Vectors and entry clones must be GenBank records with their att sites annotated — attP/attL/attR sites are found by label, then checked base by base at the crossover core."},"topoMode":{"enum":["ta","blunt","directional"],"type":"string","default":"ta","description":"TOPO chemistry (topo method): TA (Taq 3′-A), blunt, or directional (pENTR/D-TOPO, needs 5′-CACC on the insert)."},"armLength":{"type":"integer","default":18,"maximum":25,"minimum":15,"description":"homology method: homology-arm length in bp, clamped to 15-25 — the range the kit manuals specify (CE Design 15-20, In-Fusion 15, NEBuilder 15-25)."},"fragments":{"type":"array","items":{"type":"string"},"maxItems":24,"description":"Fragments (5′→3′). Used by gibson/goldengate/slic/infusion. gibson and goldengate assemble them head-to-tail in the order given and add the junctions by primer; slic needs the homology already ON the fragments and keeps the order given; infusion needs it on the fragments too but derives the order from the homologies, so the order listed here is ignored. slic and infusion take at most 24."},"overlapLen":{"type":"integer","default":20,"description":"Gibson homology-arm length (bp)."},"armTmTarget":{"type":"number","default":60,"description":"Target annealing Tm (°C) for primer arms."},"chewBackLen":{"type":"integer","default":0,"minimum":0,"description":"slic method: nucleotides removed from each 3′ end. A SLIC chew-back has no dNTP to arrest it and is stopped by time, so this is an input rather than a property of the sequence. 0 (default) models the intended reaction — chewed to the full homology and no further; any positive value is checked against each junction's own homology, and both overrunning it and falling short of meeting the chew-back coming the other way are reported."},"homologyLen":{"type":"integer","default":15,"minimum":15,"description":"infusion method: terminal homology required at every junction, in bp. At least 15 — the junction is annealed and extended by a polymerase with no exonuclease to widen it and no ligase to seal it, so a shorter overlap is a different chemistry rather than a weaker version of this one."},"vectorEnzyme3":{"type":"string","description":"Vector 3′ enzyme (restriction method); defaults to enzyme3."},"vectorEnzyme5":{"type":"string","description":"Vector 5′ enzyme (restriction method); defaults to enzyme5. Set a different, compatible enzyme (e.g. BglII for a BamHI insert) to model heterologous-overhang cloning."},"insertNucleotide":{"enum":["A","C","G","T"],"type":"string","description":"lic method: the single dNTP the INSERT's chew-back was run with. Normally the COMPLEMENT of vectorNucleotide (the classic pair is dTTP on the vector, dATP on the insert) — with the same base for both, each junction's shared block would have to avoid that base and its complement at once."},"vectorNucleotide":{"enum":["A","C","G","T"],"type":"string","description":"lic method: the single dNTP the VECTOR's chew-back was run with (T for dTTP…). Required — T4 pol's exonuclease stops at the first occurrence of this base reading inward from each 3′ end, so there is no answer without it."},"mergePreAddedArms":{"type":"boolean","default":true,"description":"Gibson only. When two fragments already share terminal sequence, count that share ONCE (the default — it is a homology arm the fragments already carry) or set false to concatenate it twice. The second reading is the right one when the shared block is a genuine tandem repeat, e.g. a 2x tag or enhancer split between its copies: nothing in the two fragments can tell the two apart, so the choice belongs to the caller. Either way the share is reported in preAddedArms and both readings are returned in `readings`."},"dephosphorylateVector":{"type":"boolean","default":false,"description":"CIP/rSAP-dephosphorylate the vector to suppress self-ligation background (restriction method)."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Cloning simulator","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"codon_adaptation_index","title":"CAI analyzer","description":"Codon Adaptation Index (CAI) and per-codon relative adaptiveness of a CDS against an expression host, with rare-codon and GC3 analysis.","input_schema":{"type":"object","required":["sequence"],"properties":{"organism":{"enum":["ecoli","human","yeast","cho","pichia","insect","arabidopsis","zebrafish"],"type":"string","default":"ecoli"},"sequence":{"type":"string","residues":"nt","description":"Coding sequence (DNA/RNA; should start in-frame at ATG)."},"frameStart":{"type":"integer","default":1,"description":"1-based position to start reading codons."},"minRareRun":{"type":"integer","default":3,"description":"Shortest stretch of CONSECUTIVE rare codons to report as a run. A CAI is a geometric mean, so fifteen rare codons scattered singly and the same fifteen in three runs of five score alike and carry the same rareCount; only the runs say where they are clustered."},"rareThreshold":{"type":"number","default":0.1,"description":"Relative adaptiveness (w) below this flags a codon as rare."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"CAI analyzer","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"codon_optimize","title":"Codon optimizer","description":"Codon-optimize a protein (or coding DNA) for an expression host by picking the most-frequent codon per residue.","input_schema":{"type":"object","required":["protein"],"properties":{"protein":{"type":"string","residues":"any","description":"Protein sequence (one-letter codes). Coding DNA/RNA is accepted and translated in frame +1 up to the first stop codon (residues after an in-frame stop are NOT optimized)."},"organism":{"enum":["ecoli","human","yeast","cho","pichia","insect","arabidopsis","zebrafish"],"type":"string","default":"ecoli"},"inputType":{"enum":["auto","protein","dna"],"type":"string","default":"auto","description":"How to read `protein`. 'auto' guesses from the alphabet (>90% ACGTUN reads as DNA), which mis-files genuine Ala/Cys/Gly/Thr/Asn-only peptides — set 'protein' or 'dna' to force it."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Codon optimizer","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"construct_autofix","title":"Construct auto-fix (domestication)","description":"Iteratively substitutes synonymous codons to resolve unwanted restriction sites (domestication for Golden Gate), homopolymers, tandem repeats, predicted secondary structure, cryptic RBS/polyA motifs and hidden alternate-frame ORFs that construct_qc flags — without changing the encoded protein (verified). Does NOT touch premature stops or GC extremes; re-run construct_qc afterward to confirm. A native TypeScript alternative to a constraint-solver sidecar.","input_schema":{"type":"object","required":["sequence"],"properties":{"gcLow":{"type":"number","default":30},"gcHigh":{"type":"number","default":70},"gcWindow":{"type":"integer","default":50},"organism":{"enum":["ecoli","human","yeast","cho","pichia","insect","arabidopsis","zebrafish"],"type":"string","default":"ecoli","description":"Codon-usage table to prefer among synonymous options."},"sequence":{"type":"string","residues":"nt","description":"Nucleotide sequence (raw or FASTA; IUPAC accepted)."},"maxPasses":{"type":"integer","default":3,"maximum":10,"minimum":1,"description":"Repeat full passes until clean or no further progress."},"frameStart":{"type":"integer","default":1,"description":"1-based nucleotide where the reading frame begins."},"avoidEnzymes":{"type":"array","items":{"type":"string"},"description":"Enzyme names whose internal sites should be removed (e.g. [\"BsaI\",\"BsmBI\"] for Golden Gate domestication)."},"homopolymerMin":{"type":"integer","default":8},"crypticOrfMinAa":{"type":"integer","default":20,"description":"Minimum peptide length (aa) for a hidden alternate-frame ORF to be flagged."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Construct auto-fix (domestication)","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"construct_qc","title":"Construct QC linter","description":"Lint a coding DNA sequence for premature stops, internal RBS/polyA motifs, unwanted restriction sites, GC extremes and repeats.","input_schema":{"type":"object","required":["sequence"],"properties":{"gcLow":{"type":"number","default":30,"description":"GC% below this flags an AT-rich window."},"gcHigh":{"type":"number","default":70,"description":"GC% above this flags a GC-rich window."},"gcWindow":{"type":"integer","default":50,"description":"Sliding-window size (nt) for GC-extreme scanning."},"sequence":{"type":"string","residues":"nt","description":"Nucleotide sequence (raw or FASTA; IUPAC accepted)."},"frameStart":{"type":"integer","default":1,"description":"1-based nucleotide where the reading frame begins."},"avoidEnzymes":{"type":"array","items":{"type":"string"},"description":"Enzyme names whose internal sites should be flagged as errors. Matched against the curated common-enzyme set plus the Golden Gate Type IIS enzymes (BsaI, BbsI, Esp3I/BsmBI); an unrecognized name is rejected, never skipped."},"homopolymerMin":{"type":"integer","default":8,"description":"Minimum run length to flag a homopolymer."},"crypticOrfMinAa":{"type":"integer","default":20,"description":"Minimum peptide length (aa) for a hidden alternate-frame ORF to be flagged."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Construct QC linter","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"cpg_islands","title":"CpG island finder","description":"Find CpG islands by either published definition: Gardiner-Garden & Frommer 1987 (GC > 50%, observed/expected CpG > 0.6, >= 200 bp — the original, which also calls many Alu repeats) or Takai & Jones 2002 (GC >= 55%, obs/exp >= 0.65, >= 500 bp — written to exclude them). Windows are merged only where the merged region STILL meets the criteria, so every island returned satisfies the definition it is reported under. Reports the CpG DINUCLEOTIDE count separately from GC content, because conflating the two is the usual way this number goes wrong.","input_schema":{"type":"object","required":["sequence"],"properties":{"preset":{"enum":["gardiner-garden","takai-jones"],"type":"string","default":"gardiner-garden","description":"Which published criteria to apply. \"gardiner-garden\": Gardiner-Garden & Frommer 1987 (GC > 50%, obs/exp > 0.6, >= 200 bp; thresholds strict, as the paper states them) \"takai-jones\": Takai & Jones 2002 (GC >= 55%, obs/exp >= 0.65, >= 500 bp; excludes most Alu)"},"mergeGap":{"type":"integer","default":100,"description":"Join passing regions closer than this, when the joined region still passes. Takai & Jones use 100."},"minGcPct":{"type":"number","description":"Override the preset's GC threshold, 0-100."},"sequence":{"type":"string","residues":"nt","description":"DNA to scan (raw or FASTA). Max 5,000,000 bases."},"minLength":{"type":"integer","description":"Override the preset's minimum island length, bp."},"minObsExp":{"type":"number","description":"Override the preset's observed/expected CpG threshold."},"windowSize":{"type":"integer","default":200,"description":"Scanning window in bp. 200 is Takai & Jones' window, and it is used for both presets so the two differ only in their thresholds (Gardiner-Garden & Frommer's 1987 paper scanned 100 bp windows)."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"CpG island finder","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"crispr_grna_design","title":"CRISPR gRNA designer","description":"Find and score candidate guide RNAs (protospacer + PAM) in a target DNA for common nucleases (SpCas9, SpCas9-NG, SaCas9, Cas12a). PREDICTED, NOT MEASURED. No held-out skill statistic is claimed. Both are pre-2016 models, superseded by Rule Set 3 (DeWeirdt et al., Nat Commun 2022) and by DeepHF. Rule Set 3 IS now shipped here, as crispr_ontarget, and unlike these two it carries a held-out calibration: on an independent tiling library, 87.7% / 74.9% / 82.0% of its lowest-scoring guides landed in the bottom two activity quintiles. Prefer it for SpCas9 with an NGG PAM; DeepHF is still not shipped. Treat these two as a ranking aid, not an efficiency prediction. Valid for: SpCas9 with an NGG PAM and a 20 nt spacer, and only when enough genomic flanking context is present to build the model's 30-mer / 35-mer window — both scores are null rather than padded otherwise. Nothing is predicted for SaCas9, Cas12a or SpCas9-NG.","input_schema":{"type":"object","required":["sequence"],"properties":{"minScore":{"type":"number","default":0,"description":"Only return guides with a heuristic score at least this high (0–100)."},"nuclease":{"enum":["spcas9","spcas9ng","sacas9","cas12a"],"type":"string","default":"spcas9","description":"Nuclease id. Omit to just list the available nucleases (no scan is performed)."},"sequence":{"type":"string","residues":"nt","description":"Nucleotide sequence (raw or FASTA; IUPAC accepted)."},"searchReverseStrand":{"type":"boolean","default":true,"description":"Also scan the reverse strand for guides."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"CRISPR gRNA designer","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"crispr_hdr_donor","title":"HDR donor designer","description":"Build an HDR donor (homology arms flanking an edit) from a target sequence and either an explicit edit window (editStart/editEnd) or a guide's cut site (guideStart/guideEnd/guideStrand/nuclease — SpCas9-family only; Cas12a's staggered cut needs an explicit editStart/editEnd). Also designs genotyping primers spanning the edit site on the original sequence (a real size-shift or sequencing target to confirm the edit), reusing the same primer-design engine as primer_design.","input_schema":{"type":"object","required":["targetSequence","replacement"],"properties":{"editEnd":{"type":"integer","description":"1-based inclusive end of the region being replaced; editEnd = editStart-1 denotes a pure insertion with nothing removed. Omit to derive from the guide's cut site."},"blockPam":{"type":"boolean","default":true,"description":"When a SpCas9-family guide is supplied and the edit does not already disrupt its PAM, fold a PAM-blocking mutation (silent when a CDS frame is given) into the donor so the edited allele can't be re-cut."},"guideEnd":{"type":"integer","description":"1-based forward-strand end of the guide's protospacer."},"nuclease":{"enum":["spcas9","spcas9ng","sacas9","cas12a"],"type":"string","default":"spcas9","description":"Needed only when deriving the cut site from guideStart/guideEnd/guideStrand."},"armLength":{"type":"integer","default":500,"description":"Homology arm length (bp) on each side. Use ~30–60 for an ssODN donor, ~500–1000 for a dsDNA donor plasmid."},"editStart":{"type":"integer","description":"1-based start of the region being replaced. Omit to derive from guideStart/guideEnd/guideStrand instead."},"frameStart":{"type":"integer","description":"Optional 1-based CDS reading-frame start; makes the PAM-blocking mutation synonymous where possible."},"guideStart":{"type":"integer","description":"1-based forward-strand start of the guide's protospacer (alternative to editStart/editEnd, for an insertion exactly at the cut site)."},"guideStrand":{"enum":["+","-"],"type":"string","description":"Strand the guide's protospacer is on."},"replacement":{"type":"string","default":"","description":"Sequence to insert/substitute (\"\" for a pure deletion)."},"targetSequence":{"type":"string","residues":"nt","description":"Nucleotide sequence (raw or FASTA; IUPAC accepted)."},"designGenotypingPrimers":{"type":"boolean","default":true,"description":"Also design a primer pair (on the original targetSequence) whose product spans the edit site."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"HDR donor designer","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"crispr_offtarget_check","title":"CRISPR guide off-target check","description":"Screen a guide's protospacer for off-target sites (protospacer match + valid PAM, both strands) against a small curated set of common lab reference genomes (see genomesChecked) — NOT a whole human/mouse genome search. For SpCas9 with a 20 nt spacer each site also gets a Doench 2016 CFD score, so sites are ranked by predicted cut likelihood rather than by mismatch count alone, and the guide gets an aggregate specificity. Use this the same way primer_specificity is used: a useful sanity check within the covered organisms, not a clearance guarantee for a mammalian expression host. PREDICTED, NOT MEASURED. Best of the common off-target scores on the authors' GUIDE-Seq comparison, at Pearson r = 0.40 over 9 guides and 402 sites (vs CCTop 0.31, Hsu-Zhang 0.26) — a useful ranking, not a reliable magnitude. Weights were measured for SINGLE mismatches; multiple mismatches are multiplied, and Listgarten et al. 2018 note the training data never contained a mismatch and an alternative PAM together, so that combination is extrapolation. Valid for: SpCas9 with a 20 nt spacer, which is the only case scored — every other nuclease returns null rather than a number from the wrong enzyme's table. One locus, one cell line. Substitutions only: DNA/RNA bulges are neither searched nor scorable, and a low score is not a claim that a site is safe.","input_schema":{"type":"object","required":["protospacer"],"properties":{"nuclease":{"enum":["spcas9","spcas9ng","sacas9","cas12a"],"type":"string","default":"spcas9","description":"Nuclease id — determines the PAM pattern/side required at each candidate site."},"protospacer":{"type":"string","residues":"nt","maxLength":32,"description":"The guide's protospacer sequence, 5'→3' (no PAM). Max 32 nt — every supported nuclease uses a 20–23 nt guide."},"maxMismatches":{"type":"integer","default":2,"maximum":4,"minimum":0,"description":"Mismatches tolerated between the protospacer and a candidate genomic site. Max 4 — a complete search seeds on maxMismatches+1 non-overlapping blocks, and past that the blocks are too short to be selective against a multi-Mb genome (a site that mismatched more would not be cut anyway)."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"CRISPR guide off-target check","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"crispr_ontarget","title":"CRISPR on-target activity (Rule Set 3)","description":"Score SpCas9 guides for on-target activity with Rule Set 3 (DeWeirdt et al., Nat Commun 2022) — the current successor to the Doench 2014 and CRISPRscan scores crispr_grna_design reports. Give a target sequence to find and score every NGG guide in it — on both strands unless `searchReverseStrand` says otherwise — or give 30-mer contexts directly. The tracrRNA MATTERS and is not cosmetic: Rule Set 3 models it as a feature, and the paper measures its accuracy dropping when the wrong one is specified. Returns a z-scored activity, which ranks guides against each other; it is not a percentage and not a probability of editing. PREDICTED, NOT MEASURED. Held out six datasets (23,629 context sequences) from training; Rule Set 3 (Sequence) had the highest Spearman correlation on three of the six. On a separate tiling library generated for the paper, with every spacer any model had seen removed, it significantly outperformed all other models (p < 0.002) when the correct tracrRNA was given. Calibration on that independent set: of the lowest-scoring guides, 87.7% / 74.9% / 82.0% landed in the bottom two activity quintiles (Hsu / Chen / DeWeirdt tracrRNA), and of the highest-scoring, 77.0% / 69.0% / 75.5% landed in the top two. No single held-out Spearman is quoted here because the paper reports it per gene as a distribution rather than as one figure, and inventing a headline number from a figure would be the fit-residual mistake in a different costume. Valid for: SpCas9 with an NGG PAM and a 20 nt spacer, scored over a 30-mer (4 nt upstream + spacer + PAM + 3 nt downstream) — nothing is padded, so a guide without that flank is skipped rather than estimated. Knockout activity in mammalian pooled screens with a U6/Pol III promoter; the authors expect it to generalize less well to Pol II-transcribed sgRNAs, and in vitro transcribed sgRNAs (as used in zebrafish) are known to be poorly predicted by models trained this way. The tracrRNA must be the one you will actually use. This is Rule Set 3 (Sequence) only: the Sequence+Target model, which adds 6.7% to the Spearman correlation on average, needs per-gene conservation and protein-domain lookups and is not implemented here.","input_schema":{"type":"object","properties":{"tracr":{"enum":["Hsu2013","Chen2013"],"type":"string","default":"Hsu2013","description":"Which tracrRNA the guides will be paired with. Hsu2013 is the one in lentiCRISPRv2 and most published libraries; Chen2013 is the sgRNA(F+E) scaffold used by the Sanger/Yusa libraries. If you use the DeWeirdt (2020) tracrRNA, the paper reports Chen2013 as the better proxy — there is no DeWeirdt option in the model itself."},"contexts":{"type":"array","items":{"type":"string"},"description":"30-mer contexts to score directly: 4 nt upstream + 20 nt spacer + PAM + 3 nt downstream. Give this OR `sequence`."},"sequence":{"type":"string","residues":"nt","description":"Target DNA to find NGG guides in. Give this OR `contexts`."},"searchReverseStrand":{"type":"boolean","default":true,"description":"Also scan the reverse strand for guides. Applies to `sequence` only; a 30-mer in `contexts` is already written on its own guide's strand."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"CRISPR on-target activity (Rule Set 3)","readOnlyHint":true,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"cross_dimer","title":"Cross-Dimer","description":"Screen two oligos for the most stable heterodimer (cross-dimer) between them.","input_schema":{"type":"object","required":["sequenceA","sequenceB"],"properties":{"sequenceA":{"type":"string","residues":"nt","description":"First oligo (5'→3')."},"sequenceB":{"type":"string","residues":"nt","description":"Second oligo (5'→3')."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Cross-Dimer","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"diagnostic_digest","title":"Diagnostic digest planner","description":"Pick the restriction digest that tells your intended construct apart from the wrong ones on a screening gel. Digests every candidate, works out which bands would actually resolve at the chosen agarose percentage (size ratio, the gel's resolving window, and whether a band is too faint to score), and ranks single enzymes — then buffer-checked pairs if no single one works. The criterion is separating the INTENDED construct from every alternative; telling the alternatives apart from each other is reported as a bonus. Get the alternatives from assembly_outcomes.","input_schema":{"type":"object","required":["intended","alternatives"],"properties":{"enzymes":{"type":"array","items":{"type":"string"},"description":"Restrict the search to these enzymes (e.g. the ones on your bench). Default is the whole curated set of 49. An unrecognized name is rejected rather than skipped, so \"does not discriminate\" always means it was actually tried."},"circular":{"type":"boolean","default":true,"description":"Treat every candidate as a circular plasmid."},"intended":{"type":"string","residues":"nt","description":"The construct you designed, raw or FASTA."},"alternatives":{"type":"array","items":{"type":"object","required":["sequence"],"properties":{"label":{"type":"string","description":"What this wrong construct is (\"empty vector\", \"insert reversed\")."},"sequence":{"type":"string","description":"Its full sequence, raw or FASTA."}}},"description":"The wrong constructs to screen against, 1-12. assembly_outcomes emits these ready-made as `forDiagnosticDigest`."},"includePairs":{"enum":["auto","always","never"],"type":"string","default":"auto","description":"Whether to search double digests. \"auto\" adds them only when no single enzyme separates everything."},"agarosePercent":{"type":"number","default":1,"description":"Agarose percentage of the screening gel. Snapped to the nearest tabulated value (0.5, 0.7, 1, 1.2, 1.5, 2) and the one used is reported back, since the resolving window is what decides which bands separate."},"maxSuggestions":{"type":"number","default":5,"description":"How many ranked options to return."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Diagnostic digest planner","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"dna_molarity","title":"DNA molarity calculator","description":"Nucleic-acid quantity conversions: molar mass, amount (pmol/nmol), molar and mass concentration, and copy number, from mass ± volume and either a length or a sequence.","input_schema":{"type":"object","required":[],"properties":{"type":{"enum":["dsDNA","ssDNA","ssRNA"],"type":"string","default":"dsDNA","description":"Molecule type."},"length":{"type":"integer","default":1000,"description":"Length in bp (dsDNA) or nt (ssDNA/ssRNA). Ignored when a sequence is given."},"massNg":{"type":"number","default":100,"description":"Mass in nanograms."},"sequence":{"type":"string","residues":"nt","description":"Optional sequence — overrides length and gives an exact molar mass from base composition."},"volumeUl":{"type":"number","default":0,"description":"Volume in microlitres (0 = unknown; needed for concentration)."},"targetUnit":{"enum":["nM","uM","ngPerUl"],"type":"string","default":"nM","description":"Unit for targetConcentration."},"targetVolumeUl":{"type":"number","default":20,"description":"Final volume of the diluted sample, in µL."},"targetConcentration":{"type":"number","description":"Optional: the concentration you need. Supplying it (with volumeUl, so there is a stock concentration to dilute FROM) returns a `dilution` plan — µL of stock and µL of diluent — instead of leaving C1V1 = C2V2 to be done by hand. The stock and the target may be quoted in different units; the molar mass converts between them."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"DNA molarity calculator","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"dot_plot","title":"Dot plot (sequence comparison)","description":"Word-match dot plot between two sequences, on both strands, returned as diagonal RUNS rather than points. This is the view that shows what a single best alignment hides: internal repeats, tandem duplications, and inversions — an inversion appears as a run on the falling diagonal and as nothing at all in a normal pairwise alignment. Compare a sequence with itself to map its own repeats. Word size is chosen from the input lengths when you do not set one, because too short a word fills the plot with chance matches that the eye reads as homology.","input_schema":{"type":"object","required":["a","b"],"properties":{"a":{"type":"string","residues":"nt","description":"First sequence (raw or FASTA). Max 200,000 nt."},"b":{"type":"string","residues":"nt","description":"Second sequence. Pass the same sequence as \"a\" to find its internal repeats. Max 200,000 nt."},"maxRuns":{"type":"integer","default":2000,"description":"Most runs to return, longest first."},"wordSize":{"type":"integer","maximum":64,"minimum":4,"description":"Exact-match word length. Omit to pick one from the sequence lengths."},"bothStrands":{"type":"boolean","default":true,"description":"Also search the reverse complement, which is what reveals inversions."},"minRunLength":{"type":"integer","default":0,"description":"Drop runs shorter than this before returning. 0 = keep every run at least wordSize long."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Dot plot (sequence comparison)","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"double_digest","title":"Double digest buffer","description":"Recommend a single NEB buffer (and flag caveats) for digesting with two enzymes in one tube.","input_schema":{"type":"object","required":["enzymeA","enzymeB"],"properties":{"enzymeA":{"type":"string","description":"First enzyme name (e.g. EcoRI)."},"enzymeB":{"type":"string","description":"Second enzyme name (e.g. BamHI)."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Double digest buffer","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"editing_plate_quantify","title":"Editing quantification across a plate (one control, many wells)","description":"Quantify a whole plate of edited samples against ONE untreated control trace and return a single sortable table — the plate-scale form of sanger_indel_spectrum, base_edit_quant and sanger_knockin_quant, chosen with `mode`. Each sample gives one row keyed by its id, carrying the headline number for that mode (edited fraction / editing at the target base / intended knock-in percentage), the fit-quality numbers behind it (R², or the background n and noise floor for base mode), and fitAdequate — the single-sample tool's own gate verdict on that row, so the plate cannot drift from the per-well answer. Failure is isolated per well: a sample whose read is short, mismatched or unfittable becomes a failed ROW with its error message and the other 95 still come back, while an error about the control trace, the mode or the work ceilings throws, because it is wrong for every row. Duplicate sample ids are suffixed (against the whole plate, so the suffix never lands on another well's name) rather than merged. Arguments are strict: an argument belonging to another mode, an unknown argument, an out-of-range limit, and an `offset` override (which is a property of one pair of reads, not of a plate) are all rejected rather than ignored or clamped, because at plate scale a substituted setting rewrites every row identically and nothing in the table looks odd. Returns the rows in input order, a tally, and a CSV. Comparing two wells' percentages is only meaningful when both rows are fitAdequate, which is why the plate summary is computed over those rows alone. PREDICTED, NOT MEASURED. None is published for this implementation, and being a batch does not soften that: each row is exactly the claim the corresponding single-sample tool makes. What every row instead reports is what it rests on — R² for the indel and knock-in modes, the background n, sd and noise floor for base mode — plus fitAdequate, which is the single-sample tool's OWN gate verdict on that row rather than a threshold re-invented here. Recovery of known synthetic mixtures is deliberately NOT offered as validation: it tests the arithmetic and the plate plumbing, not whether the model fits a real capillary trace, and for a knock-in with novel inserted bases it is circular, because a synthetic trace is built from the same idealised peaks the basis assumes. Quoting it would be the mistake rbs_predict made when it shipped a calibration residual as held-out skill. Valid for: One control read and a set of edited reads that are all the SAME amplicon, chemistry and primer as that control, with each read extending well past the edit site. COMPARING TWO WELLS' PERCENTAGES IS ONLY MEANINGFUL WHEN BOTH ROWS ARE fitAdequate: a percentage from a badly fitting well is not a smaller number than one from a well that fitted, it is a different kind of statement, and the plate summary here is therefore computed over the adequate rows only. Ranking wells also assumes they differ only in the variable under test — the same control is subtracted from all of them, so a well whose read started 30 bases later or whose reaction was dirty carries that difference into its number. Mode-specific limits carry over unchanged: indel mode is blind to substitutions, base mode is blind to indels and its percentages run low by roughly the crosstalk fraction, and knock-in mode cannot separate an intended pure deletion from an NHEJ deletion of the same length at the same site.","input_schema":{"type":"object","required":["mode","controlBases","controlChannels","samples"],"properties":{"to":{"type":"string","residues":"nt","description":"base mode: the base it converts to, as READ on the control strand."},"from":{"type":"string","residues":"nt","description":"base mode: the base the editor converts, as READ on the control strand."},"mode":{"enum":["indel","base","knockin"],"type":"string","description":"Which quantifier to run on every well. \"indel\" = sanger_indel_spectrum (NHEJ efficiency and the indel spectrum; needs cutPosition; blind to substitutions). \"base\" = base_edit_quant (CBE/ABE conversion; needs an editor id + protospacer, or an explicit window with from/to; blind to indels). \"knockin\" = sanger_knockin_quant (a specific intended edit against its byproducts; needs editKind + editPosition). Arguments belonging to another mode are rejected, not ignored."},"guard":{"type":"number","default":3,"description":"indel mode: bases skipped immediately after the cut, where the trace is least reliable. A whole number >= 0; a negative value is rejected, not clamped to 0."},"editor":{"enum":["be3","be4max","abe7.10","abe8e"],"type":"string","description":"base mode: base editor id (be3, be4max, abe7.10, abe8e) — fixes the converted bases and the activity window in protospacer coordinates. Requires \"protospacer\". Mutually exclusive with windowStart/windowEnd/from/to."},"samples":{"type":"array","items":{"type":"object","required":["bases","channels"],"properties":{"id":{"type":"string","description":"Well or sample name — this keys the row. A number is tolerated and read as its digits. Duplicates are suffixed (\"A01#2\", stepping past any name already in use), never merged; an empty or absent id becomes sample_<n>."},"bases":{"type":"string","description":"Base calls of this well's read (raw or FASTA)."},"channels":{"type":"array","items":{"type":"array","items":{"type":"number","minimum":0}},"description":"Per-base [A, C, G, T] intensities for this well, same convention as the control, and non-negative for the same reason."}},"additionalProperties":false},"maxItems":384,"description":"The plate's edited wells, in the order you want them tabulated. Up to 384 samples (96 is the natural plate) and 400,000 trace positions across the whole call, control included — that is already an 8-10 MB request body, so split a plate of untrimmed reads rather than sending one call."},"editKind":{"enum":["substitution","insertion","deletion","replacement"],"type":"string","description":"knockin mode (required): shape of the intended edit. \"substitution\" replaces bases one for one; \"insertion\" adds novel bases and replaces none; \"deletion\" removes bases and adds none; \"replacement\" is the general case where the lengths differ."},"maxIndel":{"type":"number","default":10,"description":"indel and knockin modes: largest indel to fit, in bp — a whole number, 1-20. Out of range is rejected, not clamped."},"altAllele":{"type":"string","residues":"nt","description":"knockin mode: the bases installed in their place."},"refAllele":{"type":"string","residues":"nt","description":"knockin mode: the control bases the edit replaces (substitution and replacement). Checked against the control read once, before any well is fitted."},"windowEnd":{"type":"number","description":"base mode: explicit window end, 1-based inclusive. Window length is capped at 40."},"zThreshold":{"type":"number","default":3,"description":"base mode: significance threshold in standard deviations of each well's own background (1-10; out of range is rejected, not clamped). Raising it raises the reported noise floor with it."},"cutPosition":{"type":"number","description":"indel mode (required): 1-based position of the expected cut, in CONTROL read coordinates. knockin mode (optional): 1-based CONTROL position where UNINTENDED indels start — the nuclease cut or the PE nick; defaults to the edit start."},"insertedSeq":{"type":"string","residues":"nt","description":"knockin mode: the novel bases inserted (insertion only)."},"protospacer":{"type":"string","residues":"nt","description":"base mode: the 20-nt spacer, located in the CONTROL read (either strand; must match exactly once)."},"windowStart":{"type":"number","description":"base mode: explicit window start, 1-based in CONTROL coordinates. Requires windowEnd, from and to."},"controlBases":{"type":"string","residues":"nt","description":"Base calls of the ONE untreated control read (raw or FASTA)."},"editPosition":{"type":"number","description":"knockin mode (required): 1-based CONTROL position of the first base the edit replaces. An insertion replaces nothing, so there it is the base the insert lands immediately BEFORE — one MORE than the VCF/HGVS anchor."},"windowLength":{"type":"number","default":70,"description":"indel and knockin modes: bases downstream used for the decomposition — a whole number, 20-300. Out of range is rejected, not clamped."},"deletedLength":{"type":"number","description":"knockin mode: how many bases are deleted (deletion only)."},"targetPosition":{"type":"number","description":"base mode: 1-based CONTROL position of the intended edit. Give it for a plate. Without it each well's headline is its OWN most-edited significant position, so two rows can be reporting two different bases and the column is not one measurement."},"controlChannels":{"type":"array","items":{"type":"array","items":{"type":"number","minimum":0}},"maxItems":3000,"description":"Per-base [A, C, G, T] intensities of the control read, one row per called base, read at that base's peak location (trace arrays are indexed by scan, not by base). Raw peak heights: every intensity must be >= 0, because negatives are clamped to zero during normalization and a baseline-subtracted trace would silently lose its minor peaks and read as unedited."},"targetProtospacerPosition":{"type":"number","description":"base mode: 1-based protospacer position of the intended edit (PAM-distal = 1). Editor mode only."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Editing quantification across a plate (one control, many wells)","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"elsa_capacity","title":"How many sgRNAs fit in one non-repetitive array","description":"Report how many promoters, sgRNA handles and neutral spacers are available at each maximum-shared-length threshold, and therefore the longest extra-long sgRNA array that can be built without reusing a part. Ask this before designing: the answer is a property of the measured parts collection, not of your guides, and it is the constraint that decides the design. Deterministic — it is a selection over a fixed table.","input_schema":{"type":"object","required":[],"properties":{"lmax":{"type":"integer","maximum":40,"minimum":8,"description":"Report a single threshold. Omit to get the whole curve from 8 to 24."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"How many sgRNAs fit in one non-repetitive array","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"elsa_design","title":"Design an extra-long sgRNA array","description":"Build a multiplexed CRISPR array that expresses many sgRNAs from one cassette and shares no long stretch with itself. Twenty sgRNAs built the obvious way carry twenty copies of the same Cas9 scaffold, promoter and terminator — a construct that recombines in the cell and that synthesis vendors refuse — so this draws each transcription unit's parts from the measured non-repetitive collection of Reis et al. (2019), selecting ACROSS promoters, handles and spacers at once rather than within each type, then re-measures the assembled molecule for repeats the junctions created. Returns the sequence, an annotated GenBank file and the pool usage. Takes guides; it does not choose or score them — use crispr_grna_design and crispr_offtarget_check for that.","input_schema":{"type":"object","required":["guides"],"properties":{"lmax":{"type":"integer","default":12,"maximum":40,"minimum":8,"description":"Longest stretch any two parts in the array may share, in bp (default 12). Lower is more stable and leaves fewer parts to choose from: the handle pool offers 12 at lmax 12, 18 at 15 and 24 at 20. Run elsa_capacity first."},"name":{"type":"string","description":"LOCUS name for the GenBank output."},"guides":{"type":"array","items":{"type":"string"},"description":"The 20 nt protospacers, in array order, WITHOUT their PAM. Strings, or {name, sequence} objects to label each unit. Max 27 — the size of the handle collection."},"insulate":{"type":"boolean","default":true,"description":"Place a neutral spacer between transcription units. Turning it off frees the spacer pool from the selection, which can let a longer array fit at a low lmax."},"includeGenbank":{"type":"boolean","default":true,"description":"Return the annotated GenBank file."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Design an extra-long sgRNA array","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"export_echo_picklist","title":"Echo picklist export","description":"Generate a downloadable Beckman/Labcyte Echo acoustic-liquid-handler picklist CSV (columns: Source Plate Name, Source Plate Type, Source Well, Destination Plate Name, Destination Well, Transfer Volume, Name — the header row reproduced from PyEcho, a real open-source Echo-picklist generator) for the given PCR reactions, at the same well positions export_plate_layout assigns. Assumes a 5 uL Echo-scale PCR reaction (master mix 2500 nL, each primer 250 nL, template 250 nL, water 1750 nL) — a commonly used acoustic-dispensing miniaturization scale, not a universal standard; rescale the volumes for your own protocol. Source/Destination Plate Type uses a placeholder Echo plate-type code (384PP_AQ_BP) — replace with the exact type from your own Echo Plate Type Library. Each distinct template label gets its own well on the TemplateSource plate, row-major (A1, A2, … A24, then B1, …) across that 384-well source plate.","input_schema":{"type":"object","required":["reactions"],"properties":{"reactions":{"type":"array","items":{"type":"object","required":["forward","reverse"],"properties":{"name":{"type":"string","description":"Reaction/construct name."},"forward":{"type":"string","description":"Forward primer sequence, 5'->3' (IUPAC accepted)."},"reverse":{"type":"string","description":"Reverse primer sequence, 5'->3' (IUPAC accepted)."},"template":{"type":"string","description":"Optional template name/id — a short label (e.g. a plasmid or sample name), not a sequence."}}},"description":"One entry per PCR reaction, up to 96 (a single 96-well plate)."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Echo picklist export","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"export_opentrons_protocol","title":"Opentrons protocol export","description":"Generate a downloadable Opentrons Python Protocol API (v2, OT-2) script that sets up the given PCR reactions on a 96-well PCR plate, at the same well positions export_plate_layout assigns. Uses real Opentrons labware/pipette API names confirmed against docs.opentrons.com and the Opentrons shared-data labware-definitions repository (opentrons_96_wellplate_200ul_pcr_full_skirt, opentrons_96_tiprack_20ul, opentrons_24_tuberack_nest_1.5ml_snapcap, nest_12_reservoir_15ml, p20_single_gen2) and the confirmed load_labware/load_instrument/transfer method signatures. Master-mix/primer/template/water volumes are clearly-labeled placeholder constants at the top of the script — this is a starting point to review and adapt for your own enzyme and instrument, not a certified ready-to-run protocol.","input_schema":{"type":"object","required":["reactions"],"properties":{"reactions":{"type":"array","items":{"type":"object","required":["forward","reverse"],"properties":{"name":{"type":"string","description":"Reaction/construct name."},"forward":{"type":"string","description":"Forward primer sequence, 5'->3' (IUPAC accepted)."},"reverse":{"type":"string","description":"Reverse primer sequence, 5'->3' (IUPAC accepted)."},"template":{"type":"string","description":"Optional template name/id — a short label (e.g. a plasmid or sample name), not a sequence."}}},"description":"One entry per PCR reaction, up to 96 (a single 96-well plate)."},"protocolName":{"type":"string","description":"Optional protocol name (used in the script's metadata)."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Opentrons protocol export","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"export_plate_layout","title":"PCR plate layout","description":"Assign a set of PCR reactions (name + forward/reverse primer + optional template label) to wells on a 96-well plate, row-major (A1, A2, … A12, then B1, B2, … up to H12). Returns the well-assignment data for rendering a plate diagram; export_opentrons_protocol and export_echo_picklist build their downloadable files from this exact same layout, so all three always agree.","input_schema":{"type":"object","required":["reactions"],"properties":{"reactions":{"type":"array","items":{"type":"object","required":["forward","reverse"],"properties":{"name":{"type":"string","description":"Reaction/construct name."},"forward":{"type":"string","description":"Forward primer sequence, 5'->3' (IUPAC accepted)."},"reverse":{"type":"string","description":"Reverse primer sequence, 5'->3' (IUPAC accepted)."},"template":{"type":"string","description":"Optional template name/id — a short label (e.g. a plasmid or sample name), not a sequence."}}},"description":"One entry per PCR reaction, up to 96 (a single 96-well plate)."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"PCR plate layout","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"expression_cassette_check","title":"Will this construct express?","description":"Check the ARRANGEMENT around each coding sequence, which is what decides whether a finished clone expresses at all: a promoter for the named host within reach on the same strand, a Shine-Dalgarno at a workable spacing (bacteria) or a Kozak context (eukaryote), every tag in the CDS's own reading frame, and a terminator or polyA signal downstream. Paste an annotated GenBank record and the CDS features are used; paste bare sequence and the long ORFs are found instead. Nothing here predicts a LEVEL — it reports what is present, absent or out of frame, and every absence names the signature library it was decided against rather than claiming the construct has none.","input_schema":{"type":"object","required":["sequence"],"properties":{"host":{"enum":["auto","bacteria","mammalian"],"type":"string","default":"auto","description":"Which host the cassette is for. `auto` infers it from the elements actually found (a CMV/polyA plasmid reads as mammalian, a T7/lac one as bacterial) and says in the result that it did."},"circular":{"type":"boolean","default":true,"description":"Treat the construct as circular when annotating it."},"sequence":{"type":"string","residues":"nt","description":"The construct: a GenBank record (its CDS, promoter, terminator and tag features are used) or bare DNA."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Will this construct express?","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"expression_heatmap_cluster","title":"Expression heatmap clustering","description":"Hierarchically cluster a genes x samples expression matrix (UPGMA/average, complete, or single linkage; Euclidean or correlation distance) and return the row/column leaf order, dendrogram merge trees, and row-z-scored values for the Clustered Expression Heatmap visualization.","input_schema":{"type":"object","required":["genes","samples","values"],"properties":{"genes":{"type":"array","items":{"type":"string"},"description":"Row (gene) labels."},"values":{"type":"array","items":{"type":"array","items":{"type":"number"}},"description":"genes x samples numeric matrix — one row per gene, in the same order as `genes`."},"linkage":{"enum":["average","complete","single"],"type":"string","default":"average","description":"average = UPGMA (standard default), complete = farthest-neighbor, single = nearest-neighbor."},"samples":{"type":"array","items":{"type":"string"},"description":"Column (sample) labels."},"zScoreRows":{"type":"boolean","default":true,"description":"Row-wise z-score each gene's values before clustering and returning (the conventional 'relative expression' heatmap normalization — the dendrograms are computed on the same scaled matrix the heatmap shows, as in seaborn's clustermap(z_score=0) / pheatmap's scale=\"row\")."},"clusterCols":{"type":"boolean","default":true,"description":"Cluster (reorder) samples."},"clusterRows":{"type":"boolean","default":true,"description":"Cluster (reorder) genes."},"distanceMetric":{"enum":["euclidean","correlation"],"type":"string","default":"correlation","description":"correlation = 1 - Pearson r (the standard expression-heatmap default); euclidean = straight-line distance."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Expression heatmap clustering","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"fasta_filter","title":"Filter a multi-record file","description":"Keep a subset of a FASTA file: by length, by a LIST of names (the shape \"filter by ID\" actually takes — two hundred accessions, not one substring), by a drop list, and by removing records that are the same sequence twice. Every dropped record comes back named with the one rule that removed it, because a count says you lost 88 sequences and not which. Identical sequences are reported whether or not they were asked to be dropped: a folder concatenated twice looks fine until something downstream counts it.","input_schema":{"type":"object","required":["input"],"properties":{"input":{"type":"string","description":"A multi-record FASTA."},"maxLength":{"type":"integer","description":"Longest sequence to keep."},"minLength":{"type":"integer","description":"Shortest sequence to keep, in residues."},"nameContains":{"type":"string","description":"Keep a record whose name contains ANY of these, case-insensitively. Separated by commas, spaces or newlines."},"nameExcludes":{"type":"string","description":"Drop a record whose name contains any of these. Applied after the keep list."},"dropDuplicateSequences":{"type":"boolean","default":false,"description":"Keep only the first record of each identical sequence."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Filter a multi-record file","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"fastq_qc_report","title":"FASTQ Deep QC Report","description":"FastQC-style deep quality-control report for a FASTQ file: per-base quality and content, GC and length distributions, sequence duplication levels, overrepresented sequences, and adapter content — each with a warn/fail verdict against FastQC's own published thresholds.","input_schema":{"type":"object","required":["input"],"properties":{"input":{"type":"string","description":"FASTQ text: records of an '@id' header, sequence, '+' separator and quality line (four lines each)."},"qualityOffset":{"enum":[33,64],"type":"integer","default":33,"description":"ASCII offset of the FASTQ quality string. 33 for anything modern, 64 for pre-1.8 Illumina."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"FASTQ Deep QC Report","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"fastq_trim","title":"FASTQ Adapter & Quality Trimmer","description":"Trim FASTQ reads: an ungapped sliding-suffix adapter match (against the same named Illumina adapters as the QC report) followed by a BWA-style 3' quality trim (the same algorithm Cutadapt's own -q option reuses), then drops reads below a minimum length. Returns the trimmed FASTQ plus before/after read-count, mean-length and mean-quality stats.","input_schema":{"type":"object","required":["input"],"properties":{"input":{"type":"string","description":"FASTQ text: records of an '@id' header, sequence, '+' separator and quality line (four lines each)."},"minLength":{"type":"integer","default":20,"description":"Reads shorter than this after trimming are dropped."},"qualityOffset":{"enum":[33,64],"type":"integer","default":33,"description":"ASCII offset of the FASTQ quality string. 33 for anything modern, 64 for pre-1.8 Illumina."},"qualityThreshold":{"type":"integer","default":20,"description":"3' quality-trim threshold (Phred score)."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"FASTQ Adapter & Quality Trimmer","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"find_orfs","title":"ORF Finder","description":"Find open reading frames (ATG…stop) across all six frames.","input_schema":{"type":"object","required":["sequence"],"properties":{"limit":{"type":"integer","default":100,"maximum":5000,"minimum":1,"description":"How many ORFs to return, longest first. `count` always reports every ORF found and `truncated` says whether the list was cut."},"sequence":{"type":"string","residues":"nt","description":"Nucleotide sequence (raw or FASTA; IUPAC accepted)."},"minAaLength":{"type":"integer","default":30,"description":"Minimum protein length (aa) to report."},"requireStop":{"type":"boolean","default":false,"description":"Only report ORFs terminated by a stop codon."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"ORF Finder","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"format_sequence","title":"Format Sequence","description":"Clean, case-fold, DNA↔RNA convert, reverse and line-wrap a sequence.","input_schema":{"type":"object","required":["sequence"],"properties":{"width":{"type":"integer","default":60,"description":"Line-wrap width; 0 = single line."},"convert":{"enum":["none","toRna","toDna"],"type":"string","default":"none","description":"DNA→RNA (T→U) or RNA→DNA (U→T)."},"reverse":{"type":"boolean","default":false,"description":"Reverse the sequence (no complement)."},"caseMode":{"enum":["keep","upper","lower"],"type":"string","default":"keep"},"sequence":{"type":"string","residues":"nt","description":"Nucleotide sequence (raw or FASTA; IUPAC accepted)."},"stripNonLetters":{"type":"boolean","default":true,"description":"Remove digits, spaces and gaps (keep letters only)."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Format Sequence","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"functional_enrichment","title":"Functional enrichment (GO + Reactome)","description":"Over-representation analysis: test which GO terms (biological process / molecular function / cellular component) and Reactome pathways are statistically enriched in a query gene list versus a background, using the hypergeometric test with Benjamini-Hochberg FDR correction across all tested terms. Uses bundled GO Consortium + Reactome reference data (human only). KEGG is not included (its license does not permit bundling gene sets).","input_schema":{"type":"object","required":["genes"],"properties":{"genes":{"type":"array","items":{"type":"string"},"description":"Query gene symbols (human, e.g. \"TP53\"). Case-insensitive. Capped at 5000."},"background":{"type":"array","items":{"type":"string"},"description":"Custom background/universe gene symbols. If omitted, defaults to every gene present in the bundled GO+Reactome dataset (the 'only annotated genes' convention, as used by g:Profiler) rather than the whole genome."},"collections":{"type":"array","items":{"enum":["GO:BP","GO:MF","GO:CC","Reactome"],"type":"string"},"default":["GO:BP","GO:MF","GO:CC","Reactome"],"description":"Which term collections to test. Defaults to all four."},"maxTermSize":{"type":"integer","default":500,"description":"Skip terms/pathways with more than this many background genes (matches clusterProfiler's default)."},"minTermSize":{"type":"integer","default":3,"description":"Skip terms/pathways with fewer than this many background genes."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Functional enrichment (GO + Reactome)","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"gc_content","title":"GC Content","description":"GC content, AT content and per-base composition of a sequence.","input_schema":{"type":"object","required":["sequence"],"properties":{"sequence":{"type":"string","residues":"nt","description":"Nucleotide sequence (raw or FASTA; IUPAC accepted)."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"GC Content","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"gel_band_size","title":"Band size from a gel, against a marked ladder","description":"Calibrate a gel lane against a marked DNA ladder and read the size of any other band from how far it ran. Migration distance is approximately linear in log(size) over a gel's resolving range, so a least-squares line through the marked rungs interpolates between them — and NOT outside them, which is why a band beyond the marked span comes back flagged `extrapolated` rather than quietly clamped to the nearest rung. Reports R² and the per-rung residual, because one mis-marked rung (a doublet marked as one band, a mis-clicked centre) shifts every size on the gel and a single R² hides it. Distances may be in pixels, millimetres or anything else, as long as they are all measured the same way from the same reference line.","input_schema":{"type":"object","required":["ladder","ladderDistances"],"properties":{"ladder":{"type":"string","description":"Which ladder is in the marked lane. One of: 1 kb, GeneRuler 1 kb, 1 kb Plus, 1 kb Plus (legacy), 100 bp."},"bandDistances":{"type":"array","items":{"type":"number"},"description":"How far each band you want a size for ran, in the same unit from the same reference line. May be empty: the fit and its per-rung residuals are an answer on their own, and are how you find out the ladder was marked correctly before reading anything off it."},"ladderDistances":{"type":"array","items":{"type":"number"},"description":"How far each visible ladder band ran, in any consistent unit, measured from the same reference line (the well) as the query bands. Order does not matter — they are sorted and matched to the ladder's sizes largest-first, since a larger fragment runs less far. At least 3: two points fit a line exactly, so they cannot show whether the ladder was marked correctly."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Band size from a gel, against a marked ladder","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"gene_dossier","title":"Gene/Target Dossier","description":"A gene/drug-target dossier fanned out to five independent sources in one call: Open Targets (function, tractability, top associated diseases), an NCBI/UniProt plain-English function summary, ChEMBL (known drugs and their mechanism/clinical phase, cross-referenced with indications), ClinicalTrials.gov (trials by gene/condition term), and Europe PMC (top cited papers). Each source fails independently — a down source returns null/empty for its own section rather than failing the whole call, and every failure is listed in \"sourceErrors\" rather than silently omitted.","input_schema":{"type":"object","required":["gene"],"properties":{"gene":{"type":"string","description":"A human gene symbol (\"TP53\") or Ensembl gene ID (\"ENSG00000141510\")."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Gene/Target Dossier","readOnlyHint":true,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"gene_expression","title":"Gene Expression Fingerprint","description":"A gene's tissue-expression fingerprint: per-tissue median TPM from GTEx (v8) and subcellular localization / RNA tissue-specificity / protein class from the Human Protein Atlas, in one call.","input_schema":{"type":"object","required":["gene"],"properties":{"gene":{"type":"string","description":"A human gene symbol (\"TP53\") or Ensembl gene ID (\"ENSG00000141510\")."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Gene Expression Fingerprint","readOnlyHint":true,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"gene_model","title":"Gene Model (Exon/CDS Structure)","description":"The real exon/UTR/CDS structure of a human gene's canonical transcript, fetched live from Ensembl (the same exon/CDS map the HGVS Converter tool uses) — for rendering an exon diagram.","input_schema":{"type":"object","required":["gene"],"properties":{"gene":{"type":"string","description":"A human gene symbol (\"TP53\") or Ensembl gene ID (\"ENSG00000141510\")."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Gene Model (Exon/CDS Structure)","readOnlyHint":true,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"genome_region","title":"Fetch a gene's region from a genome","description":"Find a gene in an assembly by symbol or locus tag and return its sequence with however much flanking DNA you ask for — the step before designing a knockout, a C-terminal tag or an HDR donor, where you know the gene's name but not its coordinates. Give the assembly accession (GCF_000005845.2 for E. coli K-12 MG1655) and the gene (araC, or the locus tag b0064). `upstream` is upstream OF THE GENE: on a minus-strand gene that is the higher genomic coordinate, and the sequence comes back 5'→3' along the gene either way. Only an EXACT symbol or locus-tag match is used — NCBI's text search is fuzzy and ranks unrelated genes first, so a loose match is reported as a refusal naming what it found rather than answered with the wrong locus.","input_schema":{"type":"object","required":["assembly","gene"],"properties":{"gene":{"type":"string","description":"Gene symbol or locus tag, matched exactly and case-insensitively (araC, b0064)."},"format":{"enum":["fasta","genbank"],"type":"string","default":"fasta","description":"GenBank brings the annotation that falls inside the region; FASTA is sequence only."},"assembly":{"type":"string","description":"Assembly accession, with its version — e.g. GCF_000005845.2. GCF_ (RefSeq) carries annotation more often than GCA_."},"upstream":{"type":"integer","default":0,"maximum":500000,"minimum":0,"description":"Bases to include before the gene's 5' end (its promoter side)."},"downstream":{"type":"integer","default":0,"maximum":500000,"minimum":0,"description":"Bases to include after the gene's 3' end."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Fetch a gene's region from a genome","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"golden_gate_design","title":"Golden Gate overhang set designer","description":"CHOOSE a set of 4-base Golden Gate/MoClo junction overhangs, rather than scoring one you already have. Maximizes the fidelity of the set's WEAKEST junction against the same published T4-ligase ligation data golden_gate_fidelity scores with, subject to every member actually ligating well — an overhang can score a perfect ratio simply because nothing was ever measured cross-reacting with it, and 94% of the ligation matrix is zeros. Pin the overhangs your vector already commits you to with `fixed`, forbid others with `forbidden`, and give `junctions` when the junctions sit at real positions in real sequence and may only slide a few bases. Reports whether the search was exhaustive (provably the best available) or budget-limited (the best found).","input_schema":{"type":"object","required":["count"],"properties":{"count":{"type":"integer","maximum":40,"minimum":2,"description":"How many junctions the assembly has, INCLUDING any given in `fixed`."},"fixed":{"type":"array","items":{"type":"string"},"description":"Overhangs that must appear — typically the ones the destination vector already commits you to. Scored like any other member; simply not swappable."},"dataset":{"enum":["generic-t4-37c-1h","bsai-hfv2"],"type":"string","default":"generic-t4-37c-1h","description":"Which real ligation dataset to optimize against."},"forbidden":{"type":"array","items":{"type":"string"},"description":"Overhangs the design may not use, whatever they score."},"junctions":{"type":"array","items":{"type":"object"},"description":"One entry per junction still to be chosen, as {sequence, position, slide}: the construct sequence, the 1-based first base of the preferred overhang, and how many bases either side the junction may move. Use this instead of a free design when the junctions are real places in real DNA — the candidates then come from bases that actually exist. Length must equal count minus fixed."},"minCorrectSignal":{"type":"number","description":"Reject any overhang whose own correct-join signal is below this. Defaults to the chosen dataset's MEDIAN diagonal (2,694 for generic T4, 520 for BsaI-HFv2 — they differ five-fold, which is why this is derived rather than fixed). Set 0 to allow every overhang."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Golden Gate overhang set designer","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"golden_gate_fidelity","title":"Golden Gate overhang fidelity","description":"Score a candidate set of 4-base Golden Gate/MoClo junction overhangs against real published T4-ligase ligation-count data: per-overhang specificity, the weakest link in the set, and any risky cross-reacting pairs. Optionally compare against a named published overhang set. This is SeqBench's own transparent scoring methodology — it does not reproduce NEB's/Potapov's own published aggregate fidelity percentages for named sets (their exact formula isn't disclosed anywhere accessible).","input_schema":{"type":"object","required":["overhangs"],"properties":{"dataset":{"enum":["generic-t4-37c-1h","bsai-hfv2"],"type":"string","default":"generic-t4-37c-1h","description":"Which real ligation dataset to score against — generic T4 ligase, or an enzyme-specific one-pot dataset if that matches your actual digestion enzyme."},"overhangs":{"type":"array","items":{"type":"string"},"description":"The candidate 4-base overhangs for one assembly (e.g. [\"GGAG\",\"TACT\",\"AATG\"]). At least 2, no duplicates."},"riskThreshold":{"type":"number","default":0.05,"description":"Flag a pair as risky when the cross-reaction is at least this fraction of that pair's own total signal."},"compareToNamedSet":{"enum":["pryor-2020-plant-11","pryor-2020-20set","cidar-moclo"],"type":"string","description":"Also score this published reference set (see namedSetsAvailable in the output) alongside your candidate set, for comparison."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Golden Gate overhang fidelity","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"golden_gate_from_parts","title":"Golden Gate from part plasmids","description":"Golden Gate as the reaction runs: digest pre-domesticated part plasmids with a Type IIS enzyme and assemble them in the order their OVERHANGS dictate. The fragment released from each part is the one carrying no recognition site (the site goes out with the backbone, which is why a mis-ordered assembly is not re-cut), and the assembly order is an OUTPUT — a set whose overhangs do not close into a single cycle has no product, and the reason is the answer. Distinct from cloning_simulate's `goldengate` method, which does the other job: designing the primers that ADD the sites to BARE parts, assembled in the order you list them.","input_schema":{"type":"object","required":["parts"],"properties":{"parts":{"type":"array","items":{"type":"object"},"maxItems":24,"minItems":2,"description":"The part plasmids: [{ name, sequence, circular }]. Each needs two Type IIS sites facing INWARDS at the part. `circular` defaults to true, which is what a level-0 part plasmid is. 2-24 parts, each at most 30,000 bp and 200,000 bp in total."},"enzyme":{"enum":["BsaI","BsmBI","BbsI","SapI"],"type":"string","default":"BsaI","description":"Type IIS enzyme (BsaI, BsmBI, BbsI, SapI). NEB's variant names (BsaI-HFv2, BbsI-HF, BsmBI) fold to the parent enzyme; any other name is rejected rather than substituted, since site, spacer and overhang length are all enzyme-specific."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Golden Gate from part plasmids","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"golden_gate_library","title":"Golden Gate combinatorial library","description":"Every combination of interchangeable part plasmids, assembled. Give the alternatives at each position — three promoters, four coding sequences, two terminators, one backbone — and it builds all twenty-four, reporting which close into a plasmid, which do not and why, and whether two combinations built the same molecule (nearly always one part under two names, which makes the library smaller than it looks). Interchangeability is MEASURED rather than taken from a kit table: parts are alternatives at a position when the enzyme releases the same overhang pair from each, which is true of a published standard and of your own, and cannot disagree with the plasmid in the tube. Past 500 combinations it refuses with the number rather than building the first few.","input_schema":{"type":"object","required":["positions"],"properties":{"enzyme":{"enum":["BsaI","BsmBI","BbsI","SapI"],"type":"string","default":"BsaI","description":"Type IIS enzyme (BsaI, BsmBI, BbsI, SapI)."},"positions":{"type":"array","items":{"type":"object"},"maxItems":24,"minItems":2,"description":"The positions, in no particular order: [{ role, parts: [{ name, sequence, circular }] }]. `role` is a label (\"promoter\", \"CDS\") and never decides anything — the overhangs do. A position with one part is a fixed position, which is what a backbone usually is."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Golden Gate combinatorial library","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"hgvs_convert","title":"HGVS Variant Converter (c. <-> g. <-> p.)","description":"Parse an HGVS \"c.\" variant description (by gene symbol, RefSeq NM_, or Ensembl ENST accession), convert it to genomic (g.) coordinates via a real, live-fetched Ensembl exon/CDS map (transcripts resolved through the bundled MANE RefSeq<->Ensembl crosswalk), apply 3'-rule normalization to any del/dup/ins, and predict the protein (p.) effect where that is safely computable. Also accepts a genomic \"g.\" position on a chromosome or RefSeqGene (NC_/NG_, GRCh38 or GRCh37): it is validated and placed on GRCh38 by NCBI, projected onto the MANE Select transcript by Ensembl, and converted back by this tool's own engine, which must agree — so the answer rests on two independent conversions. And the \"NC_/NG_(NM_…):c.\" form converts on the transcript in parentheses. A \"c.\" on a RefSeq transcript outside MANE is placed by NCBI and converted on the gene's MANE Select transcript. A single amino-acid substitution (\"TP53:p.Pro72Arg\") is read as its codon change when exactly one single-base change produces it; otherwise every candidate is listed. Refuses cleanly — rather than guessing — for circular/mitochondrial genomes, RNA-level input, other protein-level input, uncertain/mosaic syntax, and splice-junction-adjacent or inversion protein effects.","input_schema":{"type":"object","required":["variant"],"properties":{"variant":{"type":"string","description":"A full HGVS description: a \"c.\" on a gene symbol or transcript (\"NM_000546.6:c.215C>G\", \"TP53:c.215C>G\"), a \"g.\" position on a chromosome or RefSeqGene (\"NC_000017.11:g.7676154G>C\", \"NG_017013.2:g.16397C>G\"), a \"c.\" with its transcript in parentheses (\"NC_000017.11(NM_000546.6):c.215C>G\"), or a single amino-acid substitution (\"TP53:p.Pro72Arg\", \"TP53:p.P72R\"). Substitution (\">\"), deletion (\"del\"), duplication (\"dup\"), insertion (\"ins\"), delins, and inversion (\"inv\") are supported."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"HGVS Variant Converter (c. <-> g. <-> p.)","readOnlyHint":true,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"identity_matrix","title":"Pairwise identity matrix","description":"Percent identity between every pair in a multiple alignment. Takes ALIGNED sequences — the output of multiple_sequence_alignment — because inferring an alignment here would bury the aligner's parameters inside a number that reads as a property of the sequences. Two percentages come back per pair: over columns where both have a residue (the usual figure), and over all columns including gaps. The gap between them is the warning — two sequences overlapping in 50 of 2,000 columns read 100% by the first measure and 2.5% by the second.","input_schema":{"type":"object","required":["sequences"],"properties":{"sequences":{"type":"string","description":"Aligned FASTA (gaps as \"-\"), or an array of {id, sequence}. All rows must be the same length. Max 200 sequences."},"caseSensitive":{"type":"boolean","default":false,"description":"Treat upper and lower case as different residues. Off by default — soft-masking is not a mismatch."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Pairwise identity matrix","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"id_map_poll","title":"Poll a batch ID mapping job","description":"Check a UniProt id-mapping job submitted via id_map_submit. Returns {status, ready:false} while still running; once FINISHED, also returns the mapped ids (normalized regardless of which target database was requested) and any ids that failed to map.","input_schema":{"type":"object","required":["jobId"],"properties":{"jobId":{"type":"string"}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Poll a batch ID mapping job","readOnlyHint":true,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"id_map_submit","title":"Submit a batch gene/protein ID mapping job","description":"Submit up to 100,000 ids to UniProt's ID mapping service for a single confirmed-safe hop (e.g. Gene_Name -> UniProtKB-Swiss-Prot, or UniProtKB_AC-ID -> Ensembl/GeneID/RefSeq_Protein/Gene_Name). Returns a jobId immediately — poll it with id_map_poll.","input_schema":{"type":"object","required":["ids","from","to"],"properties":{"to":{"type":"string","description":"Target id type. Supported single hops: Gene_Name/Ensembl/GeneID/RefSeq_Protein -> \"UniProtKB-Swiss-Prot\" (the only direct target for these), or \"UniProtKB_AC-ID\" -> Ensembl/GeneID/RefSeq_Protein/Gene_Name. Any other pair is rejected — chain two of these hops instead."},"ids":{"type":"array","items":{"type":"string"},"description":"The ids to map, up to 100000 (e.g. gene symbols, UniProt accessions, Ensembl gene IDs, Entrez GeneIDs, or RefSeq protein accessions, depending on \"from\")."},"from":{"type":"string","description":"Source id type: \"Gene_Name\", \"Ensembl\", \"GeneID\", \"RefSeq_Protein\", or \"UniProtKB_AC-ID\". UniProt's mapping graph is hub-and-spoke — see the \"to\" note."},"taxId":{"type":"string","description":"NCBI taxonomy id to disambiguate a gene symbol (only used when from=\"Gene_Name\"). Defaults to human (9606) if omitted."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Submit a batch gene/protein ID mapping job","readOnlyHint":false,"openWorldHint":true,"idempotentHint":false,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"in_silico_pcr","title":"In-silico PCR","description":"Predict PCR products for a template and a pair of primers (IUPAC-aware, allows mismatches, handles circular templates). Primers may carry a non-templated 5' tail — a restriction site, a Gibson arm, a Kozak, a tag: a primer primes on its 3' end, and the tail is carried into the product rather than required to match. start/end are the TEMPLATE-derived span, `length` is the whole product including tails, and `features` marks which product bases came from the oligos (present only when there is a tail). Each end reports annealedLength and tailLength. When two primers make NO product on a template up to 60,000 bp, `diagnosis` says why: where each primer does prime (with the mismatched bases), which copying mistake explains one that primes nowhere (reversed but not complemented, complemented but not reversed, a base dropped or doubled, a mismatched 3' base) with the sequence that would bind, whether the two point the same way or away from each other, and the product a linear reading missed across the origin of a circle.","input_schema":{"type":"object","required":["template"],"properties":{"circular":{"type":"boolean","default":false,"description":"Treat the template as circular (plasmid)."},"template":{"type":"string","residues":"nt","description":"Nucleotide sequence (raw or FASTA; IUPAC accepted)."},"forwardPrimer":{"type":"string","residues":"nt","description":"Primer 1, 5'→3'."},"maxMismatches":{"type":"integer","default":0,"maximum":10,"minimum":0,"description":"Mismatches tolerated per primer (0–10)."},"reversePrimer":{"type":"string","residues":"nt","description":"Primer 2, 5'→3' (order does not matter). Optional: one primer alone is accepted and reports the products it makes on its own — none, unless the template carries inverted sites it can prime from both ends."},"maxProductLength":{"type":"integer","default":50000,"maximum":500000,"minimum":1,"description":"Ignore predicted products longer than this (bp). A SEARCH WINDOW, not a claim about what amplifies: whole-plasmid inverse PCR — the reaction a q5-style site_directed_mutagenesis design is run as — makes one product the size of the plasmid, so raise this for a construct over 50 kb. `suppressedByLength` in the response counts what the window discarded."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"In-silico PCR","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"kasp_primer_design","title":"KASP / ARMS Allele-Specific Primers","description":"Design KASP/ARMS allele-specific genotyping primers for a SNP: two allele-specific forward primers differing only at the 3' terminal base (one per allele), each with the standard KASP universal tail (FAM for allele A, HEX for allele B), a deliberate internal ARMS secondary mismatch near the 3' end whose strength complements that primer's own natural allele mismatch (strong↔weak), and one common downstream reverse primer sized to a chosen amplicon range. Because a forward primer reads the antisense strand, each primer's 3' base sits opposite the complement of the other allele, so the two primers get different mismatch classes and are reported separately (graded from the measured PCR yields in Kwok et al. 1990). Reuses the site's nearest-neighbor Tm engine.","input_schema":{"type":"object","required":["target","snpPosition","alleleA","alleleB"],"properties":{"target":{"type":"string","residues":"nt","description":"Nucleotide sequence (raw or FASTA; IUPAC accepted)."},"alleleA":{"type":"string","residues":"nt","description":"First allele (single base) — gets the FAM tail."},"alleleB":{"type":"string","residues":"nt","description":"Second allele (single base) — gets the HEX tail."},"maxAmplicon":{"type":"integer","default":150,"description":"Maximum amplicon length for the common reverse primer."},"minAmplicon":{"type":"integer","default":60,"description":"Minimum amplicon length for the common reverse primer."},"snpPosition":{"type":"integer","minimum":18,"description":"1-based position of the SNP on the forward strand. Must be 18 or greater: the allele-specific primers end on the SNP, so they need at least 17 bp of upstream template to build a core from."},"targetCoreTm":{"type":"number","default":56,"description":"Target Tm (°C) for the allele-specific primer core (before the universal tail)."},"addSecondaryMismatch":{"type":"boolean","default":true,"description":"Engineer the internal ARMS destabilizing mismatch near the 3' end."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"KASP / ARMS Allele-Specific Primers","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"ligation_setup","title":"Ligation / assembly reaction setup","description":"Work out how many microlitres of vector and insert to pipette to hit a target molar ratio, from each part's length and stock concentration. Handles one insert or several with independent equivalents (Gibson, Golden Gate, MoClo), reports pmol and ng per part alongside the volumes, and flags the two things that actually go wrong on a bench: a volume below what a pipette measures reliably, and a plan whose DNA does not leave room for buffer and enzyme. A molar ratio is about moles, so a shorter insert at 3 molar equivalents goes in at LESS mass than the vector — that conversion is the point.","input_schema":{"type":"object","required":["vectorLengthBp","vectorNgPerUl"],"properties":{"inserts":{"type":"array","items":{"type":"object","required":["lengthBp","ngPerUl"],"properties":{"label":{"type":"string"},"ngPerUl":{"type":"number"},"lengthBp":{"type":"integer"},"equivalents":{"type":"number","default":1}}},"description":"Multi-fragment assembly: one entry per insert, each with its own length, stock and molar equivalents. Overrides insertLengthBp/insertNgPerUl/molarRatio when present."},"vectorNg":{"type":"number","default":50,"description":"How much backbone to put in the reaction, ng. This is the quantity you fix; every insert mass follows from the ratio."},"molarRatio":{"type":"number","default":3,"description":"Molar equivalents of insert per vector. 3 is the usual starting point for a sticky-end ligation; 1-2 is common for Gibson and Golden Gate."},"insertNgPerUl":{"type":"number","description":"Insert stock concentration, ng/µL."},"vectorNgPerUl":{"type":"number","description":"Backbone stock concentration, ng/µL."},"insertLengthBp":{"type":"integer","description":"Insert length in bp. Use `inserts` instead for a multi-fragment assembly."},"vectorLengthBp":{"type":"integer","description":"Backbone length in bp."},"vectorSequence":{"type":"string","residues":"nt","description":"Optional backbone sequence — gives an exact molar mass from base composition instead of the 650 g/mol/bp average."},"reactionVolumeUl":{"type":"number","default":20,"description":"Total reaction volume, µL."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Ligation / assembly reaction setup","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"map_update_from_consensus","title":"Update a map from a sequencing consensus","description":"Write the differences a whole-plasmid sequencing consensus shows into the map, keeping the map's annotation: every feature is shifted, grown or shrunk with the edit, a feature whose boundary an edit cuts is trimmed (and named), and differences in a known nanopore error context (Dam/Dcm methylation sites, long homopolymers) are left out unless keepArtifacts is set. Returns the updated map as a GenBank record and as SnapGene .dna bytes (base64), plus a change log. Use it when the clone is what you want and the MAP is out of date — a change every clone carries, a redesigned primer, a different allele — not to absorb one clone's mutation. `positions` limits the update to those design positions (e.g. only the changes shared by every clone).","input_schema":{"type":"object","required":["design","consensus"],"properties":{"design":{"type":"string","description":"The map to update: your annotated GenBank record (what keeps the features), FASTA or bare bases."},"circular":{"type":"boolean","default":true,"description":"Treat both as circular (right for a plasmid)."},"consensus":{"type":"string","residues":"nt","description":"The assembled consensus from the sequencing service, raw or FASTA. One record."},"positions":{"type":"array","items":{"type":"integer","minimum":1},"description":"Write only the differences at these design positions (1-based). Omitted: every difference."},"keepArtifacts":{"type":"boolean","default":false,"description":"Also write differences that sit in a known nanopore error context. Off by default: those are usually read-out artifacts, and writing one into the map makes it wrong."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Update a map from a sequencing consensus","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"melting_temperature","title":"Primer Tm calculator","description":"Primer/oligo melting temperature: nearest-neighbor (SantaLucia 1998) at the supplied reaction conditions, recommended from 14 nt up, with the Wallace rule for shorter oligos, a fixed-100 mM-Na+ Schildkraut-Lifson reference estimate, and molecular weights.","input_schema":{"type":"object","required":["sequence"],"properties":{"mgMM":{"type":"number","default":1.5,"description":"Divalent cation [Mg2+] (mM)."},"naMM":{"type":"number","default":50,"description":"Monovalent cation [Na+]/[K+] (mM)."},"dntpMM":{"type":"number","default":0.2,"description":"Total [dNTP] (mM), chelates Mg2+."},"oligoNM":{"type":"number","default":250,"description":"Total strand concentration (nM)."},"sequence":{"type":"string","residues":"nt-dI","description":"Nucleotide sequence (raw or FASTA; IUPAC accepted, and \"I\" for deoxyinosine)."},"targetTm":{"type":"number","description":"Optional target Tm (°C). When given, the response includes a pass/fail gate."},"tmTolerance":{"type":"number","default":2,"description":"Allowed +/- window (°C) around targetTm for the gate."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Primer Tm calculator","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"motif_discover","title":"Motif Discovery","description":"Find a motif NOBODY TYPED: given a set of sequences (multi-record FASTA), report the short pattern they share, as a consensus, a position-weight matrix and one site per sequence. This is the opposite question from motif_finder, which searches for a pattern you already have. Gibbs site sampler (Lawrence et al., Science 1993), one occurrence per sequence, both strands by default. ⚠️ READ `found` BEFORE THE CONSENSUS: a Gibbs sampler returns a motif from ANY input, including pure noise, because its objective has a maximum whether or not anything is there — so every run is scored against shuffled copies of the same sequences, which hold the same length and base composition and no arrangement. `found` is true only when the real alignment beats every shuffle outright AND clears the control mean by the margin in `control.zScore`; when it is false the consensus and sites are still returned, so you can see what was rejected. Measured: 0 of 20 pure-noise sets were reported as found, and a 10-mer planted in all 12 sequences was recovered exactly on 5 of 5 seeds. The sampler is deterministic — the same input gives the same answer, so a saved or shared result reproduces; pass a different `seed` to see whether the motif survives a different starting point, because one that does not is weak.","input_schema":{"type":"object","required":["sequences"],"properties":{"seed":{"type":"integer","description":"Sampler seed. Fixed by default so one input gives one answer; change it to test whether the motif is stable."},"width":{"type":"integer","default":10,"maximum":30,"minimum":4,"description":"Motif length in bases (4-30). The width is given rather than searched for: trying every width and keeping the best score would select on the same quantity the control measures, and a wider motif scores higher for free."},"sequences":{"type":"string","residues":"nt","description":"Two or more sequences as multi-record FASTA. Records shorter than the motif width are left out and named in notes. At most 500 sequences and 100,000 residues in total."},"bothStrands":{"type":"boolean","default":true,"description":"Allow a site on either strand. A motif has no canonical orientation, so the consensus may come back as the reverse complement of the one you expect."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Motif Discovery","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"motif_finder","title":"Motif Finder","description":"Find (overlapping) occurrences of an IUPAC motif on either strand, allowing mismatches.","input_schema":{"type":"object","required":["sequence","motif"],"properties":{"limit":{"type":"integer","default":500,"maximum":20000,"minimum":1,"description":"How many matches to return. `count` always reports every hit found and `truncated` says whether the list was cut."},"motif":{"type":"string","residues":"nt","description":"Query motif; IUPAC ambiguity codes (R Y S W K M B D H V N) allowed."},"sequence":{"type":"string","residues":"nt","description":"Nucleotide sequence (raw or FASTA; IUPAC accepted)."},"maxMismatches":{"type":"integer","default":0,"description":"Maximum allowed mismatches per match."},"searchReverseStrand":{"type":"boolean","default":true,"description":"Also search the reverse strand."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Motif Finder","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"multiple_sequence_alignment","title":"Multiple Sequence Alignment","description":"Center-star multiple sequence alignment of a multi-FASTA input — nucleotide or protein, detected from the records and reported as `type` — with consensus and per-column conservation.","input_schema":{"type":"object","required":["input"],"properties":{"input":{"type":"string","residues":"any","description":"Two or more sequences in multi-FASTA format (>name / sequence), nucleotide or protein. Up to 25 are aligned."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Multiple Sequence Alignment","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"multiplex_panel_design","title":"Multiplex PCR panel design","description":"Choose one primer pair per target so the whole panel works in one tube: no cross-dimer between any two of the primers, every amplicon resolvable from every other on the gel you will run, and one annealing temperature that serves all of them. Searches combinations rather than picking each target's best pair in isolation, which is what makes panels fail — and when no compatible panel exists it names the target pairs that cannot be multiplexed at all, so you know which one to redesign.","input_schema":{"type":"object","required":["targets"],"properties":{"targets":{"type":"array","items":{"type":"object","required":["template"],"properties":{"label":{"type":"string","description":"Name for this target, used throughout the result."},"template":{"type":"string","description":"Template sequence, raw or FASTA."},"targetEnd":{"type":"number","description":"1-based inclusive end of that region."},"ampliconMax":{"type":"number","description":"Largest product for this target."},"ampliconMin":{"type":"number","description":"Smallest product for THIS target. Giving each target its own size band is how a panel is made readable — leaving them all on one range makes comigration the dominant conflict."},"targetStart":{"type":"number","description":"1-based start of the region the product must span."}}},"description":"2-8 targets to amplify in one reaction."},"ampliconMax":{"type":"number","description":"Panel-wide default product size ceiling."},"ampliconMin":{"type":"number","description":"Panel-wide default product size floor, for targets that set none."},"maxTmSpread":{"type":"number","default":3,"description":"Widest Tm difference tolerated across every primer in the panel, in °C — one annealing temperature has to serve all of them."},"agarosePercent":{"type":"number","description":"Gel the panel will be read on. Omit and the percentage whose resolving window contains the amplicons is chosen and reported — a panel of small products judged on a 1% gel reads as all-comigrating, which is about the gel rather than the primers."},"dimerThresholdDG":{"type":"number","default":-6,"description":"ΔG (kcal/mol) at or below which a cross-dimer involving a primer's 3' END is a conflict. That end is where extension starts, so it matters at a weaker ΔG than an internal pairing."},"candidatesPerTarget":{"type":"number","default":4,"description":"Candidate pairs considered per target (max 6). More finds a panel where fewer cannot, at the cost of a larger search."},"internalDimerThresholdDG":{"type":"number","default":-9,"description":"The looser bar for a cross-dimer that pairs internally and only sequesters primer."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Multiplex PCR panel design","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"nonrepetitive_parts_design","title":"Design new non-repetitive parts","description":"Build a set of new genetic parts that match a degenerate (IUPAC) template and share more than a chosen length with nothing — not each other, not themselves, not a background sequence you supply. This is how a toolbox of promoters, RBSs, terminators or sgRNA handles is made large without making an assembly unstable. Honours a GC range and excluded motifs (restriction sites) during the search rather than filtering afterwards. Deterministic given a seed: the same inputs give the same toolbox. Returns fewer parts than asked, with a reason, when the constraints leave no room — it never invents a repetitive one to hit the count.","input_schema":{"type":"object","required":["constraint"],"properties":{"lmax":{"type":"integer","default":15,"maximum":40,"minimum":8,"description":"Longest stretch any two parts may share, in bp (default 15)."},"seed":{"type":"integer","default":1,"description":"Seeds the search. Change it for a different toolbox from the same constraints; keep it to reproduce one."},"count":{"type":"integer","default":20,"maximum":500,"minimum":1,"description":"How many parts to build (max 500)."},"gcMax":{"type":"number","default":100,"maximum":100,"minimum":0,"description":"Highest GC% a part may have."},"gcMin":{"type":"number","default":0,"maximum":100,"minimum":0,"description":"Lowest GC% a part may have."},"exclude":{"type":"array","items":{"type":"string"},"description":"Motifs no part may contain, checked on both strands: restriction sites you clone with, a terminator you do not want. Literal ACGT only — an IUPAC code is refused rather than silently half-matched."},"background":{"type":"array","items":{"type":"string"},"description":"Sequences the new parts must also avoid sharing with — the host genome region, the vector, or a toolbox you already own."},"constraint":{"type":"string","description":"The IUPAC template every part must match, e.g. \"NNNNNNTTGACANNNNNNNNNNNNNNNNNTATAATNNNNNN\" for a sigma-70 promoter library. N is any base; fixed letters are held. Max 1,000 nt."},"bothStrands":{"type":"boolean","default":true,"description":"Treat a stretch and its reverse complement as the same stretch."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Design new non-repetitive parts","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"nonrepetitive_parts_find","title":"Find a non-repetitive subset of existing parts","description":"Given a toolbox of genetic parts, return the largest subset in which no two parts share more than a chosen length of sequence — on either strand. Parts that share a long stretch recombine into each other in a multi-part assembly and are the single largest cause of DNA synthesis failure, and neither shows up when the parts are checked one at a time. Reports every conflicting pair and why each dropped part was dropped. Deterministic: no model, no rate, no score. Use nonrepetitive_parts_design to build new parts instead of selecting from existing ones.","input_schema":{"type":"object","required":["parts"],"properties":{"lmax":{"type":"integer","default":15,"maximum":40,"minimum":8,"description":"Longest stretch two parts may share, in bp (default 15). Two parts conflict when they share MORE than this. Below 8 bp every pair of sequences matches by chance."},"parts":{"type":"string","description":"The toolbox as (multi-)FASTA — each record's header becomes the part's name. Max 4,000 parts, 5,000 bp each."},"strategy":{"enum":["2apx","greedy"],"type":"string","default":"2apx","description":"Which approximation picks the subset. Maximum independent set is NP-hard, so neither is guaranteed largest: '2apx' is the standard 2-approximation, 'greedy' repeatedly drops the most-conflicting part. Try both — they disagree on real toolboxes."},"bothStrands":{"type":"boolean","default":true,"description":"Count a shared stretch even when one part carries it reverse-complemented. Recombination and synthesis both see both strands, so leaving this on is almost always right."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Find a non-repetitive subset of existing parts","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"od600_cells","title":"OD600 to cells/mL","description":"Convert an OD600 reading to a cell density and a total cell count, correcting for the optical path and any dilution, and flagging the two things that silently make the number wrong: a reading above the linear range (a dense culture reads LOW), and a plate-reader path length assumed to be a cuvette's 1 cm. Also plans a back-dilution to a target OD. The cells-per-OD factor is a convention, not a constant — it varies with strain, growth phase and instrument, so pass factorPerOd when you have calibrated against plate counts.","input_schema":{"type":"object","required":["od600"],"properties":{"od600":{"type":"number","default":0.5,"description":"The reading off the spectrophotometer."},"organism":{"enum":["ecoli","scerevisiae","ppastoris"],"type":"string","default":"ecoli","description":"Supplies the cells-per-OD factor. Ignored when factorPerOd is given."},"targetOd":{"type":"number","default":0,"description":"Optional: plan a back-dilution to this OD. 0 = skip."},"volumeMl":{"type":"number","default":0,"description":"Culture volume, for a total cell count. 0 = not given."},"factorPerOd":{"type":"number","description":"Your own calibration: cells/mL at OD600 = 1.0 in a 1 cm path. Overrides organism."},"pathLengthCm":{"type":"number","default":1,"description":"Optical path of the reading. A cuvette is 1 cm; 200 µL in a 96-well flat plate is about 0.58 cm."},"dilutionFactor":{"type":"number","default":1,"description":"Dilution done before reading (2 means the sample was diluted 1:2)."},"targetVolumeMl":{"type":"number","default":50,"description":"Final volume for the back-dilution plan."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"OD600 to cells/mL","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"oligo_analysis","title":"Oligo analyzer","description":"Full oligo analysis: nearest-neighbor Tm/ΔG/ΔH/ΔS plus hairpin and self-dimer screening with base-pair diagrams and warnings.","input_schema":{"type":"object","required":["sequence"],"properties":{"mgMM":{"type":"number","default":1.5,"description":"Divalent cation [Mg2+] (mM)."},"naMM":{"type":"number","default":50,"description":"Monovalent cation [Na+]/[K+] (mM)."},"dntpMM":{"type":"number","default":0.2,"description":"Total [dNTP] (mM), chelates Mg2+."},"oligoNM":{"type":"number","default":250,"description":"Total strand concentration (nM)."},"sequence":{"type":"string","residues":"nt","description":"Nucleotide sequence (raw or FASTA; IUPAC accepted)."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Oligo analyzer","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"oligo_cofold","title":"Oligo cofold (ΔG)","description":"Minimum-free-energy structure and ΔG for one oligo (hairpin) or two oligos together (homo/heterodimer), using ViennaRNA's published loop model at a temperature you choose — DNA parameters (Mathews 2004) by default, RNA (Turner 2004) on request. Reports each strand alone, the duplex, and the interaction ΔG the two gain by pairing with each other rather than folding alone, which is the number a primer-dimer screen wants. Unlike oligo_analysis's fast stack-sum screen this is a full loop model with bulge, internal-loop and dangling-end terms; the two are on different parameter sets and must not be compared. PREDICTED, NOT MEASURED. No skill statistic is claimed for predicting whether a PCR fails. Loop-model MFE folding reproduces measured structure well for short duplexes and progressively worse with length; the ΔG itself carries roughly kcal/mol-scale uncertainty and the MFE structure is one structure out of an ensemble — request `partition` for the ensemble free energy, which is the more honest single number when several structures compete. Valid for: short oligos, at most 200 nt per strand, at the temperature given. It models two strands in isolation at no particular concentration: it does not know your primer concentration, salt, or cycling program, so it cannot say whether a dimer will actually form in your tube.","input_schema":{"type":"object","required":["a"],"properties":{"a":{"type":"string","maxLength":800,"description":"First oligo, 5'→3'. Max 200 nt."},"b":{"type":"string","maxLength":800,"description":"Second oligo. Omit to analyze hairpin structure in 'a' alone; pass the same sequence as 'a' for a homodimer."},"alphabet":{"enum":["dna","rna"],"type":"string","default":"dna","description":"Which measured parameter set to use. This is not cosmetic — the same 20-mer can differ by several kcal/mol between them."},"partition":{"type":"boolean","default":false,"description":"Also compute the ensemble free energy over all structures, not just the MFE one. Costs a second pass."},"temperature":{"type":"number","default":37,"maximum":120,"minimum":-20,"description":"°C. Primer dimers matter at the annealing temperature, not at 37 °C."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Oligo cofold (ΔG)","readOnlyHint":true,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"oligo_order_check","title":"Check an oligo order against its map","description":"Check a list of oligos against the plasmid or template they were designed from, before ordering them. For each oligo: where it primes (3'-anchored, so cloning tails are allowed), on which strand, and which bases disagree with the map. When an oligo primes nowhere it says WHICH copying mistake explains it — reversed without being complemented, complemented without being reversed, one base dropped or doubled, a wrong last base — and gives the sequence that was meant, but only when exactly one such mistake reproduces an oligo that binds. It simulates every product the order can make (up to 15,000 bp) with the in_silico_pcr engine, and for pairs the names declare (GFP_F / GFP_R) says why they make none, including which of the two is written as the wrong strand. Also flags one sequence under two names, one name on two sequences, a primer saved in the map under the same name that sits elsewhere, and 3' self-dimers/hairpins. Up to 96 oligos.","input_schema":{"type":"object","required":["template","oligos"],"properties":{"oligos":{"type":"string","description":"The order sheet: FASTA (headers become names), or one oligo per line as `name<TAB or comma or space>sequence`, or bare sequences one per line (named oligo_1, oligo_2, …)."},"circular":{"type":"boolean","description":"Override the topology. Omitted: a GenBank/EMBL record's own header decides, and bare sequence is treated as a circular plasmid (stated in the response as topologySource)."},"template":{"type":"string","residues":"nt","description":"The map the oligos were designed from — a GenBank record (its LOCUS line gives the topology and its features name where each oligo sits), FASTA, or bare sequence."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Check an oligo order against its map","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"oligo_pool_screen","title":"Oligo pool cross-dimer screen","description":"Screen a whole set of oligos you already have — every pair for cross-dimers, every oligo for its own hairpin and self-dimer, and the set for duplicates and Tm spread — and get back the conflicts ranked rather than a table of every combination. This is the pool-level answer cross_dimer gives one pair at a time: 51 primers is 1,275 pairs, which is 1,275 separate calls done by hand and one call done here. Not to be confused with multiplex_panel_design, which DESIGNS primers from templates; this takes the primers you have already ordered. A pairing that involves an oligo's 3' END is judged at a weaker ΔG than one that only pairs internally, because that end is where extension starts — the same two-bar rule the multiplex panel designer uses. Every number is a nearest-neighbor calculation over the sequences supplied, not a prediction of what the reaction will do.","input_schema":{"type":"object","required":[],"properties":{"mgMM":{"type":"number","default":1.5,"description":"Divalent cation [Mg2+] (mM)."},"naMM":{"type":"number","default":50,"description":"Monovalent cation [Na+]/[K+] (mM)."},"fasta":{"type":"string","residues":"nt","description":"The pool as a FASTA paste (headers become the names), or as one sequence per line — which is what comes out of a spreadsheet column. An alternative to `oligos`."},"dntpMM":{"type":"number","default":0.2,"description":"Total [dNTP] (mM), chelates Mg2+."},"oligos":{"type":"array","items":{"type":"object","required":["sequence"],"properties":{"name":{"type":"string","description":"Label used throughout the result. Defaults to oligo_1, oligo_2, …"},"sequence":{"type":"string","description":"The oligo, 5'→3'."}}},"description":"The pool, as objects with a name and a sequence. Up to 384. Use this or `fasta`, not both."},"oligoNM":{"type":"number","default":250,"description":"Total strand concentration (nM)."},"maxConflicts":{"type":"integer","default":200,"description":"Conflict rows returned, most stable first. The COUNTS are always complete."},"internalThresholdDG":{"type":"number","default":-9,"description":"The looser bar for a pairing that only sequesters primer internally, away from either 3' end."},"threePrimeThresholdDG":{"type":"number","default":-6,"description":"ΔG (kcal/mol) at or below which a pairing that involves a 3' END counts as a conflict."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Oligo pool cross-dimer screen","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"operon_design","title":"Assemble a multi-gene operon and check it","description":"Build a polycistronic operon from a promoter, a list of CDSs with their RBSs, spacers and a terminator — optionally recoding every CDS for a host — then scan the ASSEMBLED molecule for internal promoters, Shine-Dalgarno sequences, terminators, out-of-frame start codons and repeats. Scanning the product rather than the parts is the point: these elements are very often created BY THE JOIN between two parts, so checking each part alone finds nothing. Returns the sequence, an annotated GenBank file, and every element found. Assigns no translation rate — use rbs_library_design to choose RBSs, then rbs_predict to rank the result.","input_schema":{"type":"object","required":["genes"],"properties":{"name":{"type":"string","description":"LOCUS name for the GenBank output."},"genes":{"type":"array","items":{"type":"object","required":["cds"],"properties":{"cds":{"type":"string","description":"The coding sequence, as DNA."},"rbs":{"type":"string","description":"Ribosome binding site placed in front of this gene. Omit for a consensus default, or pass \"\" for none."},"name":{"type":"string","description":"Label for the CDS feature."}}},"description":"The genes, in order (max 12)."},"spacer":{"type":"string","description":"Sequence inserted between one CDS and the next gene's RBS."},"promoter":{"type":"string","description":"Promoter placed at the 5' end."},"terminator":{"type":"string","description":"Terminator placed at the 3' end."},"optimiseFor":{"enum":["ecoli","human","yeast","cho","pichia","insect","arabidopsis","zebrafish"],"type":"string","description":"Recode every CDS with this host's most-frequent codons. The rewrite is checked to translate back to the same protein, and skipped for that gene if it does not. This is a determinate recoding, NOT a yield prediction — published codon-optimisation algorithms are close to a coin flip on whether they raise or lower real expression."},"includeGenbank":{"type":"boolean","default":true,"description":"Return the annotated GenBank file."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Assemble a multi-gene operon and check it","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"operon_scan","title":"Find unwanted regulatory elements in a construct","description":"Scan a multi-gene construct, on both strands, for the sequence that quietly breaks operons: promoter-like -35/-10 pairs (including ones pointing backwards, which make antisense RNA), Shine-Dalgarno sequences positioned in front of an internal start codon, terminator-shaped hairpins with a U-tract, out-of-frame start codons inside a declared CDS, and exact direct repeats. Reports what MATCHED and how far it sits from consensus — it does not score a match or claim it transcribes. For an estimated promoter strength use promoter_predict; for a translation rate use rbs_predict.","input_schema":{"type":"object","required":["sequence"],"properties":{"cdsEnd":{"type":"integer","description":"1-based end of that coding sequence."},"cdsStart":{"type":"integer","description":"1-based start of a coding sequence. Given with cdsEnd, out-of-frame start codons inside it are reported — without them that check is skipped, because 'out of frame' has no meaning until a frame is declared."},"sequence":{"type":"string","residues":"nt","description":"The construct, raw, FASTA or GenBank. Max 100,000 bp."},"maxPromoterMismatches":{"type":"integer","default":1,"maximum":4,"minimum":0,"description":"Total mismatches allowed across both consensus boxes (default 1). 0 finds only perfect consensus, which real promoters rarely are; above 2 the hit rate on random DNA climbs fast."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Find unwanted regulatory elements in a construct","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"ortholog_map","title":"Find orthologs/paralogs for gene symbols across species","description":"Look up the orthologous (or paralogous) gene for up to 50 gene symbols in a target species, via Ensembl's homology-by-symbol REST endpoint. Symbols with no homology record are reported in `unmapped`, never silently dropped.","input_schema":{"type":"object","required":["symbols","targetSpecies"],"properties":{"type":{"enum":["orthologues","paralogues","all"],"type":"string","default":"orthologues","description":"Homology type to return. Defaults to orthologues."},"symbols":{"type":"array","items":{"type":"string"},"description":"Gene symbols to look up, up to 50 (e.g. [\"TP53\", \"BRCA1\"])."},"sourceSpecies":{"type":"string","default":"human","description":"Species the symbols belong to: a common name (human, mouse, rat, zebrafish, fruit_fly, worm, yeast, cow, pig, dog, frog, macaque, chimp) or a scientific name such as \"rattus_norvegicus\". Defaults to \"human\"."},"targetSpecies":{"type":"string","description":"Species to find homologs in: a common name (mouse, rat, zebrafish, fruit_fly, worm, yeast, …) or a scientific name such as \"danio_rerio\"."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Find orthologs/paralogs for gene symbols across species","readOnlyHint":true,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"outcome_deconvolve","title":"Which product is in this tube (mixture from one Sanger read)","description":"Decompose one Sanger trace into fractions over a set of candidate molecules — the intended construct, the empty backbone, a double insert, a flipped part — instead of onto a generic indel ladder. Non-negative least squares against the candidates' own sequences, so no molecule is ever assigned a negative share. Reports the R² of the fit, which is what says whether the tube holds anything outside the candidate set, and GROUPS candidates the read cannot tell apart rather than splitting their share between them. Feed it the alternatives from assembly_outcomes. PREDICTED, NOT MEASURED. Every run reports its own R²: how much of the observed per-position composition the candidate basis explains. That is a measured adequacy on YOUR trace, and a low value is a statement that the tube holds something the candidate set does not contain. No accuracy against a reference method is published for this implementation, and none is quoted. Exact recovery of synthetic mixtures is deliberately NOT offered as validation: it tests the arithmetic, not whether a real capillary trace behaves like the model. Valid for: One read, from one primer, over a set of candidate molecules that all contain that primer's site and differ from each other within the read. Fractions are reported per GROUP of candidates the read cannot tell apart, and that grouping is part of the answer. NOT valid when the read's anchor identity to a candidate is low (it does not share the primer region), nor when R² comes back low, nor for telling apart candidates that differ only outside the read.","input_schema":{"type":"object","required":["readBases","readChannels","candidates"],"properties":{"readBases":{"type":"string","residues":"nt","description":"Base calls of the read, e.g. from parse_sanger_trace."},"candidates":{"type":"array","items":{"type":"object"},"description":"The molecules this reaction could have produced, as { id, label, sequence, circular? }. Between 2 and 24; assembly_outcomes' intended plus alternatives is the intended source."},"readChannels":{"type":"array","items":{"type":"array","items":{"type":"number"}},"description":"Per-base [A, C, G, T] intensities, one row per called base, read at that base's peak location."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Which product is in this tube (mixture from one Sanger read)","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"pairwise_alignment","title":"Pairwise Alignment","description":"Global (Needleman-Wunsch), local (Smith-Waterman) or semi-global/fitting pairwise alignment of two sequences, with match/mismatch scoring and affine gap costs (Gotoh).","input_schema":{"type":"object","required":["seqA","seqB"],"properties":{"gap":{"type":"number","default":-2,"description":"Affine gap EXTEND penalty, charged per gap position (including the first)."},"mode":{"enum":["global","local","semiglobal"],"type":"string","default":"global","description":"\"global\" penalizes end gaps in both sequences; \"local\" returns the best-scoring subalignment; \"semiglobal\" is a fitting alignment — seqB is consumed end to end while seqA's terminal overhangs are free and are not emitted, so a partial read placed on a longer reference is not smeared across it."},"seqA":{"type":"string","residues":"any","description":"First sequence (raw or FASTA; nucleotide or protein)."},"seqB":{"type":"string","residues":"any","description":"Second sequence (raw or FASTA; nucleotide or protein)."},"match":{"type":"number","default":1,"description":"Match score."},"gapOpen":{"type":"number","description":"Extra one-off penalty charged on top of gap for a gap's first position. Defaults to 1.5 * gap, so a k-base gap costs gap * (k + 1.5) and one contiguous k-base indel is cheaper than k scattered 1-base gaps. Pass 0 for a purely linear penalty."},"mismatch":{"type":"number","default":-1,"description":"Mismatch penalty."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Pairwise Alignment","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"parse_genbank","title":"GenBank Parser","description":"Parse a GenBank flat file into its locus, definition, features and sequence. An EMBL / ENA flat file is accepted too — the same INSDC record in a different layout — and reported with sourceFormat \"embl\".","input_schema":{"type":"object","required":["text"],"properties":{"text":{"type":"string","description":"A GenBank flat file (LOCUS … FEATURES … ORIGIN … //)."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"GenBank Parser","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"parse_gff3","title":"GFF3 annotation parser","description":"Read a GFF3 annotation file: every feature with its 1-based inclusive coordinates, strand, phase, score and decoded attributes, plus any sequences from an embedded ##FASTA section. GFF3 usually carries NO sequence — it annotates a separate FASTA, joined on the first column — so the result says which of the two it was handed. Give `sequence` (or let an embedded ##FASTA supply it) to also get the record as GenBank, readable by every other tool here. Percent-escapes are decoded, `.` is read as absent rather than zero, and a feature repeated across lines keeps both lines.","input_schema":{"type":"object","required":["text"],"properties":{"text":{"type":"string","description":"GFF3 text. Up to 200,000 feature lines."},"limit":{"type":"integer","default":500,"description":"Most features to return in the table (1-5000)."},"seqid":{"type":"string","description":"Which sequence's features to return, when the file covers several. Defaults to the first."},"sequence":{"type":"string","residues":"nt","description":"The DNA these annotations describe, when the file has no ##FASTA section. Enables the GenBank output."},"asGenbank":{"type":"boolean","default":true,"description":"Also return the record as a GenBank flat file, when a sequence is available."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"GFF3 annotation parser","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"parse_sanger_trace","title":"Sanger Trace Parser","description":"Decode a Sanger ABIF (.ab1 / .abi) chromatogram: base calls, per-base quality, the four dye-channel traces, peak locations, and the run's own labels (sample name, well, plate, instrument, run start).","input_schema":{"type":"object","required":["fileBase64"],"properties":{"fileName":{"type":"string","description":"Optional original file name (echoed back)."},"fileBase64":{"type":"string","description":"The binary ABIF (.ab1 / .abi) trace file, base64-encoded."},"includeTraces":{"type":"boolean","default":false,"description":"Include the four raw dye-channel arrays and peakLocations. They are 93% of the response — a 900-base read is 122 kB with them and 8 kB without (measured) — and they are only useful for DRAWING the chromatogram. Everything you would reason about (base calls, quality, the run's labels) is returned either way, so leave this off unless you are rendering."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Sanger Trace Parser","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"parse_snapgene","title":"SnapGene .dna Parser","description":"Read a SnapGene .dna file: sequence, topology, every feature with its span, strand, display color and qualifiers (spliced and origin-spanning features kept as such), and the saved primer list.","input_schema":{"type":"object","required":["fileBase64"],"properties":{"fileName":{"type":"string","description":"Optional original file name (echoed back)."},"fileBase64":{"type":"string","maxLength":43000000,"description":"The binary SnapGene .dna file, base64-encoded. A `data:...;base64,` prefix is accepted."},"featureLimit":{"type":"integer","default":2000,"maximum":2000,"minimum":1,"description":"Cap on features returned (max 2000). featureCount always reports the true total and `truncated` says whether the list was cut."},"includeSequence":{"type":"boolean","default":true,"description":"Include the full sequence. Turn it off to ask what is IN a construct without moving the bases: a 250 kb BAC is 244 kB of the response and length/topology/features answer most questions without it."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"SnapGene .dna Parser","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"parse_structure","title":"Structure file reader (PDB / mmCIF)","description":"Read a PDB or mmCIF structure file — an RCSB PDB entry, or a model from AlphaFold DB, AlphaFold Server or ColabFold — and report what is in it: every polymer chain with its molecule type, name and one-letter sequence (all chains also as FASTA), how many residues have coordinates and which stretches of the sequence do not, bound ligands and waters, and the experimental method and resolution. When the file itself marks its B-factor column as a confidence score (a pLDDT metric, an AlphaFold title, or one value per residue with no experimental method), each chain's mean pLDDT and its stretches below 50 are reported too; otherwise B-factors are left alone. Only the first model of a multi-model file is read. Reads the text; nothing is fetched.","input_schema":{"type":"object","required":["text"],"properties":{"name":{"type":"string","maxLength":200,"description":"What to call the FASTA records when the file carries no entry id (e.g. the file name)."},"text":{"type":"string","maxLength":60000000,"description":"The whole .pdb or .cif file as text."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Structure file reader (PDB / mmCIF)","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"parts_library_search","title":"Search the parts library","description":"Search a parts list harvested from the annotated features of the vector library — promoters, terminators, RBSs, polyA signals, origins, selection markers, affinity tags, reporters, linkers/MCSs — by name, kind or length. Nothing here is transcribed: every part is the exact sequence a GenBank record annotated, and each hit carries the accession and 1-based span it was cut from, plus every other library vector the same part was found in. Parts whose location is spliced or approximate are excluded, because their sequence is not fully determined.","input_schema":{"type":"object","properties":{"kinds":{"type":"array","items":{"type":"string"},"description":"Restrict to these part kinds (promoter, terminator, origin, RBS, polyA, selection marker, affinity tag, reporter, linker/MCS, …). An unknown kind is an error."},"limit":{"type":"integer","default":25,"maximum":100,"minimum":1,"description":"Maximum hits to return. Capped at 100; asking for more is an error, not a silent truncation."},"query":{"type":"string","description":"Substring of the part name (min 2 characters), e.g. \"T7\", \"AmpR\", \"SV40 polyA\"."},"maxLength":{"type":"integer","minimum":0,"description":"Largest part length in bp."},"minLength":{"type":"integer","minimum":0,"description":"Smallest part length in bp."},"includeSequence":{"type":"boolean","default":true,"description":"Include each part's bases (5'→3' on the part's own strand)."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Search the parts library","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"phylogenetic_tree","title":"Phylogenetic tree (neighbour-joining, with bootstrap)","description":"A neighbour-joining tree from a multiple ALIGNMENT, as Newick. Distances are corrected pairwise identities over the columns where both rows have a residue — Jukes-Cantor for nucleotides, Poisson for protein, the same corrections MEGA applies by default — and the tree is rooted at the midpoint of its longest tip-to-tip path. Branch support is Felsenstein's bootstrap over alignment columns, written into the Newick as the usual internal-node labels and returned per split; it needs four or more sequences and is refused with a reason past the work one call will do, rather than returned from fewer replicates under the same name. Takes the output of multiple_sequence_alignment: inferring an alignment here would bury the aligner's parameters inside a tree.","input_schema":{"type":"object","required":["sequences"],"properties":{"sequences":{"type":"string","description":"Aligned FASTA (gaps as \"-\"), or an array of {id, sequence}. All rows must be the same length. Max 200 sequences."},"sequenceType":{"enum":["auto","dna","protein"],"type":"string","default":"auto","description":"Which distance correction to use. Auto reads the alphabet: anything outside IUPAC nucleotide codes and gaps is taken as protein."},"bootstrapReplicates":{"type":"integer","default":100,"maximum":1000,"minimum":0,"description":"Felsenstein bootstrap replicates; 0 returns a tree with no support on it. 100 is the usual published figure."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Phylogenetic tree (neighbour-joining, with bootstrap)","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"plasmid_annotate","title":"Plasmid annotator","description":"Auto-detect common cloning features (promoters, tags, origins, resistance markers, MCS, primers) on both strands. Signatures under 20 bp must match exactly; longer ones tolerate up to ~10% mismatches so point mutants still annotate — each feature reports its own `mismatches` count and an `exact` flag.","input_schema":{"type":"object","required":["sequence"],"properties":{"sequence":{"type":"string","residues":"nt","description":"Nucleotide sequence (raw or FASTA; IUPAC accepted)."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Plasmid annotator","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"plasmid_deep_annotate","title":"Deep plasmid annotation (pLannotate)","description":"Annotate a plasmid against pLannotate's open-source feature library — a much larger signature set (GenoLIB parts + Swiss-Prot + FPbase + Rfam, cross-referenced against ~195k Addgene-deposited plasmids) than plasmid_annotate's built-in curated list, and it reports partial and low-identity hits as graded alignments rather than the pass/fail signature match plasmid_annotate does (that one is not exact-only either — signatures of 20 bp or more tolerate up to ~10% mismatches — but it reports a hit or nothing, with a `mismatches` count and an `exact` flag). Each feature here carries its percent identity, reference coverage and a fragment flag so you can judge a weak hit. Runs a multi-second search on a shared service and is therefore rate limited (see 429/503); use plasmid_annotate for an instant, unmetered first pass.","input_schema":{"type":"object","required":["sequence"],"properties":{"circular":{"type":"boolean","default":true,"description":"Treat the sequence as a circular plasmid (vs. linear)."},"sequence":{"type":"string","description":"Nucleotide sequence (raw or FASTA). A, C, G, T, N only — other IUPAC codes are rejected rather than silently dropped, because pLannotate's search engines discard them and every coordinate after would shift. Max 150,000 bp."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Deep plasmid annotation (pLannotate)","readOnlyHint":true,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"plasmid_dossier","title":"Unknown plasmid: what is it and what do I plate on","description":"Answer the question someone holding an unlabelled tube actually has, rather than returning another feature list: which antibiotic to select on, which host will carry it and at roughly what copy number, which curated backbone it resembles, and what on it will bite you later (duplicate markers, two origins for the same host, internal Type IIS sites that stop it being a Golden Gate part, long direct repeats a recA+ host can recombine out). Reads features from an annotated GenBank record when you paste one, otherwise runs the built-in signature scan. EVERY ABSENCE TRAVELS WITH THE VOCABULARY IT WAS DECIDED AGAINST: an empty marker list means nothing matched the families this screen knows, never that the plasmid cannot be selected — run plasmid_deep_annotate, whose library is far larger, before concluding that.","input_schema":{"type":"object","required":["sequence"],"properties":{"circular":{"type":"boolean","default":true,"description":"Treat the query as a circular molecule (most plasmids are)."},"sequence":{"type":"string","residues":"nt","description":"Nucleotide sequence (raw or FASTA; IUPAC accepted)."},"minRepeatLength":{"type":"integer","default":30,"description":"Shortest direct repeat (bp) to raise as a recombination hazard. Below ~20 bp chance matches multiply and recombination has little to work with."},"goldenGateEnzymes":{"type":"array","items":{"type":"string"},"description":"Type IIS enzymes you intend to assemble with (e.g. [\"BsaI\"]). Internal sites are ALWAYS reported in typeIISSites — random sequence carries them and so does nearly every real plasmid — but they only become a hazard for an enzyme named here, so the hazard list stays worth reading."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Unknown plasmid: what is it and what do I plate on","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"plasmid_full_report","title":"Plasmid full report (identity + features + unexplained regions)","description":"One combined view of 'what is this plasmid': recognized common features (from plasmid_annotate), backbone identity / possible chimera (from plasmid_identify), and — the two crossed together — any region that neither a curated backbone nor a recognized common feature explains. That last list is a triage signal (an unusual insert, an unannotated part, or worth a closer look), not a defect finding: a real gene-of-interest legitimately has no curated-feature match.","input_schema":{"type":"object","required":["sequence"],"properties":{"topN":{"type":"integer","default":5,"description":"How many top-ranked backbone candidates to report."},"circular":{"type":"boolean","default":true,"description":"Treat the query as a circular molecule (most plasmids are)."},"sequence":{"type":"string","residues":"nt","description":"Nucleotide sequence (raw or FASTA; IUPAC accepted)."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Plasmid full report (identity + features + unexplained regions)","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"plasmid_identify","title":"Identify an unknown plasmid","description":"Screen a query plasmid against a small curated set of common backbones (cloning vectors, expression vectors, BACs — see referencesChecked for the exact list) to identify which one(s) it resembles, separate an unmatched region (normal — your own insert) from a POSSIBLE CHIMERA (a region matching a different known backbone than its neighbor), and report per-match %identity/%coverage. NOT a search against Addgene's ~100k-plasmid catalog or PlasmidScope's 850k+ — a curated-set screen only.","input_schema":{"type":"object","required":["sequence"],"properties":{"topN":{"type":"integer","default":5,"description":"How many top-ranked backbone candidates to report."},"circular":{"type":"boolean","default":true,"description":"Treat the query as a circular molecule (most plasmids are)."},"sequence":{"type":"string","residues":"nt","description":"Nucleotide sequence (raw or FASTA; IUPAC accepted)."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Identify an unknown plasmid","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"prime_editing_design","title":"Prime Editing Studio (pegRNA)","description":"Design SpCas9 prime-editing pegRNAs for a substitution, insertion, deletion, or small replacement: for each usable NGG PAM it builds the spacer, a primer-binding-site (PBS) length sweep targeting a ~30 C melting temperature, the reverse-transcriptase template (RTT) that encodes the edit, and the full 3' extension, plus PE3 nicking-sgRNA suggestions 40-90 bp away on the opposite strand. Designs where the edit destroys the pegRNA's own PAM (preventing re-nicking of the edited allele) are ranked first. Coordinates: every pegRNA coordinate (protospacer span, nick position, editStart/editEnd) is 1-based inclusive in the submitted PRE-EDIT target's frame — the protospacer+PAM search runs on the unedited sequence, because Cas9 has to bind the allele you actually have. The one exception is edit-dependent PE3b nicking guides, which exist only once the edit is installed; each nickingGuides entry therefore carries a `coordinateFrame` field of \"target\" or \"editedSequence\" naming the frame its own start/end/nickToNickDistance are measured in, and for a length-changing edit the two frames differ downstream of the edit. Off-target activity is not evaluated (no in-browser reference genome).","input_schema":{"type":"object","required":["target","editStart","editEnd"],"properties":{"target":{"type":"string","residues":"nt","description":"Forward-strand target DNA (raw or FASTA), with flanking sequence around the intended edit."},"editEnd":{"type":"integer","description":"1-based inclusive end of the region being changed. For a pure insertion, set editEnd = editStart - 1."},"editStart":{"type":"integer","description":"1-based inclusive start of the region being changed."},"pbsLength":{"type":"integer","description":"Optional preferred PBS length to highlight; a full 8-17 nt sweep is always returned."},"frameStart":{"type":"integer","description":"Optional 1-based CDS reading-frame start, used only to annotate whether a PAM-blocking mutation would be silent."},"insertedSeq":{"type":"string","default":"","residues":"nt","description":"Replacement bases (forward strand). Empty string means a deletion."},"rttHomology":{"type":"integer","default":13,"description":"Homology length (nt) 3' of the edit that the RTT should include (typically 10-16)."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Prime Editing Studio (pegRNA)","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"prime_editing_efficiency","title":"Prime-editing efficiency (PRIDICT2.0)","description":"Predict per-pegRNA prime-editing efficiency for one edit with PRIDICT2.0, and return the top-scoring pegRNA designs ranked by it. Takes the target as context, the edit in brackets, then context — ACGT...(A/G)...ACGT, with roughly 100+ bp each side — and enumerates PBS/RTT length combinations, scoring every one in HEK293 and K562. Each candidate comes back with both scores, its percentile against the training library, its rank, the spacer, PBS and RTT lengths, the full pegRNA, and Golden Gate cloning oligos. Use it to CHOOSE between designs; the number is not a promised editing percentage. PREDICTED, NOT MEASURED (Spearman ρ = 0.85 on held-out data from the libraries it was trained on). Spearman rho of about 0.85 for intended edits on held-out library data — the best-validated figure of any model in this registry, and roughly double OSTIR's 0.39 on independent data. That figure is still within the library and cell lines it was trained on. Valid for: human sequence, and efficiency ranking within one locus. It is parameterized on HEK293 and K562; your cell type, delivery method, and chromatin context will all move the absolute efficiency, chromatin alone by severalfold. Nothing here is predicted for a non-human host or for editors outside the PE2/PE3 architecture the training libraries used.","input_schema":{"type":"object","required":["sequence"],"properties":{"topN":{"type":"integer","default":10,"maximum":50,"minimum":1,"description":"How many top-ranked pegRNAs to return, out of the hundreds enumerated. Max 50."},"cellType":{"enum":["HEK","K562"],"type":"string","default":"HEK","description":"Which trained context to RANK by. Both scores are always returned; this decides the ordering. There is no generic-mammalian option because the model has no such training data."},"sequence":{"type":"string","description":"Target with the edit in brackets: context, then (original/edited), then context. Roughly 100+ bp each side — the model reads that context. Keep unchanged flanking bases OUTSIDE the brackets: T(a/g)C, not (TAC/TGC). Insertions and deletions leave one side empty, e.g. (/AGG) or (AGG/)."},"use5Folds":{"type":"boolean","default":false,"description":"Average all five trained folds instead of the first. Modestly steadier scores for five times the compute, and it is charged five times as much."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Prime-editing efficiency (PRIDICT2.0)","readOnlyHint":true,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"prime_editing_twin_design","title":"twinPE Studio (dual pegRNA)","description":"Design a twinPE pegRNA pair (Anzalone et al. 2022) for a replacement too large for a single pegRNA's RTT: a left pegRNA nicks the + strand at/before the replacement window and a right pegRNA nicks the - strand at/after it, each synthesizing a new 3' flap; both flaps are truncated at a shared overlap in the middle of the new sequence so they anneal and resolve the edit without an HDR donor. Coordinates: both pegRNAs' protospacerStart/protospacerEnd/nickPosition are 1-based inclusive in the submitted PRE-EDIT target's frame (the PAM search runs on the unedited sequence, on both sides), while replaceSpan is the span of the new content in the returned editedSequence. Off-target activity is not evaluated (no in-browser reference genome).","input_schema":{"type":"object","required":["target","replaceStart","replaceEnd","newSequence"],"properties":{"target":{"type":"string","residues":"nt","description":"Forward-strand target DNA (raw or FASTA), with flanking sequence on both sides of the replacement window."},"pbsLength":{"type":"integer","description":"Optional preferred PBS length to highlight; a full 8-17 nt sweep is always returned."},"replaceEnd":{"type":"integer","description":"1-based inclusive end of the region being replaced/deleted. For a pure insertion, set replaceEnd = replaceStart - 1."},"newSequence":{"type":"string","residues":"nt","description":"New sequence (forward strand) to install in place of [replaceStart, replaceEnd]. Needs >= 2 bp."},"replaceStart":{"type":"integer","description":"1-based inclusive start of the region being replaced/deleted."},"overlapLength":{"type":"integer","default":15,"description":"Length (bp) of the shared overlap built into both pegRNAs' 3' flaps where they meet and anneal."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"twinPE Studio (dual pegRNA)","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"primer_design","title":"Primer designer","description":"De-novo PCR primer design (Primer3-style penalty picker): enumerate and score candidate primer pairs against length/Tm/GC/3'-clamp/structure constraints.","input_schema":{"type":"object","required":["template"],"properties":{"mgMM":{"type":"number","default":1.5,"description":"Divalent cation [Mg2+] (mM)."},"naMM":{"type":"number","default":50,"description":"Monovalent cation [Na+]/[K+] (mM)."},"gcMax":{"type":"number","default":60},"gcMin":{"type":"number","default":40},"tmMax":{"type":"number","default":63},"tmMin":{"type":"number","default":57},"tmOpt":{"type":"number","default":60},"dntpMM":{"type":"number","default":0.2,"description":"Total [dNTP] (mM), chelates Mg2+."},"lenMax":{"type":"integer","default":25,"maximum":100,"minimum":1},"lenMin":{"type":"integer","default":18},"lenOpt":{"type":"integer","default":20},"gcClamp":{"type":"integer","description":"Consecutive G/C required at the very 3' end (Primer3's PRIMER_GC_CLAMP). Omitted or 0 means no requirement."},"oligoNM":{"type":"number","default":250,"description":"Total strand concentration (nM)."},"maxPolyX":{"type":"integer","description":"Longest run of one base a primer may contain (Primer3's PRIMER_MAX_POLY_X). Omitted or 0 means no limit."},"template":{"type":"string","residues":"nt","description":"Nucleotide sequence (raw or FASTA; IUPAC accepted)."},"maxReturn":{"type":"integer","default":5,"description":"Number of best pairs to return."},"targetEnd":{"type":"integer","description":"1-based inclusive end of the target region (optional)."},"tmMaxDiff":{"type":"number","default":3,"description":"Max Tm difference within a pair (°C)."},"ampliconMax":{"type":"integer","default":1000},"ampliconMin":{"type":"integer","default":100},"targetStart":{"type":"integer","description":"1-based inclusive start of a region the product must span (optional)."},"excludedRegions":{"type":"array","items":{"type":"object","required":["start","end"],"properties":{"end":{"type":"integer"},"start":{"type":"integer"}}},"description":"Regions no primer may overlap, 1-based inclusive, as {start,end}. start > end is a region crossing the origin of a circular template."},"minThreePrimeDG":{"type":"number","description":"Floor on the NN ΔG37 (kcal/mol) of the five 3'-most bases; a more stable end than this is rejected. Deliberately not Primer3's max_end_stability, which is a different scale this model has not been calibrated against."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Primer designer","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"primer_site_accessibility","title":"Is the template folded over my primer site?","description":"Fold the template around each place a primer binds, at the annealing temperature and under DNA parameters, and report how much of the primer's own footprint sits inside a helix. Primer design tools score the oligo — its Tm, its hairpin, its dimers — and leave the template unexamined, while a binding site buried in a stable stem is an ordinary reason a well-designed primer does not amplify. Returns the folded window, its free energy, the paired fraction of the footprint, and how many of the 3'-terminal five bases are paired.","input_schema":{"type":"object","required":["template","primer"],"properties":{"primer":{"type":"string","description":"The primer, 5'->3'."},"circular":{"type":"boolean","default":false,"description":"Wrap the window across the origin instead of clipping it."},"template":{"type":"string","description":"The template the primer has to bind — the region of interest, a plasmid, or an amplicon."},"windowNt":{"type":"number","default":120,"maximum":200,"minimum":40,"description":"Template to fold around each site, centred on the footprint. 40-200 nt."},"annealingTemp":{"type":"number","default":60,"maximum":95,"minimum":20,"description":"The annealing temperature in Celsius. This is the whole reason the tool exists — structure at 37 C is not structure at 60 C, and the number changes the answer."},"maxMismatches":{"type":"number","maximum":10,"minimum":0,"description":"Mismatches allowed when locating the primer. Defaults to the binding scanner's own rate."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Is the template folded over my primer site?","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"primer_specificity","title":"Primer specificity screen","description":"Self-hosted e-PCR-style screen for off-target amplicons predicted by a primer pair against the background chosen with `background`: the bundled lab genomes (the default — E. coli K-12 MG1655, B. subtilis 168, human mitochondrion rCRS, Mycoplasma hyorhinis SK76), or the human or mouse TRANSCRIPTOME, one transcript per gene, where an off-target product means a different GENE. See genomesChecked in the response for what actually ran. No background covers the nuclear genome, so an off-target in an intron, a promoter, an intergenic region or genomic-DNA carry-over is out of scope in every mode. Amplicons are 1-based inclusive on the plus strand; a product across a circular genome's origin reports an end lower than its start and sets wraps: true. This checks background/host-genome specificity, NOT whether the primers hit your intended target — pair it with in_silico_pcr against your own template for that. Each off-target end reports its 3' ANCHOR — the primer's unbroken run of matched bases at the extending end — with that anchor's nearest-neighbor ΔG and a margin against the intended, fully matched reaction, so a site can be told apart by WHERE its mismatches fall rather than only how many there are: one mismatch at the 5' end leaves a site nearly as strong, and one at the 3' base leaves it unable to prime at all. Batchable over candidate REVERSE primers against one fixed forward primer (screen many candidates against a shared partner) — not independent primer-pair batching, which this tool doesn't support. A primer may carry a non-templated 5' tail (a restriction site, a Gibson arm, a tag): the screen looks for a 3'-anchored annealing region as well as a full-length match, so a tailed cloning primer is screened rather than silently matching nothing. Each end's `anchor` is the annealed run, which is the length that matters for extension, and `start`/`end` are measured on the ANNEALED footprints — the bases each primer actually pairs with on the genome — so `length` (the product, tails included) equals end - start + 1 only for untailed primers. Screening a TAILED primer without `intendedTemplate` inflates every margin by the tail's own free energy, because nothing about an oligo says where its non-templated part ends; `intended.basis` reports which footprint the margins rest on.","input_schema":{"type":"object","required":["forwardPrimer","reversePrimer"],"properties":{"background":{"enum":["lab-genomes","human","mouse"],"type":"string","default":"lab-genomes","description":"What to screen against. \"lab-genomes\" (the default) is the bundled set of common lab reference genomes. \"human\" is MANE Select and \"mouse\" is RefSeq Select — ONE TRANSCRIPT PER GENE, so an off-target product means a DIFFERENT GENE rather than another isoform of the one you meant (the full RefSeq set holds ~190,000 transcripts, most of them isoforms of each other, and screening against it buries the one real finding under fifteen copies of your own gene). These are TRANSCRIPTOMES, so they cover spliced mRNA only: an off-target in an intron, a promoter, an intergenic region or an unannotated locus is NOT in scope, and neither is genomic DNA contamination — read a clean result as \"does not amplify another mRNA\", never as \"genome-wide specific\". Each is a pinned annotation release, named in genomesChecked."},"forwardPrimer":{"type":"string","residues":"nt","description":"Forward primer, 5'→3'."},"maxMismatches":{"type":"integer","default":1,"maximum":4,"minimum":0,"description":"Mismatches tolerated per primer against a reference genome. Capped at 4 — past that a primer would not extend anyway. No primer length is refused for raising this: the pigeonhole seed just gets shorter and less selective, so more candidate sites are verified and the call takes longer (an 18-mer over the bundled genomes runs in ~0.1 s at 0 and ~1.5 s at 4). A short primer at a high setting can still exceed the binding-site pairing limit and come back \"unsupported\" — a 13-mer at 4 binds too many places to pair up, where an 18-mer screens fine — and either primer under 13 nt is not screened at all (ambiguousSeed: true, no amplicons)."},"reversePrimer":{"type":"string","residues":"nt","description":"Reverse primer, 5'→3'."},"intendedTemplate":{"type":"string","residues":"nt","description":"The template these primers are meant to amplify. Only their annealing footprints are read from it, so an amplicon, a plasmid or a cassette is always enough (at most 1,000,000 bp). Passing it is what makes closestCompetitorMargin true for a primer carrying a 5' tail: a tail is non-templated by definition, so nothing about the oligo says where it ends, and without a template the screen has to assume the whole oligo anneals — which credits the intended reaction with a duplex the tail cannot form ANYWHERE and inflates every margin by that tail's own free energy. Searched on both strands as given; a primer that cannot be found on it is an error rather than a silent fall back to the whole oligo."},"maxProductLength":{"type":"integer","default":5000,"minimum":1,"description":"Ignore candidate off-target products longer than this (bp) — a search-window cap, not a biological claim."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Primer specificity screen","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"},{"name":"promoter_library_design","title":"Design a non-repetitive promoter library spanning a strength range","description":"Build a set of sigma-70 promoters that (a) share no more than a chosen length of sequence with each other, so the library does not recombine with itself once integrated, and (b) span a range of predicted transcription rates, picked as an evenly log-spaced ladder. Variants are constructed deterministically from an IUPAC template holding the -35 and -10 consensus; their strengths are then estimated by the Promoter Calculator model. Rungs with no variant near them are reported as gaps rather than filled with the nearest thing. PREDICTED, NOT MEASURED: strengths carry R^2 = 0.45-0.60 against independent in vivo data, so treat the ladder as a ranked set to screen, not as calibrated numbers. PREDICTED, NOT MEASURED. R^2 = 0.45 and 0.60 against the two INDEPENDENT in vivo datasets the authors tested (Hossain et al., 4,350 promoters, Spearman rho = 0.69; Urtecho et al., 10,898 promoters, rho = 0.67). The widely quoted R^2 = 0.80 is a held-out tenth of the authors' OWN in vitro transcription data and is not the number to plan against: a promoter in a cell is the in vivo case, where between a third and a half of the variance is unexplained. Valid for: sigma-70 (housekeeping) promoters in E. coli. NOT valid for another sigma factor, another organism, a promoter under activator or repressor control, or anything about mRNA stability or translation — rbs_predict is the translation half, and neither speaks to the other.","input_schema":{"type":"object","required":["librarySize"],"properties":{"lmax":{"type":"integer","default":12,"maximum":40,"minimum":8,"description":"Longest stretch any two promoters in the library may share, in bp (default 12). This is the property that stops the library recombining with itself."},"seed":{"type":"integer","default":1,"description":"Seeds variant construction; same seed, same variants."},"gcMax":{"type":"number","default":100,"maximum":100,"minimum":0,"description":"Highest GC% a variant may have."},"gcMin":{"type":"number","default":0,"maximum":100,"minimum":0,"description":"Lowest GC% a variant may have."},"exclude":{"type":"array","items":{"type":"string"},"description":"Motifs no variant may contain, both strands — the restriction sites you clone with. Literal ACGT only."},"template":{"type":"string","description":"IUPAC template every variant must match. Defaults to a sigma-70 layout holding TTGACA and TATAAT with a 17 nt spacer and randomised flanks. Change it to target a different architecture — but a template that randomises the boxes will produce members that are not promoters."},"targetMax":{"type":"number","description":"Strongest rung, same units. Omit with targetMin to use the variants' own range."},"targetMin":{"type":"number","description":"Weakest rung, in the model's arbitrary transcription-rate units. OMIT THIS and the range is taken from what the built variants actually score, which is usually right: the units have no absolute meaning, so a default would describe nothing. Set it only to match a promoter you measured yourself."},"librarySize":{"type":"integer","maximum":24,"minimum":2,"description":"How many promoters the ladder should have (2 to 24). Required: every other argument has a defensible default, so this is the one statement of intent, and without it an empty call would build and score a library nobody asked for."},"candidatePool":{"type":"integer","default":24,"maximum":48,"minimum":4,"description":"How many variants to build and score before selecting the ladder. A larger pool fills more rungs and costs one longer scan, not more round trips."}},"additionalProperties":false},"output_schema":null,"annotations":{"title":"Design a non-repetitive promoter library spanning a strength range","readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T02:55:15.183Z"}],"next_cursor":"promoter_library_design","next_actions":[{"action":"list_tools","description":"Next page","href":"/v1/servers/com.seqbench%2Fworkbench/tools?cursor=promoter_library_design&limit=100","arguments":{"name":"com.seqbench/workbench","cursor":"promoter_library_design","limit":100}},{"action":"get_connection","description":"Connection block to call these tools","href":"/v1/servers/com.seqbench%2Fworkbench/connection?target=mcpServers","arguments":{"name":"com.seqbench/workbench","target":"mcpServers"}},{"action":"get_server","description":"Full descriptor with trust and connectability","href":"/v1/servers/com.seqbench%2Fworkbench","arguments":{"name":"com.seqbench/workbench"}}]}