Agent skill

Protocol Authoring

by Opentrons in Opentrons/opentrons

Create valid Opentrons Python API protocols for OT-2 and Flex robots.

Apache-2.0Auto-check passedDevelopment

Install Protocol Authoring

skills CLI
$ npx skills add Opentrons/opentrons --skill protocol-authoring -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install Opentrons/opentrons protocol-authoring --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/Opentrons/opentrons.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.cursor/skills/protocol-authoring .claude/skills/protocol-authoring && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
protocol-authoring
GitHub stars
521
Token cost
~4.9k tokens
SKILL.md length
1,242 words
Files
8
Skills in repo
17
Repo updated
First seen
Licence
Apache-2.0

At a glance

Create valid Opentrons Python API protocols for OT-2 and Flex robots.

  • Works in 8 steps: Don't ask unnecessary questions. Pick… → Keep protocols minimal. Use the fewest… → Always define liquids with… → …
  • Helping with protocol files
  • SKILL.md covers Behavior Defaults — READ FIRST, Quick Start — Flex Protocol…, Quick Start — OT-2 Protocol and Required Elements, plus 13 more sections
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md

What it does

Protocol Authoring is an agent skill from Opentrons/opentrons. Create valid Opentrons Python API protocols for OT-2 and Flex robots. Use when creating, writing, editing, or helping with protocol files, liquid handling automation, or Opentrons protocol development. Also use when debugging protocol errors to trace into API source code.

Its SKILL.md is about 4.9k tokens, which your agent loads only when the skill is triggered. The skill folder holds 7 other files (for example `reference-96channel.md`, `reference-examples-index.md` and `reference-labware-deck.md`).

It sits in Development. It works with Python. The repository describes itself as: Software for writing protocols and running them on the Opentrons Flex and Opentrons OT-2. The licence is Apache-2.0.

When your agent uses it

  • Helping with protocol files
  • Liquid handling automation
  • Opentrons protocol development
  • Debugging protocol errors to trace into API source code

Example prompts

  • “/protocol-authoring”

Requirements

  • Python 3

Workflow steps

8 steps, taken from the first numbered list in SKILL.md.

  1. Don't ask unnecessary questions. Pick reasonable labware, volumes, and pipettes. Just produce a valid, working protocol.
  2. Keep protocols minimal. Use the fewest steps needed to demonstrate the requested behavior. Don't generate dozens of repeated transfers…
  3. Always define liquids with protocol.define_liquid() and well.load_liquid() for all source wells.
  4. Default to liquid class functions (transfer_with_liquid_class, distribute_with_liquid_class, consolidate_with_liquid_class) on Flex with…
  5. Default to Flex unless the user specifies OT-2.
  6. Use the latest API version unless the user specifies otherwise. Look up MAX_SUPPORTED_VERSION in…
  7. Default liquid class: water. Use glycerol_50 or ethanol_80 if the protocol context calls for viscous or volatile liquids.
  8. Reasonable defaults: flex_1channel_1000 pipette, opentrons_flex_96_tiprack_1000ul tip rack, nest_96_wellplate_2ml_deep plate, 100 µL…

What it can do on your machine

Read from SKILL.md and the folder at commit a14fef9. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    No scripts in the folder and no shell commands in SKILL.md (its code samples are python and json).

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Links to these hosts (documentation or services it may open):

    • labware.opentrons.com

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Protocol Authoring loads about 4.9k tokens when it runs. Until then it costs about 73 tokens; SKILL.md has 1,242 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~73
When it runs · the whole SKILL.md, loaded when a task matches
~4.9k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from Opentrons/opentrons at commit a14fef9, republished under its Apache-2.0 licence (© Opentrons). 1,242 words, ~4,933 tokens.

