Lab video or protocols.io protocol to a simulator-checked Opentrons Flex/OT-2 protocol
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
This run's per-reaction volumes next to those of published protocols.io protocols that use the same kit, read by Muse Spark: each match has the published volume, its verbatim quote (checked to be in the protocol's text), both reagents' share of the reaction and whether they agree within 20 %.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http show-dont-code https://pugarhuda--show-dont-code-web.us-east.modal.run/mcp
This run's per-reaction volumes next to those of published protocols.io protocols that use the same kit, read by Muse Spark: each match has the published volume, its verbatim quote (checked to be in the protocol's text), both reagents' share of the reaction and whether they agree within 20 %.
| Argument | Type | Description |
|---|---|---|
| name* | string |
{
"type": "object",
"title": "crosscheck_volumesArguments",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"title": "Name"
}
}
}The illustrated bench card for training: each filmed step drawn by Muse Image from its own video frame (an edit of the real frame, no text drawn in), Muse Spark's check that the drawing kept every object, and the step's reagent and volume from the protocol. Image links are under /api/runs/<name>/bench-card/<step>.jpg.
| Argument | Type | Description |
|---|---|---|
| name* | string |
{
"type": "object",
"title": "get_bench_cardArguments",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"title": "Name"
}
}
}The generated Opentrons Flex protocol (Python, API 2.24), ready to import into the Opentrons App.
| Argument | Type | Description |
|---|---|---|
| name* | string |
{
"type": "object",
"title": "get_protocolArguments",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"title": "Name"
}
}
}The protocol as an Opentrons Protocol Designer file: import it at designer.opentrons.com to edit each step (transfers, mixes, the thermocycler program) without code. The Opentrons App can also run it as is.
| Argument | Type | Description |
|---|---|---|
| name* | string |
{
"type": "object",
"title": "get_protocol_designerArguments",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"title": "Name"
}
}
}Reproducibility receipt: SHA-256 of the protocol, the video and every model output, and which models ran, anchored in Bitcoin with OpenTimestamps ('timestamp': pending calendars, or the confirming block).
| Argument | Type | Description |
|---|---|---|
| name* | string |
{
"type": "object",
"title": "get_receiptArguments",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"title": "Name"
}
}
}Public protocols on protocols.io that use this run's reagents (brand and kit names) and protocol type, with DOIs and which reagent words each mentions: how other labs wrote up the same kit.
| Argument | Type | Description |
|---|---|---|
| name* | string |
{
"type": "object",
"title": "get_related_protocolsArguments",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"title": "Name"
}
}
}The steps found in the video (with video seconds), the open questions, and the Opentrons simulator and protocol analysis results, including the deck setup, runtime parameters and the thermocycler's minimum time in seconds.
| Argument | Type | Description |
|---|---|---|
| name* | string |
{
"type": "object",
"title": "get_runArguments",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"title": "Name"
}
}
}The tubes to load on the tube rack before the run: each tube's deck slot and well, how many µL to fill a source tube with (what the robot draws + 10 % + dead volume) for `reactions` copies of the filmed reaction (protocol.py's Reactions parameter, up to max_reactions), and the link its label's QR code opens. Links to the printable labels: an Avery L7160 sheet (SVG) and a Zebra thermal printer file (ZPL, 2 x 1 in).
| Argument | Type | Description |
|---|---|---|
| name* | string | |
| reactions | integer |
{
"type": "object",
"title": "get_tube_labelsArguments",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"title": "Name"
},
"reactions": {
"type": "integer",
"title": "Reactions",
"default": 1
}
}
}Names of the sample runs (videos already turned into protocols).
No arguments.
{
"type": "object",
"title": "list_runsArguments",
"properties": {}
}Run the run's protocol.py end to end on Opentrons' own robot-server (the software inside a Flex, v10.1.0) in Flex simulation, with the Reactions parameter set: the robot's analysis, deck configuration, play to the end. Returns the robot's report (status 'succeeded', command count). About a minute the first time, then cached. Runs only the protocol this server generated, never code an agent sends.
| Argument | Type | Description |
|---|---|---|
| name* | string | |
| reactions | integer |
{
"type": "object",
"title": "run_on_flex_robot_serverArguments",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"title": "Name"
},
"reactions": {
"type": "integer",
"title": "Reactions",
"default": 1
}
}
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 4, 2026.
No readOnlyHint / destructiveHint annotations, so clients can't tell a read from a write without asking.
Fix: Add annotations to each tool, e.g. { readOnlyHint: true } for tools that only read.