Download SKILL.mdSave it as .claude/skills/protocol-authoring/SKILL.md (or your agent's skills folder). This skill also uses 7 other files; get the full folder from GitHub.
name
protocol-authoring
description
Create valid Opentrons Python API protocols for OT-2 and Flex robots. Use when creating, writing, editing, or helping with protocol files, liquid handling automation, or Opentrons protocol development. Also use when debugging protocol errors to trace into API source code.

Opentrons Protocol Authoring

Behavior Defaults — READ FIRST

This skill is primarily used by developers, SDETs, and QA who need protocols for testing and development. Follow these defaults unless the user explicitly says otherwise:

  1. Don't ask unnecessary questions. Pick reasonable labware, volumes, and pipettes. Just produce a valid, working protocol.
  2. Keep protocols minimal. Use the fewest steps needed to demonstrate the requested behavior. Don't generate dozens of repeated transfers — 2–4 operations are enough to validate a feature.
  3. Always define liquids with protocol.define_liquid() and well.load_liquid() for all source wells.
  4. Default to liquid class functions (transfer_with_liquid_class, distribute_with_liquid_class, consolidate_with_liquid_class) on Flex with API >= 2.24. Fall back to plain transfer/distribute/consolidate only for OT-2 or when the user explicitly asks.
  5. Default to Flex unless the user specifies OT-2.
  6. Use the latest API version unless the user specifies otherwise. Look up MAX_SUPPORTED_VERSION in api/src/opentrons/protocols/api_support/definitions.py to get the current value.
  7. Default liquid class: water. Use glycerol_50 or ethanol_80 if the protocol context calls for viscous or volatile liquids.
  8. Reasonable defaults: flex_1channel_1000 pipette, opentrons_flex_96_tiprack_1000ul tip rack, nest_96_wellplate_2ml_deep plate, 100 µL transfer volume.

Quick Start — Flex Protocol (Default)

python
from opentrons import protocol_api

metadata = {
    "protocolName": "Liquid Class Transfer Demo",
    "author": "Opentrons",
    "description": "Minimal transfer using liquid classes",
}

requirements = {"robotType": "Flex", "apiLevel": "<MAX_SUPPORTED_VERSION>"}
# ^^^ Replace <MAX_SUPPORTED_VERSION> with the value from
# api/src/opentrons/protocols/api_support/definitions.py

def run(protocol: protocol_api.ProtocolContext) -> None:
    trash = protocol.load_trash_bin("A3")

    tiprack = protocol.load_labware("opentrons_flex_96_tiprack_1000ul", "D2")
    source_plate = protocol.load_labware("nest_96_wellplate_2ml_deep", "D1")
    dest_plate = protocol.load_labware("nest_96_wellplate_2ml_deep", "C1")

    pipette = protocol.load_instrument(
        "flex_1channel_1000", mount="left", tip_racks=[tiprack]
    )

    # Define and load liquids
    sample = protocol.define_liquid(
        name="Sample", description="Aqueous sample", display_color="#0088FF"
    )
    source_plate["A1"].load_liquid(liquid=sample, volume=500)
    source_plate["A2"].load_liquid(liquid=sample, volume=500)

    # Use liquid class transfer (default: water)
    water = protocol.get_liquid_class(name="water")
    pipette.transfer_with_liquid_class(
        liquid_class=water,
        volume=100,
        source=[source_plate["A1"], source_plate["A2"]],
        dest=[dest_plate["A1"], dest_plate["A2"]],
        new_tip="always",
    )

Quick Start — OT-2 Protocol

python
from opentrons import protocol_api

metadata = {
    "protocolName": "OT-2 Transfer Demo",
    "author": "Opentrons",
    "description": "Minimal transfer for OT-2",
}

requirements = {"robotType": "OT-2", "apiLevel": "<MAX_SUPPORTED_VERSION>"}

def run(protocol: protocol_api.ProtocolContext) -> None:
    tiprack = protocol.load_labware("opentrons_96_tiprack_300ul", "1")
    source_plate = protocol.load_labware("nest_96_wellplate_2ml_deep", "2")
    dest_plate = protocol.load_labware("nest_96_wellplate_2ml_deep", "3")

    pipette = protocol.load_instrument(
        "p300_single_gen2", mount="left", tip_racks=[tiprack]
    )

    sample = protocol.define_liquid(
        name="Sample", description="Aqueous sample", display_color="#0088FF"
    )
    source_plate["A1"].load_liquid(liquid=sample, volume=500)

    pipette.transfer(100, source_plate["A1"], dest_plate["A1"])

Required Elements

  1. requirements dict — robotType ("Flex" or "OT-2") and apiLevel
  2. def run(protocol): — entry point receiving ProtocolContext
  3. Flex only: must load trash bin or waste chute before any drop_tip

metadata dict is optional but recommended. apiLevel goes in metadata OR requirements, not both.

Look up the current max API version from MAX_SUPPORTED_VERSION in api/src/opentrons/protocols/api_support/definitions.py. Flex requires >= 2.15.

Liquid Classes (Default for Flex)

Available liquid classes (Flex, API >= 2.24):

NameTypeWhen to Use
waterAqueousDefault for most protocols
glycerol_50ViscousViscous samples, glycerol solutions
ethanol_80VolatileEthanol, volatile solvents
python
water = protocol.get_liquid_class(name="water")

# Transfer (1-to-1)
pipette.transfer_with_liquid_class(
    liquid_class=water, volume=100,
    source=[plate["A1"]], dest=[plate["B1"]],
    new_tip="always",
)

# Distribute (1-to-many)
pipette.distribute_with_liquid_class(
    liquid_class=water, volume=50,
    source=reservoir["A1"], dest=plate.rows()[0][:4],
    new_tip="once",
)

# Consolidate (many-to-1)
pipette.consolidate_with_liquid_class(
    liquid_class=water, volume=50,
    source=plate.rows()[0][:4], dest=reservoir["A1"],
    new_tip="once",
)

Defining Liquids (Always Do This)

python
sample = protocol.define_liquid(
    name="Sample", description="Aqueous sample", display_color="#0088FF"
)
buffer = protocol.define_liquid(
    name="Buffer", description="Wash buffer", display_color="#00CC66"
)
reagent = protocol.define_liquid(
    name="Reagent", description="Reaction reagent", display_color="#FF4444"
)

source_plate["A1"].load_liquid(liquid=sample, volume=500)
reservoir["A1"].load_liquid(liquid=buffer, volume=10000)

Common display colors: #0088FF (blue/sample), #00CC66 (green/buffer), #FF4444 (red/reagent), #FFB800 (yellow/media), #9933FF (purple/enzyme), #FF6B35 (orange/beads).

OT-2 vs Flex Key Differences

FeatureOT-2Flex
Deck slots1–11 (numeric)A1–D4 (alphanumeric)
TrashFixed (slot 12)Must call load_trash_bin()
Liquid classesNot supportedget_liquid_class() (API 2.24+)
GripperN/Amove_labware(lw, dest, use_gripper=True)
96-channelN/Aflex_96channel_1000
Flex Deck Layout
text
     1        2        3        4 (staging)
A  [ A1 ]  [ A2 ]  [ A3 ]  [ A4 ]
B  [ B1 ]  [ B2 ]  [ B3 ]  [ B4 ]
C  [ C1 ]  [ C2 ]  [ C3 ]  [ C4 ]
D  [ D1 ]  [ D2 ]  [ D3 ]  [ D4 ]
OT-2 Deck Layout
text
 10    11    12(trash)
  7     8     9
  4     5     6
  1     2     3

Pipettes

Flex
NameChannelsRange
flex_1channel_5011–50 µL
flex_1channel_20011–200 µL
flex_1channel_100015–1000 µL
flex_8channel_5081–50 µL
flex_8channel_20081–200 µL
flex_8channel_100085–1000 µL
flex_96channel_200961–200 µL
flex_96channel_1000965–1000 µL
OT-2
NameChannelsRange
p20_single_gen211–20 µL
p300_single_gen2120–300 µL
p1000_single_gen21100–1000 µL
p20_multi_gen281–20 µL
p300_multi_gen2820–300 µL

Common Labware

Flex tip racks: opentrons_flex_96_tiprack_50ul, opentrons_flex_96_tiprack_200ul, opentrons_flex_96_tiprack_1000ul

OT-2 tip racks: opentrons_96_tiprack_20ul, opentrons_96_tiprack_300ul, opentrons_96_tiprack_1000ul

Plates: nest_96_wellplate_2ml_deep, corning_96_wellplate_360ul_flat, opentrons_96_wellplate_200ul_pcr_full_skirt, nest_96_wellplate_200ul_flat

Reservoirs: nest_12_reservoir_15ml, nest_1_reservoir_195ml, nest_1_reservoir_290ml

Tube racks: opentrons_24_tuberack_nest_1.5ml_snapcap, opentrons_6_tuberack_nest_50ml_conical

Modules Quick Reference

python
temp_mod = protocol.load_module("temperature module gen2", "D1")
tc = protocol.load_module("thermocycler module gen2")        # A1+B1 on Flex
hs = protocol.load_module("heaterShakerModuleV1", "C1")
mag_block = protocol.load_module("magneticBlockV1", "C1")    # Flex only
mag_mod = protocol.load_module("magnetic module gen2", "1")   # OT-2 only
apr = protocol.load_module("absorbanceReaderV1", "B3")        # Flex, API 2.21+
stacker = protocol.load_module("flexStackerModuleV1", "D4")   # Flex, API 2.25+

For detailed module operations, see reference-modules.md.

Runtime Parameters (API 2.18+)

python
def add_parameters(parameters: protocol_api.Parameters) -> None:
    parameters.add_int(variable_name="sample_count", display_name="Samples",
                       default=8, minimum=1, maximum=96)
    parameters.add_bool(variable_name="dry_run", display_name="Dry Run", default=False)

def run(protocol: protocol_api.ProtocolContext) -> None:
    count = protocol.params.sample_count

For complete RTP guide, see reference-rtp.md.

Working Directories (Monorepo Root)

All local dev artifacts live in these gitignored directories:

DirectoryPurpose
tmp-protocols/Protocol .py files
tmp-custom-labware/Custom labware .json definitions
tmp-csv/CSV files for RTP inputs

Custom Labware

Custom labware JSON files go in tmp-custom-labware/. The parameters.loadName in the JSON is the string passed to load_labware().

Creating a Custom Labware Definition

The easiest starting point is copying an existing definition from shared-data/labware/definitions/2/<name>/<version>.json and modifying the key fields:

json
{
  "namespace": "custom",
  "version": 1,
  "parameters": {
    "loadName": "my_custom_plate"
  },
  "metadata": {
    "displayName": "My Custom Plate"
  }
  ...
}

Required changes when deriving from an existing definition:

  • parameters.loadName → your unique load name (no spaces, underscores OK)
  • namespace → "custom" (must not be "opentrons")
  • version → 1
  • metadata.displayName → human-readable name

Save as tmp-custom-labware/<loadName>.json (file name convention matches loadName).

Using Custom Labware in a Protocol
python
plate = protocol.load_labware("my_custom_plate", "D1")

No special import needed — the CLI handles loading the definition at run time.

For a proper custom labware definition from scratch, use the Opentrons Labware Creator

CSV Runtime Parameters

CSV files go in tmp-csv/. They are used exclusively via the add_csv_file RTP type (API 2.20+).

Defining a CSV Parameter
python
def add_parameters(parameters: protocol_api.Parameters) -> None:
    parameters.add_csv_file(
        variable_name="transfer_map",
        display_name="Transfer Map",
        description="CSV with columns: source_well, dest_well, volume_ul",
    )
Using the CSV in run()
python
rows = protocol.params.transfer_map.parse_as_csv()
# rows is a list of lists; rows[0] is the header row
for row in rows[1:]:
    src, dst, vol = row[0].strip(), row[1].strip(), float(row[2].strip())
    pipette.transfer(vol, source[src], dest[dst])
Example CSV (tmp-csv/transfer_map.csv)
text
source_well,dest_well,volume_ul
A1,A1,100
A2,A2,150
A3,A3,75

Note: opentrons_simulate cannot accept RTP files. Protocols with CSV RTPs must be verified with opentrons analyze. See the protocol-verification skill.

Additional References

Skill Reference Files (in this directory)
FileWhen to use
reference-liquid-handling.mdDetailed liquid handling patterns, tip math, transfer anti-patterns
reference-modules.mdModule load names, operations, Flex Stacker, APR
reference-rtp.mdRuntime parameters — all types, CSV RTPs
reference-source-map.mdSource code navigation for debugging
reference-labware-deck.mdCommon labware load names, deck layout rules (Flex + OT-2), OT-2→Flex migration
reference-96channel.md96-channel pipette constraints, nozzle configs, tip adapter rules
reference-examples-index.mdIndex of AI server example docs — what each covers and when to read it
Show full SKILL.md (523 more words)Show less
AI Server Source Docs (read on demand)

Located in opentrons-ai-server/api/storage/docs/. Use reference-examples-index.md to decide which file to read. Do not read all of them — they total ~10,000 lines. Read only what the current task needs.

FileContents
full-examples.mdComplete production protocols (PCR, reagent transfer, HS)
casual_examples.mdCasual NL → protocol mappings, pooling, triplicates
serial_dilution_examples.mdSerial dilution patterns (single/multi-channel, row/column-wise)
pcr_protocols_with_csv.mdPCR + CSV RTP well mapping, thermocycler profiles
transfer_function_notes.mdtransfer() deep dive — loops, tip behavior, modules
out_of_tips_error_219.mdTip math, multi-channel capacity, index error prevention
commands-v0.0.1.mdCommon command patterns and pitfalls
standard-loadname-info.mdFull labware catalog (86 items)
96-channel-pipette.mdFull 96-channel guide (see reference-96channel.md for summary)
deck_layout.mdFull deck rules (see reference-labware-deck.md for summary)
OT2ToFlex.mdFull migration guide (see reference-labware-deck.md for summary)
transfer_with_liquid_class.mdLiquid class transfer differences and custom properties
flex_stacker_usage.mdFlex Stacker patterns (see reference-modules.md for summary)
runtime_parameters.mdRTP examples (see reference-rtp.md for summary)

Keeping This Skill Current

Update this skill whenever you discover something new. These files are the team's shared knowledge base — stale information hurts everyone.

TriggerWhat to update
A new API method, parameter, or behavior is usedAdd it to the relevant section in SKILL.md or the appropriate reference-*.md
A bug or constraint is found via source inspectionAdd it to reference-source-map.md under the relevant debugging section
MAX_SUPPORTED_VERSION changesCheck api/src/opentrons/protocols/api_support/definitions.py and add any new API-version-gated features to the skill
A new labware load name is usedAdd it to the Common Labware list
A new liquid class becomes available in shared-data/liquid-class/definitions/Add it to the Liquid Classes table
Actual behavior differs from what this skill saysCorrect the skill, not just the protocol
A new module is supportedAdd it to the Modules section and reference-modules.md

How to update: use the Write or StrReplace tools on the relevant skill file. Keep edits focused — fix only what changed. Don't rewrite sections that are still accurate.

Common Mistakes

  • Forgetting load_trash_bin() on Flex
  • Using OT-2 pipette names on Flex or vice versa
  • Putting apiLevel in both metadata and requirements
  • Using numeric slots on Flex or alpha on OT-2
  • Exceeding pipette volume range
  • Using transfer with new_tip="never" without calling pick_up_tip() first
  • Forgetting to define_liquid / load_liquid for source wells
  • Using plain transfer on Flex when transfer_with_liquid_class is available
  • Calling apr.initialize() without apr.close_lid() first (APR lid must be closed before init)
  • Passing only the top well (e.g. plate["A1"]) to 8-channel *_with_liquid_class — must pass full column or set group_wells=False
  • Using f-strings or variable references in metadata dict — the parser requires static literals only (no f"...", no {var}, no function calls)
  • Wrapping transfer() in a for loop over wells — transfer() handles iteration internally; pass lists instead
  • Using 8-channel pipette with wells() instead of columns() — 8-channel picks up an entire column at once
  • Not accounting for 8-channel tip math: one pick_up_tip() = 8 tips; a single 96-well rack supports only 12 column operations
  • Loading a 96-channel pipette without adapter="opentrons_flex_96_tiprack_adapter" for full (ALL) tip pickup
  • Using start="A1" for 96-channel COLUMN mode — always use start="A12" to avoid deck edge collision
  • Placing a tube rack in a staging area slot (A4–D4) — gripper cannot safely move tube racks
  • Loading the Heater-Shaker or Temperature Module in column 2 slots (A2, B2, C2, D2) — forbidden on Flex

© Opentrons, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 7 other files in .cursor/skills/protocol-authoring of Opentrons/opentrons.

  • SKILL.md
  • reference-96channel.md
  • reference-examples-index.md
  • reference-labware-deck.md
  • reference-liquid-handling.md
  • reference-modules.md
  • reference-rtp.md
  • reference-source-map.md

Open the folder on GitHubat commit a14fef9

Compare with similar skills

Protocol Authoring next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Protocol Authoring compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Protocol Authoring this skillOpentrons/opentrons521—~4.9kAutomated safety check: PassApache-2.0
Code Review ChecklistshareAI-lab/learn-claude-code78k5 repos~1.1kAutomated safety check: PassMIT
Summarise Ecosystem Resultsastral-sh/ruff50k1 repos~2.2kAutomated safety check: PassMIT
Minimizing Ty Ecosystem Changesastral-sh/ruff50k—~4.6kAutomated safety check: PassMIT
Merge Dependabot PRsonyx-dot-app/onyx32k1 repos~2.2kAutomated safety check: PassMIT
Code Graph Mermaid Diagramstrailofbits/skills7.4k1 repos~1.7kAutomated safety check: PassCC-BY-SA-4.0

Similar skills

  • Code Review Checklist

    shareAI-lab/learn-claude-code

    Reviews code against a five-part checklist covering security, correctness, performance, maintainability and testing, and reports findings in a fixed format.

    78k GitHub starsUsed in 5 repos~1.1k tokens
    DevelopmentAuto-check passed
  • Official

    A skill your agent uses when a user says "summarise ecosystem results", "summarize this ty ecosystem report", "what changed in this ecosystem run?", or asks to summarise or summarize ty ecosystem…

    50k GitHub starsUsed in 1 repo~2.2k tokens
    DevelopmentAuto-check passed
  • Official

    A skill your agent uses when a user says "minimize this ty ecosystem change", "reproduce this ecosystem result", "investigate a primer difference", "investigate a mypyprimer difference"…

    50k GitHub stars~4.6k tokensUpdated today
    DevelopmentAuto-check passed
  • Merge Dependabot PRs

    onyx-dot-app/onyx

    Triages and lands a batch of open Dependabot PRs in the Onyx repo, where main is gated exclusively by GitHub's merge queue: approves and enqueues green PRs, closes superseded duplicates, fixes…

    32k GitHub starsUsed in 1 repo~2.2k tokens
    DevelopmentAuto-check passed
  • Code Graph Mermaid Diagrams

    trailofbits/skills

    Official

    Generates Mermaid diagrams from Trailmark code graphs, including call graphs, class hierarchies, module dependency maps, complexity heatmaps and attack surface data flows.

    7.4k GitHub starsUsed in 1 repo~1.7k tokens
    DevelopmentAuto-check passed
  • CLI Developer

    Jeffallan/claude-skills

    Walks through designing, building and polishing a command-line tool: user workflow and command hierarchy, implementation in commander, click, typer or cobra, completions and cross-platform testing.

    12k GitHub starsUsed in 2 repos~1.2k tokens
    DevelopmentAuto-check passed

More from Opentrons/opentrons

All 17 skills in this repo
  • AI Client

    Opentrons/opentrons

    Conventions for the opentrons-ai-client React/TypeScript frontend — project structure, API integration, state management (Jotai), feature flags, types, and testing.

    521 GitHub stars~1.6k tokensUpdated today
    Auto-check passed
  • AI Server

    Opentrons/opentrons

    Conventions for the opentrons-ai-server FastAPI service — project structure, uv dependency management, settings, testing, Docker, and deployment.

    521 GitHub stars~2.5k tokensUpdated today
    Auto-check: notes
  • Analyses Snapshot Testing

    Opentrons/opentrons

    Conventions for the analyses snapshot testing framework in analyses-snapshot-testing/.

    521 GitHub stars~1.7k tokensUpdated today
    Auto-check passed
  • CSS Modules

    Opentrons/opentrons

    CSS Modules conventions, Stylelint rules, design tokens (spacing, colors, typography, border-radius), and patterns for the Opentrons monorepo.

    521 GitHub stars~2.2k tokensUpdated today
    Auto-check passed
  • Docs

    Opentrons/opentrons

    Authoring and styling guidelines for the Opentrons /docs MkDocs project.

    521 GitHub stars~2.8k tokensUpdated today
    Auto-check passed
  • E2E Testing

    Opentrons/opentrons

    E2E testing conventions for Protocol Designer and Labware Library using Playwright + pytest in e2e-testing/.

    521 GitHub stars~3k tokensUpdated today
    Auto-check: notes

Works with

Categories

Questions about Protocol Authoring

What does Protocol Authoring do?

Create valid Opentrons Python API protocols for OT-2 and Flex robots. Protocol Authoring is an agent skill from Opentrons/opentrons. Create valid Opentrons Python API protocols for OT-2 and Flex robots.

When should I use Protocol Authoring?

Protocol Authoring fits situations like: helping with protocol files; liquid handling automation; opentrons protocol development; debugging protocol errors to trace into API source code.

How do I install Protocol Authoring in Claude Code?

Run `npx skills add Opentrons/opentrons --skill protocol-authoring -a claude-code`. Or copy the skill folder (.cursor/skills/protocol-authoring in Opentrons/opentrons) into .claude/skills/protocol-authoring in your project. Claude Code loads it when a task matches its description.

How do I install Protocol Authoring in Codex?

Run `npx skills add Opentrons/opentrons --skill protocol-authoring -a codex`. Or copy the skill folder (.cursor/skills/protocol-authoring in Opentrons/opentrons) into .agents/skills/protocol-authoring in your project. Codex loads it when a task matches its description.

Can I use Protocol Authoring in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add Opentrons/opentrons --skill protocol-authoring -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/protocol-authoring, .gemini/skills/protocol-authoring, .github/skills/protocol-authoring and .opencode/skills/protocol-authoring in your project.

What does Protocol Authoring need to run?

SKILL.md names no scripts, command-line tools or credentials: Protocol Authoring is instructions for the agent only. Our summary lists: Python 3.

Does Protocol Authoring access the network?

SKILL.md names 1 domain. As links in the text: labware.opentrons.com. This is read from the text; nothing was executed.

Is Protocol Authoring safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Protocol Authoring use?

Protocol Authoring is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Protocol Authoring use?

About 4.9k tokens (SKILL.md is roughly 20k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Protocol Authoring?

Skills that share tags, products or a category with Protocol Authoring: Code Review Checklist (shareAI-lab/learn-claude-code, 78k stars), Summarise Ecosystem Results (astral-sh/ruff, 50k stars), Minimizing Ty Ecosystem Changes (astral-sh/ruff, 50k stars) and Merge Dependabot PRs (onyx-dot-app/onyx, 32k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Protocol Authoring?

Opentrons (a GitHub organization) maintains it in Opentrons/opentrons, which has 521 GitHub stars. The repository holds 17 skills in this directory. The repository was last updated on October 7, 2026.

Source: Opentrons/opentrons on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.