# OpenReadout (mcpb · openreadout-mcp-x86_64-unknown-linux-musl.mcpb)

Read raw lab-instrument files offline: metadata, previews, integrity checks, open-format export.

- Trust score: 50/100 (low)
- Change this week: 0
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-05

## Components

- mcpb · `openreadout-mcp-aarch64-apple-darwin.mcpb`: 20/100, [markdown](https://verifymcp.io/servers/openreadout-openreadout/openreadout-mcp-aarch64-apple-darwin.md), [page](https://verifymcp.io/servers/openreadout-openreadout/openreadout-mcp-aarch64-apple-darwin)
- mcpb · `openreadout-mcp-aarch64-unknown-linux-musl.mcpb`: 20/100, [markdown](https://verifymcp.io/servers/openreadout-openreadout/openreadout-mcp-aarch64-unknown-linux-musl.md), [page](https://verifymcp.io/servers/openreadout-openreadout/openreadout-mcp-aarch64-unknown-linux-musl)
- mcpb · `openreadout-mcp-x86_64-apple-darwin.mcpb`: 20/100, [markdown](https://verifymcp.io/servers/openreadout-openreadout/openreadout-mcp-x86-64-apple-darwin.md), [page](https://verifymcp.io/servers/openreadout-openreadout/openreadout-mcp-x86-64-apple-darwin)
- mcpb · `openreadout-mcp-x86_64-pc-windows-msvc.mcpb`: 20/100, [markdown](https://verifymcp.io/servers/openreadout-openreadout/openreadout-mcp-x86-64-pc-windows-msvc.md), [page](https://verifymcp.io/servers/openreadout-openreadout/openreadout-mcp-x86-64-pc-windows-msvc)
- mcpb · `openreadout-mcp-x86_64-unknown-linux-musl.mcpb`: 50/100 (this document), [markdown](https://verifymcp.io/servers/openreadout-openreadout/openreadout-mcp-x86-64-unknown-linux-musl.md), [page](https://verifymcp.io/servers/openreadout-openreadout/openreadout-mcp-x86-64-unknown-linux-musl)
- npm · `openreadout`: 88/100, [markdown](https://verifymcp.io/servers/openreadout-openreadout/openreadout.md), [page](https://verifymcp.io/servers/openreadout-openreadout/openreadout)

## Channel facts

- Registry: `mcpb`
- Package: `https://github.com/openreadout/openreadout/releases/download/v0.4.0/openreadout-mcp-x86_64-unknown-linux-musl.mcpb`
- Transport: `stdio`
- SHA-256: `dcab570888b3f7ca9c2455cbd34efed4ad6adac6a0577caf7aca90eb79b00434`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-11-05.

- **Supply Chain Security**: 0/100
  - No malware scan is available for this kind of package: the supply-chain vendors we use do not cover it. This is a permanent gap in our coverage, not a finding about the package.
  - Known CVEs could not be checked: we found no dependency list to check in this bundle: either it runs a compiled binary, whose bundled manifests we do not read, or none of the package.json, requirements.txt, pyproject.toml or uv.lock files it ships for its runtime declares a dependency we can read (a requirements.txt that only points at a setup.py project, a local path, or a nested requirements file we cannot follow counts as none).
  - Install-script risk not yet assessed.
  - Dependency health could not be checked: we found no dependency list to check in this bundle: either it runs a compiled binary, whose bundled manifests we do not read, or none of the package.json, requirements.txt, pyproject.toml or uv.lock files it ships for its runtime declares a dependency we can read (a requirements.txt that only points at a setup.py project, a local path, or a nested requirements file we cannot follow counts as none).
- **Provenance & Transparency**: 100/100
  - Source repository is publicly reachable at the declared URL.
  - Cryptographically verified build provenance (signed, bound to openreadout/openreadout).
  - Clear OSI-approved license (MIT OR Apache-2.0).
  - Actively maintained (last published 18 days ago).
  - Publishes a security disclosure policy (SECURITY.md).
- **Schema Quality & AI Usability**: 69/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 15505 tokens (~534/item across 29 items; 28 tools + 1 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 0/100
  - Stability not yet verified: two runs of the same published version returned different tool surfaces, so we cannot tell a change in the package from a difference in our own sandbox run.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
  - Structured output schemas are declared (96% of tools); any adoption earns full credit.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 28 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 30 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

**Unverified: 2 categories.** Categories scored 0 because we could not verify them: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

## Install

### How do I install the OpenReadout MCP server?

OpenReadout ships as an MCPB bundle, a single file you download and open in an MCP host that supports MCPB bundles, such as Claude Desktop. The host reads the launch command from the bundle's own manifest, so there is no command to copy. Before opening it, check the file's SHA-256 matches the one the MCP registry declares for it, dcab570888b3f7ca9c2455cbd34efed4ad6adac6a0577caf7aca90eb79b00434; the commands to do that are on this page. If it does not match, do not open it.

- Download bundle: `https://github.com/openreadout/openreadout/releases/download/v0.4.0/openreadout-mcp-x86_64-unknown-linux-musl.mcpb`
- SHA-256: `dcab570888b3f7ca9c2455cbd34efed4ad6adac6a0577caf7aca90eb79b00434`

### Verify on macOS / Linux

```bash
echo "dcab570888b3f7ca9c2455cbd34efed4ad6adac6a0577caf7aca90eb79b00434  openreadout-mcp-x86_64-unknown-linux-musl.mcpb" | shasum -a 256 -c
```

### Verify on Windows (PowerShell)

```powershell
(Get-FileHash -Algorithm SHA256 .\openreadout-mcp-x86_64-unknown-linux-musl.mcpb).Hash -eq "dcab570888b3f7ca9c2455cbd34efed4ad6adac6a0577caf7aca90eb79b00434"
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-10-18 (score 50, −1)

- [functional regression] Schema quality: 451 → 534

### 2026-10-13 (score 51, 0)

- [security] Stability: Stability not yet verified: two runs of the same published version returned different tool surfaces, so we cannot tell a change in the package from a difference in our own sandbox run.
- [functional regression] Schema quality: 7826 → 14912
- [functional] Schema quality: excellent → good

### 2026-10-03 (score 51)

First indexed and scored.

## MCP tools (28)

### `openreadout_assay` (~1217 tokens)

Plate-reader exports, with the layout the file stores or `layout`. analysis: wells (per-well values, blank subtraction, replicate mean/SD/CV, outliers), curve (standard curve, back-calculated concentrations, LLOQ/ULOQ), dose-response (IC50/EC50 per compound with CI and Hill slope), kinetics (Vmax, lag, AUC per well), growth (growth rate, doubling time, lag, logistic fit, and whether each well grew, crashed or regrew, with times), qc (Z′, S/B, S/N, SSMD). An argument that names analyses applies to those only.

Input parameters:

- `analysis` (string, required): What to compute. `wells` = Per-well and per-replicate-group values: roles, blank subtraction, mean, SD, CV %, outliers; `curve` = Standard curve (linear, 4PL, 5PL) and back-calculated concentrations…
- `blank_wells` (string): Wells to mark as blanks (`H1,H2`, `H1:H12`).
- `confidence` (number): curve, dose-response: confidence level of intervals. Default 0.95.
- `fields` (array): Rows show their main fields to 4 significant digits (growth: pattern, growth_rate_per_h, doubling_time_h, lag_time_s, max_value, time_to_max_s, crash_s, trough_s, regrowth_s). fields adds others, e.g…
- `file` (string, required): Path to the file or data-set directory.
- `fit_on` (string): curve: fit every standard replicate or the level means. Default `replicates`. `replicates` = Every standard well (replicates as separate points); `means` = The mean of each standard level.
- `growth_threshold` (number): growth: values at or below this are left out of the log-scale fit. Default 5 % of each well's maximum.
- `layout` (string): Plate-layout file: CSV/TSV, a plate-map grid (blocks whose corner cell names the field: role, sample, compound, concentration, dilution) or a long table with a `well` column.
- `lloq` (number): curve: lower limit of quantification (overrides the recovery rule).
- `model` (string): curve, dose-response: the model. Default `4pl`. `linear` = y = slope · x + intercept; `4pl` = Four-parameter logistic: y = d + (a − d) / (1 + (x/c)^b); `5pl` = Five-parameter logistic: y = d + (a − d…
- `negative_wells` (string): Wells to mark as negative controls (no effect / vehicle).
- `normalize` (string): wells, dose-response, qc: percent effect from the controls. Default `none`. `none` = the (blank-subtracted) signal; `controls` = percent effect: 0 % = the negative control (vehicle) mean, 100 % = the…
- `plate_options`: Rarely needed plate options.
- `plot` (boolean): curve, dose-response: also return a PNG of the points and the fitted curve.
- `positive_wells` (string): Wells to mark as positive controls (full effect / maximum signal).
- `reduce` (string): wells, curve, dose-response, qc on a kinetic read: how each well's time course becomes one value. `first` = first time point; `last` = last time point; `max` = largest value; `min` = smallest value;…
- `standards` (string): curve: standards as `WELLS=CONCENTRATION` items separated by `;` (`A1,A2=100;B1:B2=50`). Default: the layout's.
- `strict` (boolean): Refuse values the file's assurance does not validate (exit_code 6). Default: the server's.
- `uloq` (number): curve: upper limit of quantification (overrides the recovery rule).
- `weighting` (string): curve, dose-response: fit weighting. Default `none`. `none` = Every point weight 1 (ordinary least squares); `1/y` = w = 1/|y|; `1/y2` = w = 1/y²; `1/x` = w = 1/x (x > 0); `1/x2` = w = 1/x² (x > 0).
- `wells` (string): Only these wells (`A1:H6`); the layout's blanks and controls are still used.
- `window` (integer): Points per sliding window (reduce=max-slope, kinetics, growth). Default: 5 or a tenth of the time points, whichever is larger.

Output parameters:

- `analysis` (string): The analysis run (`wells`, `curve`, `dose-response`, `kinetics`, `growth`, `qc`).
- `blank`: Blank subtraction applied.
- `compounds` (array): One row per compound (`dose-response`).
- `curve`: Standard-curve fit report (`curve`).
- `format` (string): Format id of the input (`plate`, or `long-csv`).
- `growth` (array): One row per well (`growth`).
- `growth_summary`: Wells by growth pattern, with the range of crash and regrowth times (`growth`).
- `kinetics` (array): One row per well (`kinetics`).
- `layout`: Where the layout came from and what it assigns.
- `notes` (array): What was assumed or left out.
- `outliers`: Outlier rule and flagged wells.
- `path` (string): The input file.
- `plate` (string|null): Plate (table) name.
- `quality`: Assay quality from control wells (whenever positive and negative controls exist).
- `read`: The read analysed.
- `reduce` (string|null): How kinetic time courses were reduced to one value per well (endpoint analyses).
- `samples` (array): One row per replicate group (sample, standard level, control, dose).
- `table` (integer): Table (plate) index.
- `warnings` (array): What may be wrong with the layout: role names read as samples, controls of unknown sign, role-map entries that matched no well.
- `wells` (array): One row per well.
- `written` (array): Files written (`--csv`, `--plot`).

### `openreadout_batch` (~1138 tokens)

One measure over many files as one tidy table, optionally joined to sample sheets or plate maps (the join key is chosen from the data and reported in joins[] with unmatched rows) and summarized by group (by; test against a control). Analyses (peaks, chromatogram, nmr-peaks, ephys-features, spikes, qpcr, gate, assay) take the arguments of their tools as options. Inputs (paths): files, directories, globs or an index query. Returns at most limit rows (page with offset; output writes them all to a file); a failing file is a row with error. openreadout_summarize regroups a table written by an earlier output.

Input parameters:

- `by` (array): Summarize by these columns (e.g. `["condition"]`): n, mean, sd, sem, median, min, max, cv_percent per group; channels/parameters/populations stay apart automatically.
- `control` (string): The control group.
- `exact_by` (boolean): Group by exactly `by` (do not add the measurement columns that vary).
- `fields` (array): Columns to keep (info: index field names, or `["all"]`).
- `formats` (array): Only these format ids (e.g. `["fcs"]`).
- `from_index` (string): Also take the data sets an index query selects: the index directory …
- `keys` (array): Fixed join keys `SHEET_COLUMN=FIELD` (path, file, stem, sample_id, sample_name, barcode, well, position, run_order, column:NAME).
- `limit` (integer): Rows to return (default 20, max 500; 0 with `output`: the rows are in the file).
- `measure` (string, required): What to measure per data set. `stats` = pixel statistics per image × channel (per=well for screening plates); `trace` = statistics per trace × sweep × channel; `table` = FCS: events, median, mean, sd…
- `offset` (integer): First row returned.
- `options` (object): The measure's options. Analyses: the arguments of that analysis's tool (openreadout_peaks, openreadout_nmr_peaks, openreadout_assay with its `analysis`, ...), plus `rows` (which record list becomes r…
- `output` (string): Write the full table (or the summary, with `by`) to this .csv/.tsv/.jsonl/.json/.parquet file (verified; never overwrites without `overwrite`).
- `overwrite` (boolean): Replace an existing output file.
- `paths` (array): Files, directories or glob patterns.
- `query` (string): … and the query (search syntax, e.g. "format=fcs channel~CD4").
- `recursive` (boolean): Walk sub-directories.
- `replicate` (string): Average rows within each replicate first.
- `sample_sheets` (array): Sample sheets (CSV/TSV/XLSX) or plate layouts (plate-map grids) to join; the key is chosen from the data (file name, path, sample id recorded in the file, well, barcode, vial, run order) and reported…
- `test` (string): `welch` or `mann-whitney` against `control` (a value of the first `by` column).
- `values` (array): Value columns to summarize (default: the measure's main values).
- `where` (array): Row filters `COLUMN=VALUE` / `COLUMN!=VALUE` (e.g. "parameter=FITC-A").
- `worksheet` (string): Worksheet of an XLSX sheet.

Output parameters:

- `columns` (array): Columns of `rows`, with type, unit and role (`id`, `key`, `metadata`, `annotation`, `value`, `error`).
- `grain` (array): Columns that identify a row within its data set.
- `inputs`: How the inputs became data sets.
- `joins` (array): Sample sheets and layouts joined, in order.
- `measure` (string): Measure (`stats`, `trace`, `table`, `gate`, `info`, …).
- `offset` (integer): Index of the first row in `rows`.
- `output`: The file the full table was written to (`-o`).
- `returned_rows` (integer): Rows returned here.
- `rows` (array): Rows as arrays in column order.
- `summary`: The group summary (`--by`).
- `total_rows` (integer): Rows in the whole table.
- `truncated` (boolean): True when the table has rows after the last one returned (page with `offset`, or read the full table from `output`).
- `warnings` (array): Things to check: skipped inputs, grouping, join results.

### `openreadout_check` (~133 tokens)

Integrity check: ok plus findings (severity, code, message) for truncation, missing planes or parts, bad blocks; a plate folder reports missing files per well; a file still being written reports acquisition_in_progress.

Input parameters:

- `file` (string, required): Path to the file or data-set directory.
- `headers_only` (boolean): Check headers and structure only (offsets, declared sizes and counts, missing parts): no decompression, decoding or checksums over the data.
- `strict` (boolean): Refuse values the file's assurance does not validate (exit_code 6). Default: the server's.

Output parameters:

- `acquisition`: Present when the file is not finished: still being written (`in_progress`: findings about the unfinished tail are warnings and `ok` covers the complete part) or stopped before the end (`interrupted`)…
- `assurance`: Whether the file lies inside what its reader has been validated on (the same block as `info` → `assurance`). `ok` says the file is intact; `assurance` says whether its values can be trusted. Filled b…
- `checks_performed` (array): What was verified, in plain words, so the caller knows what "ok" covers.
- `findings` (array): Everything found, in the order checked.
- `format` (string): Format id of the input file.
- `ok` (boolean): True when no finding has severity `error`.
- `path` (string): The input file.

### `openreadout_chromatogram` (~637 tokens)

Chromatograms from mass spectra and detector signals: TIC, BPC, extracted-ion (mz with ppm or da), SRM/MRM transitions, stored chromatograms and UV/DAD/FID/TCD traces (traces). Per chromatogram: apex time and intensity, integral, and thinned arrays. Answers 'when does m/z X elute'.

Input parameters:

- `aggregate` (string): `sum` (default) or `max` of the points inside an XIC window.
- `bpc` (boolean): Base-peak chromatogram.
- `channel` (integer): Channel of the traces (e.g. one DAD wavelength). Default: the first signal channel.
- `da` (number): XIC tolerance in m/z units instead of ppm.
- `file` (string, required): Path to the file or data-set directory.
- `max_points` (integer): Points returned per chromatogram (the most intense point of each of N equal slices). Default 500, max 20000; the summary (apex, integral) always covers every point.
- `ms_level` (integer): MS level of the scans. Default 1 (2 with `precursor`).
- `mz` (array): Extracted-ion chromatograms at these m/z values (one streaming pass for all).
- `mz_range` (array): TIC/BPC over this m/z range only, `[low, high]`.
- `polarity` (string): `positive` or `negative`: only scans of this polarity.
- `ppm` (number): XIC tolerance (half-width) in ppm. Default 10.
- `precursor` (number): Only MS/MS scans of this precursor m/z (product-ion XIC).
- `precursor_tol` (number): Precursor tolerance, m/z units. Default 0.5.
- `profile` (boolean): Use profile data where scans store both profile and centroids. Default false (the instrument's centroids).
- `rt_range` (array): Retention-time range `[start, end]`, minutes.
- `run` (integer): Spectra run. Default 0.
- `scan_filter` (string): Only scans whose scan filter/description contains this text (case-insensitive).
- `strict` (boolean): Refuse values the file's assurance does not validate (exit_code 6). Default: the server's.
- `sweep` (integer): Sweep of the traces (one spectrum of a map or series, one injection). Default 0.
- `tic` (boolean): Total-ion chromatogram (the default for mass-spectrometry files when nothing else is chosen).
- `traces` (array): Stored chromatograms or detector signals (UV/DAD, FID, TCD, stored TIC/SRM): trace indices from openreadout_info → traces[].
- `transition_tol` (number): Q1/Q3 tolerance of transitions, m/z units. Default 0.5.
- `transitions` (array): SRM/MRM transitions as `"Q1>Q3"` strings, e.g. `"279.2>179.2"`.

Output parameters:

- `chromatograms` (array): One entry per requested chromatogram.
- `format` (string): Format id of the input file.
- `notes` (array): Anything the caller should know.
- `output` (string|null): File written (`-o`), when any.
- `path` (string): The input file.
- `run` (integer|null): Spectra run used, when any chromatogram was computed from spectra.
- `spectra_read` (integer): Spectra decoded.

### `openreadout_compare` (~285 tokens)

Compare two files, e.g. a raw file and its export: metadata differences, geometry, channel names, physical sizes, and per-plane hashes or the largest difference within tolerance. identical says whether they hold the same data.

Input parameters:

- `against` (string, required): The second file (e.g. an OME-TIFF export of `file`).
- `file` (string, required): The first file (e.g. the raw file).
- `ignore` (array): JSON pointers (into openreadout_info output) to leave out of the metadata diff; `*` matches one segment.
- `image` (integer): Only this image index (in both files).
- `level` (integer): Pyramid level (0 = full resolution, the default).
- `no_pixels` (boolean): Metadata and geometry only, no pixels.
- `select` (array): Plane selection strings such as `c=0`, `z=2-5`, `t=0,3`. A second file holding only the selected planes (an export with the same selection) is matched to them in order.
- `strict` (boolean): Refuse values the file's assurance does not validate (exit_code 6). Default: the server's.
- `tolerance` (number): Largest absolute sample difference that still counts as equal. Default: bit-identical planes (same xxh3-128).

Output parameters:

- `identical` (boolean): Nothing compared differs: metadata (unless skipped), geometry, channel names, physical sizes and planes (within the tolerance). The exit code is 0 when true, 1 when false.
- `images` (array): Geometry, channel-name and physical-size comparison per image index.
- `metadata`: The normalized-metadata diff.
- `notes` (array): Caveats (e.g. formats that store different metadata for the same acquisition).
- `ours`: The first file.
- `planes`: The plane-by-plane comparison.
- `theirs`: The second file.

### `openreadout_ephys_features` (~259 tokens)

Patch-clamp features: action potentials per sweep, rheobase, f-I slope, input resistance, membrane time constant, capacitance, sag; in voltage clamp, holding current and access resistance.

Input parameters:

- `channel` (integer): Channel (default: the first voltage channel, else the first current channel).
- `dvdt_threshold` (number): dV/dt onset criterion, V/s (default 10).
- `file` (string, required): Path to the file or data-set directory.
- `max_spikes` (integer): Per-spike rows returned (default 25, the first spikes in sweep order; counts stay complete).
- `min_rise_mv` (number): A spike's peak must rise this far above the lowest voltage since the previous spike, mV (default 15; 0 counts every crossing, as eFEL does).
- `peak_threshold_mv` (number): Spike voltage threshold, mV (default −20).
- `strict` (boolean): Refuse values the file's assurance does not validate (exit_code 6). Default: the server's.
- `sweeps` (array): Sweeps to analyse (default all).
- `trace` (integer): Trace index (default 0).

Output parameters:

- `cell`: Per-cell features.
- `channel`: Channel analysed.
- `clamp_mode` (string): `current_clamp`, `voltage_clamp` or `unknown` (from the channel and command units).
- `format` (string): Format id.
- `notes` (array): Remarks.
- `path` (string): Input path.
- `sample_rate_hz` (number|null): Sampling rate, Hz.
- `settings`: Spike detection settings.
- `spike_count_total` (integer): Total spikes detected.
- `spikes` (array): One row per spike (at most `max_spikes`).
- `spikes_truncated` (boolean): True when `spikes` was cut at `max_spikes`.
- `stimulus`: Stimulus from the protocol, when there is one.
- `sweeps` (array): One row per sweep.
- `trace` (integer): Trace analysed.

### `openreadout_export` (~1307 tokens)

Convert to an open format, or save a figure, as a new file read back and verified; the source is never touched. format: ome-tiff (images, default; pyramidal when the source is), ome-zarr (multiscale; plates as OME-NGFF HCS), mzml (mass spectra, default), csv (one table or one sweep of a trace, default for tables and traces), parquet or arrow (tables, traces with every sweep, spectra=true for MS points), nwb (electrophysiology), jcamp (NMR, IR/Raman, chromatograms), asm (plate readers), rdml (qPCR), nifti (volumes: CT, MRI). Figures: plot or preview = the arguments of that call, output .png, .jpg, .tiff, .svg or .pdf (scale, dpi for print); the picture comes back too. Sends progress with a progressToken.

Input parameters:

- `centroid` (boolean): mzML, Parquet, Arrow: write the instrument's centroid lists instead of profiles where a scan has both.
- `dpi` (integer): Figures: print resolution (e.g. 300), recorded in .png, .jpg and .tiff files; .svg and .pdf pages get the size the raster would print at.
- `file` (string): Path to the file (not with plot or preview).
- `format` (string): `ome-tiff` (one BigTIFF file; the default for images), `ome-zarr` (OME-NGFF 0.5 / Zarr v3 directory with a pyramid), `mzml` (indexed mzML 1.1.0; the default for mass spectra), `csv` (one table, or on…
- `group_frames` (integer): MRC: sum every N time points into one section (dose fractions of a movie).
- `image` (integer): Images: only this image index.
- `labels` (boolean): CSV: add a second header line with column labels (FCS `$PnS`).
- `level` (integer): Images: export this source pyramid level as the full resolution (default 0).
- `output` (string): Output path; defaults to the input with `.ome.tiff`, `.ome.zarr`, `.mzML`, `.csv`, `.asm.json`, `.rdml`, `.fastq`, `.parquet`, `.arrow`, `.nwb`, `.jdx`, `.nii.gz` or `.mrc`. Its extension sets the fo…
- `overwrite` (boolean): Replace an existing output file or directory.
- `plot` (object): Save a figure: the arguments of an openreadout_plot call. `output` names the file.
- `preview` (object): Save a picture: the arguments of an openreadout_preview call (file, region, annotations, marks, dark, …); max_size up to 8192. Images are saved with a scale bar and no rulers (axes scale-bar; add tit…
- `region`: Images: export only this rectangle `{x, y, width, height}` (pixels of `level`) of every plane, read tile by tile (cut a field out of a whole-slide image).
- `rows` (string): CSV, Parquet, Arrow, NWB, JCAMP-DX: rows (samples of each sweep for traces) `A-B`, `A-` or `A`, zero-based and inclusive.
- `run` (integer): mzML, Parquet, Arrow: spectra run index (default 0).
- `scale` (number): Figures: pixels per figure pixel in .png, .jpg and .tiff files (default 2, up to 8); image previews are read again at max_size × scale.
- `select` (array): Images: plane selection strings such as `c=0`, `z=2-5`, `t=0,3`.
- `spectra` (boolean): Parquet, Arrow: export the mass spectra of `run` (one row per point, plus a `<name>.scans.parquet` per-scan summary) instead of a table or trace.
- `strict` (boolean): Refuse values the file's assurance does not validate (exit_code 6). Default: the server's.
- `sweep` (integer): CSV, Parquet, Arrow, NWB, JCAMP-DX: only this sweep (CSV default 0; the others: every sweep).
- `table` (integer): CSV, Parquet, Arrow: this table index (FCS data set, plate read, event or peak table).
- `trace` (integer): CSV, Parquet, Arrow, NWB, JCAMP-DX: this trace index (NWB default: every trace).
- `wells` (array): OME-Zarr of a multi-well plate: only the fields of these wells (`C05`).

### `openreadout_extract` (~160 tokens)

Write one attachment a file embeds (a slide label or thumbnail, a preview image, time stamps) to a new file as stored, verified. openreadout_info view=structure lists them.

Input parameters:

- `attachment` (string, required): The attachment: a name as openreadout_info view=structure lists it (a CZI's `Thumbnail`, `Label` or `SlidePreview` image, `TimeStamps`), or `#<index>`.
- `file` (string, required): Absolute or working-directory-relative path to the file that holds the attachment.
- `output` (string): Output path. Default: `<input stem>.<attachment name>.<ext>` next to the input.
- `overwrite` (boolean): Replace an existing output file.

Output parameters:

- `attachment`: The attachment that was extracted.
- `bytes_written` (integer): Number of bytes written.
- `format` (string): Format id of the input file.
- `output` (string): Where the bytes were written.
- `path` (string): The input file.
- `verified` (boolean): True once the output was read back and matched.
- `xxh3` (string): xxh3-128 of the written bytes, 32 hex chars.

### `openreadout_gate` (~291 tokens)

Flow-cytometry gating from a FlowJo workspace (workspace) or Gating-ML 2.0 file (gatingml): the event count, percentage and medians of every population of the FCS file. Without workspace or gatingml, file is the gating file and the answer describes its samples and gate tree.

Input parameters:

- `file` (string, required): Path to the file or data-set directory.
- `gatingml` (string): Gating-ML 2.0 document (instead of workspace).
- `medians` (array): Parameters whose median over each population's events is reported under populations[].medians (`$PnN` or `$PnS`; `Comp-NAME` for compensated values), or `["all"]`: every parameter a gate uses, compen…
- `populations` (array): Report only these populations (paths or unique names) and their descendants.
- `sample` (string): Workspace sample name or id (default: matched by file name, then $FIL, then the only one).
- `strict` (boolean): Refuse values the file's assurance does not validate (exit_code 6). Default: the server's.
- `table` (integer): FCS data set index. Default 0.
- `workspace` (string): FlowJo workspace (.wsp); `file` is then the FCS file to count events in.

Output parameters:

- `compensation` (array): Compensation matrices the gating file defines (and whether any gate used them).
- `event_count` (integer|null): Events in the data set.
- `gating_file` (string): The gating file (FlowJo workspace or Gating-ML document).
- `gating_format` (string): `flowjo-wsp` or `gating-ml`.
- `notes` (array): Caveats: skipped populations, disagreements with counts stored in the workspace, scaling.
- `path` (string|null): The FCS file gated; absent when only the gating file was described.
- `populations` (array): One row per population, parents before children.
- `sample`: The workspace sample whose gates were used (FlowJo only).
- `table` (integer|null): FCS data set (table) gated.
- `transforms` (array): Transforms by id (FlowJo: by parameter name).
- `tree` (array): The same populations as a tree (quadrant gates appear as grouping nodes without a count).
- `workspace`: Workspace-level facts (FlowJo only).

### `openreadout_health` (~123 tokens)

Storage health of a share indexed by openreadout_index: truncated or corrupt files, unreadable formats, duplicates (confirmed by content hash unless no_hash), the same experiment stored twice, files at risk, totals and personal-data findings.

Input parameters:

- `index_dir` (string, required): Index directory (from openreadout_index or `openreadout index`).
- `max_list` (integer): Most entries listed per section (default 50; counts are complete).
- `no_hash` (boolean): Do not confirm duplicate candidates by hashing their content (no file is read).

Output parameters:

- `at_risk`: Vendor-only formats with no open export.
- `by_family` (array): Per family.
- `by_format` (array): Data sets and bytes per format.
- `by_year` (array): Per acquisition year.
- `duplicates`: Byte-identical copies.
- `generated_at` (string): When this report was made.
- `index_complete` (boolean): Whether the index covers every root to the end.
- `index_dir` (string): The index directory.
- `index_updated_at` (string): When the index was last written.
- `integrity`: Truncated and corrupt data sets.
- `near_duplicates`: The same experiment stored more than once.
- `pii`: Personal data.
- `roots` (array): The roots of the index.
- `totals`: Totals.
- `unreadable`: Unreadable formats and unrecognised files.

### `openreadout_index` (~336 tokens)

Catalog every data set under roots into index_dir (Parquet: one row per data set with format, size, sample, instrument, technique, method, operator, start, dimensions, channels, objective, events, scans, integrity status, personal-data flags). Headers only and resumable: a call stops after max_files/max_seconds with complete=false, and the same call again continues. openreadout_search queries the result. For one folder of files, openreadout_batch with measure info lists what each file is in one call.

Input parameters:

- `check` (string): Integrity check per data set: `headers` (default; structure only), `full` or `none`.
- `exclude` (array): Glob patterns of names or root-relative paths to skip.
- `follow_symlinks` (boolean): Crawl directories behind symbolic links too (links to files are always read).
- `full_rescan` (boolean): Read every file again instead of reusing unchanged records.
- `index_dir` (string, required): Index directory to create or update (never inside a root).
- `max_files` (integer): Stop after this many files in this call (default 20000); call again to continue.
- `max_seconds` (number): Stop after this many seconds in this call (default 45); call again to continue.
- `pii` (boolean): Look for personal data (default true).
- `restart` (boolean): Discard an interrupted crawl instead of resuming it.
- `roots` (array, required): Directories (or files) to crawl.
- `threads` (integer): Worker threads (default: the number of CPUs).

Output parameters:

- `bytes` (integer): Bytes of every file seen.
- `changes` (object): Data sets per change (`new`, `changed`, `unchanged`, `moved`) and `removed`.
- `check_status` (object): Data sets per check status.
- `complete` (boolean): True when the crawl walked every root to the end. False after a cap (`--max-files`, `--max-seconds`) or an interruption: the tables then hold what was read so far plus the previous run's records for…
- `crawl`: Crawl counters, cumulative over resumed sessions.
- `datasets` (integer): Data sets (rows of `experiments.parquet`) after multi-file grouping.
- `families` (object): Data sets and bytes per family.
- `files` (integer): Rows of `files.parquet`.
- `files_per_s` (number|null): Items per second over the crawl's wall time.
- `formats` (object): Data sets and bytes per format id.
- `index_dir` (string): Absolute path of the index directory.
- `next` (string|null): What to do next, when the crawl is not complete.
- `pii`: Personal-data totals.
- `problems` (object): Problems per category (`integrity`, `readability`, `walk`, `pii`).
- `roots` (array): The directories (or files) crawled, absolute.
- `schema_version` (string): [`INDEX_SCHEMA_VERSION`].
- `settings`: Options of the crawl.
- `started_at` (string): When this run started (ISO-8601 UTC).
- `tables` (object): The tables.
- `tool`: The tool and version that wrote it.
- `unknown_extensions` (object): Files no reader recognises, per lower-case extension (`(none)` for no extension).
- `updated_at` (string): When the tables were written.
- `years` (object): Data sets per acquisition year (`unknown` when the file records no date).

### `openreadout_info` (~572 tokens)

What an instrument file or data-set directory holds, from its headers (fast on huge files): format, images[] (sizes, pixel type, µm/px, channels and dyes, objective), tables[], traces[], spectra[] (MS runs), plate, experiment (sample, instrument, method, operator, start) and assurance. view=summary attaches a ~384 px thumbnail of image 0 with full-resolution pixel rulers. ask answers a question in words, naming the fields it used.

Input parameters:

- `ask` (string): A question in plain words ("what was the gradient?", "which channel is DAPI?", "how many MS/MS scans?"): answered under answers[] with the fields each came from. Implies view=explain.
- `file` (string, required): Path to the file or data-set directory.
- `first_entry` (integer): view=structure with kind: skip this many elements of that kind first (paging).
- `kind` (string): view=structure: list only elements of this kind (as entries_total names them), e.g. "attachment" or "subblock".
- `max_entries` (integer): view=structure: list at most this many elements of each kind (0 = all). Default 50.
- `max_frames` (integer): view=full: per-frame records per image under images[].extra.frames. Default 100; 0 omits them; -1 embeds all.
- `max_images` (integer): List at most this many images (0 = all). Default: all, except screening plates (16; their field images are all alike and plate.wells[].images indexes every field).
- `strict` (boolean): Refuse values the file's assurance does not validate (exit_code 6). Default: the server's.
- `thumbnail` (boolean): view=summary: attach a small picture of image 0 (~384 px, with full-resolution pixel rulers) as image content. Default true; skipped (with a note) when it would decode too much.
- `vendor` (boolean): view=full: include the vendor's raw metadata tree (can be megabytes). Default false.
- `view` (string): What to return. `summary` = the header summary (default); `full` = the summary with per-frame records (time stamps, stage positions, exposure) and per-field provenance; vendor=true adds the vendor's…

### `openreadout_link` (~182 tokens)

Groups files that measured the same sample across instruments and formats (sample id, barcode, plate well + plate, a conversion naming its source, the same acquisition or the same spectra), from headers; every link has its evidence and a confidence (high/medium/low; links below min_confidence are listed in weak_links).

Input parameters:

- `formats` (array): Only these format ids.
- `from_index` (string): Also take the data sets an index query selects: the index directory …
- `min_confidence` (string): `low`, `medium` (default) or `high`: weaker links are listed in weak_links, not grouped.
- `no_recursive` (boolean): Only the top level of directories.
- `paths` (array): Directories (walked recursively), files or glob patterns.
- `query` (string): … and the query.

Output parameters:

- `groups` (array): Groups of two or more data sets.
- `inputs`: How the inputs became data sets.
- `min_confidence`: Minimum confidence of links that form groups.
- `notes` (array): Things to know.
- `shared_identifiers` (array): Identifiers treated as weak evidence.
- `unlinked` (integer): Data sets in no group.
- `unlinked_examples` (array): Some of them.
- `weak_links` (array): Links below `min_confidence` (not grouped), strongest first (first 50).

### `openreadout_nmr_peaks` (~541 tokens)

NMR peak list (ppm, height, width, S/N) and integrals of given regions or of every multiplet (auto_integrate), from the vendor's processed spectrum or a spectrum processed from the FID (from=fid: group delay, apodization, zero filling, FT, phase, baseline).

Input parameters:

- `auto_integrate` (boolean): Without integrate: integrate every multiplet (peaks closer than 15 Hz, ±10 Hz).
- `baseline` (string): Baseline: `default` (order-1 polynomial), `none`, `poly:N`. Stored spectra are used as stored unless this is given.
- `file` (string, required): Path to the file or data-set directory.
- `from` (string): `auto` (default: the vendor's processed spectrum if present, else process the FID), `fid` (always process the FID), `processed` (stored spectrum only).
- `integral_reference` (array): Normalise integrals so region `[index, value]` has that value (default `[0, 1]`).
- `integrate` (array): Regions to integrate, `[[a, b], …]` in ppm.
- `lb` (number): Exponential line broadening in Hz (0 = none; default stored, else 0.3 Hz 1H / 1 Hz other).
- `max_peaks` (integer): Keep at most this many peaks (tallest; default 200).
- `min_height_fraction` (number): Minimum height as a fraction of the tallest point (default 0; e.g. 0.01).
- `min_prominence` (number): Minimum prominence in noise SDs (default 5).
- `min_snr` (number): Minimum peak height in noise SDs (default 10).
- `negative` (boolean): Also report negative peaks (DEPT/APT).
- `phase` (string): `default` (stored phases, else automatic), `stored`, `auto`, `magnitude`, `none`, or `"P0,P1"` in degrees.
- `range_ppm` (array): Only pick between two shifts, `[a, b]` ppm.
- `size` (integer): Transform size in complex points (power of two).
- `strict` (boolean): Refuse values the file's assurance does not validate (exit_code 6). Default: the server's.
- `sweep` (integer): Row of a ser/arrayed FID (default 0).
- `trace` (integer): Trace index (default: chosen by `from`).

Output parameters:

- `axis`: The chemical-shift axis of the spectrum.
- `format` (string): Format id.
- `integrals` (array): Integrals of the requested regions.
- `main_peak`: The tallest positive peak (named like `analyze peaks` → `main_peak` for chromatograms).
- `noise_sd` (number|null): Robust noise standard deviation (same units as `height`).
- `notes` (array): Remarks.
- `nucleus` (string|null): Observed nucleus, when known.
- `path` (string): The input path.
- `peak_count` (integer): Number of peaks found.
- `peak_options`: Thresholds used.
- `peaks` (array): Peaks, high shift first.
- `processing`: How the FID was processed (`source` = `fid` only).
- `source` (string): `processed` (a spectrum the vendor software stored) or `fid` (processed here).
- `sweep` (integer): Sweep (row) used.
- `trace` (integer): Trace used (see `info` → `traces[]`).
- `trace_name` (string|null): Its name.

### `openreadout_peaks` (~1037 tokens)

Detect and integrate peaks: chromatograms (detector traces, TIC, XIC, SRM) with retention time, area, height, widths, tailing, plates, resolution, S/N and area % (purity); one peak near rt; a compound list; bands and regions of IR, Raman, UV-Vis and NMR spectra and peaks of sized electropherograms in bp (x_range, integrate). Takes the openreadout_chromatogram arguments to choose the signal.

Input parameters:

- `aggregate` (string): `sum` (default) or `max` of the points inside an XIC window.
- `area_seconds` (boolean): Areas in signal × seconds instead of signal × minutes. Default false.
- `baseline` (string): Baseline under detected peaks: `auto` (default), `drop`, `valley` or `tangent`; or the baseline under `x_range` windows and manual integrations: `linear` (default: a straight line between the window'…
- `bpc` (boolean): Base-peak chromatogram.
- `channel` (integer): Channel of the traces (e.g. one DAD wavelength). Default: the first signal channel.
- `compounds` (array): Targeted compounds: `[{name, mz? | q1+q3? | trace?, rt?, window?, ppm?, polarity?, ms_level?, precursor?}]`; one result row each under `compounds`.
- `da` (number): XIC tolerance in m/z units instead of ppm.
- `file` (string, required): Path to the file or data-set directory.
- `integrate` (array): Manual integrations `[[start, end], ...]` in minutes.
- `min_height` (number): Detection threshold in signal units.
- `min_snr` (number): Detection threshold, height / noise σ. Default 3.
- `min_width` (number): Smallest width at half height, minutes.
- `ms_level` (integer): MS level of the scans. Default 1 (2 with `precursor`).
- `mz` (array): Extracted-ion chromatograms at these m/z values (one streaming pass for all).
- `mz_range` (array): TIC/BPC over this m/z range only, `[low, high]`.
- `pick` (string): `largest` (default) or `nearest` peak in the window.
- `polarity` (string): `positive` or `negative`: only scans of this polarity.
- `ppm` (number): XIC tolerance (half-width) in ppm. Default 10.
- `precursor` (number): Only MS/MS scans of this precursor m/z (product-ion XIC).
- `precursor_tol` (number): Precursor tolerance, m/z units. Default 0.5.
- `profile` (boolean): Use profile data where scans store both profile and centroids. Default false (the instrument's centroids).
- `rt` (number): Expected retention time (minutes): also report the peak there as `picked`.
- `rt_range` (array): Retention-time range `[start, end]`, minutes.
- `run` (integer): Spectra run. Default 0.
- `scan_filter` (string): Only scans whose scan filter/description contains this text (case-insensitive).
- `smooth` (integer): Savitzky–Golay window in points (below 5: none). Default automatic.
- `strict` (boolean): Refuse values the file's assurance does not validate (exit_code 6). Default: the server's.
- `summary_only` (boolean): Leave out the full peak tables (keep compounds, picked and manual results). Default false.
- `sweep` (integer): Sweep of the traces (one spectrum of a map or series, one injection). Default 0.
- `tic` (boolean): Total-ion chromatogram (the default for mass-spectrometry files when nothing else is chosen).
- `traces` (array): Stored chromatograms or detector signals (UV/DAD, FID, TCD, stored TIC/SRM): trace indices from openreadout_info → traces[].
- `transition_tol` (number): Q1/Q3 tolerance of transitions, m/z units. Default 0.5.
- `transitions` (array): SRM/MRM transitions as `"Q1>Q3"` strings, e.g. `"279.2>179.2"`.
- `window` (number): Half-width of the `rt` window (and of compounds without one), minutes. Default 0.5.
- `x_range` (array): Axis windows `[[a, b], ...]` to integrate, in the axis's own units (either order): on a spectrum (IR/Raman cm⁻¹, UV nm, NMR ppm) each is a region under `spectra[].regions` (area with the `baseline`,…

Output parameters:

- `chromatograms` (array): One entry per analysed chromatogram.
- `compounds` (array): One row per compound of the compound list.
- `format` (string): Format id of the input file.
- `notes` (array): Anything the caller should know.
- `outputs` (array): Files written (`-o`, `--plot`).
- `path` (string): The input file.
- `spectra` (array): Spectra (traces whose axis is not time: wavenumber, wavelength, ppm, …): bands and integrated regions, one entry per analysed spectrum.

### `openreadout_plot` (~638 tokens)

A finished figure from lab files in one call, as image content plus what was drawn (series, data read, ranges, units, marked peaks). Name data by file and selector, never by pasting numbers: traces and sweeps, chromatograms (TIC, XIC) and the spectrum at an rt or the TIC apex, plate wells by range or layout group (curves per well, or mean ± spread per group), FCS dot plots coloured by gate population and histograms, f–I curves, dose-response and standard-curve fits, a table file's columns (openreadout_batch output); small inline values are allowed. Several files overlay; facet=series gives small multiples, facet=plate plate positions; panels side by side; annotate with bands, lines, labelled points, arrows. Draws only; openreadout_export saves the figure.

Input parameters:

- `annotate` (array): Bands, lines, labelled points, arrows, boxes and notes, in the units the axes show: the same annotations as openreadout_preview (`facet` picks one small plot).
- `caption` (string): Small print under the figure (a source credit, a method note).
- `column_labels` (array): Column headings of a plate facet (e.g. doses), left to right.
- `columns` (integer): Panels (or facets of a single panel) per row. Default: all panels in one row; facets in a near-square grid.
- `data`: What to draw: one series spec or a list of them, drawn in order (first at the back).
- `facet`: Small multiples: `series` = one small plot per series (sweeps, files, groups, wells); `plate` = plate wells in their plate positions.
- `file`: The file of every series here that names no file, table or values. Alone, without `data`, it draws the file's default view.
- `height` (integer): Height in px (default from the content, at most 3000).
- `legend`: How series are named: `direct` labels at the line ends, a `key` row, or `none`. Default direct when it fits, else key.
- `panels` (array): Several panels, side by side (see columns); instead of a top-level `data`.
- `row_labels` (array): Row headings of a plate facet, top to bottom. Default: the layout group of each block of rows, else the row letters.
- `share`: Panels that share an axis range. Default none.
- `stack` (number): Offset each series upward by this fraction of the tallest one (stacked spectra).
- `strict` (boolean): true: refuse values this file's assurance does not validate (exit_code 6, with a hint).
- `theme`: Colour scheme. Default light.
- `title` (string): Title over the figure.
- `width` (integer): Width in px (default 1200, at most 3000).
- `x`: The x axis.
- `y`: The y axis.

Output parameters:

- `files` (array): Files the data came from.
- `height` (integer): Picture size in px.
- `inline_series` (integer): Series drawn from inline values (numbers the caller supplied, not read from a file).
- `notes` (array): What was done to the data (subtractions, fits, transforms).
- `panels` (array): One entry per panel.
- `save` (string|null): How to save this figure to a file (MCP: the openreadout_export call).
- `theme` (string): `light` or `dark`.
- `title` (string|null): Figure title.
- `warnings` (array): Data that could not be drawn as asked, or values to double-check.
- `width` (integer): Picture size in px.

### `openreadout_preview` (~1693 tokens)

A picture of the data as image content plus what was drawn: an image plane (default channel 0, middle z), a composite, a max projection (mip=z), a region (only the tiles needed are read), a trace or spectrum plot (largest peaks labelled; marks=spikes marks action potentials; x_range zooms), a Sanger chromatogram with base calls and quality or a sized electropherogram with the ladder, a plate heat map or, for kinetic reads, per-well growth curves coloured by layout group, or a flow-cytometry density plot. Image pictures carry rulers in full-resolution pixels and a µm scale bar, so a region read off the rulers zooms in. annotations draw your own labelled points, boxes, outlines, arrows, lines and bands in the picture's coordinates, to show the user what you found. Draws only; openreadout_export saves the picture.

Input parameters:

- `annotations` (array): Your own marks, drawn on top and reported back with their pixel positions. Coordinates as the picture shows them: full-resolution pixels on images (the ruler numbers), axis units on plots, wells on p…
- `axes` (string): Image previews: what frames the picture. `rulers` = coordinate rulers in full-resolution pixels and a scale bar around the picture (default); `grid` = rulers, plus faint grid lines over the data at t…
- `caption` (string): Image previews with axes scale-bar: a caption under the picture (what it shows, the stain, the sample).
- `centroid` (boolean): Spectrum preview: the instrument's centroid list instead of the profile.
- `channels` (array): Trace preview: channel indices (default: the first 8).
- `columns` (array): Table columns: a plate's value column, or the x and y parameters of a flow-cytometry density plot (one gives a histogram; default FSC-A, SSC-A).
- `composite` (boolean): Blend all (or the selected) channels additively in their colours.
- `contrast` (string): `auto` (default; the file's display window when it has one, `log:90,99.95` on diffraction images), `min-max`, `percentile:LO,HI` (e.g. `percentile:1,99`), `log` (`log:50,99.9`) or `log:LO,HI`, `raw`,…
- `dark` (boolean): Draw in the dark theme.
- `fft` (boolean): Images: a power-spectrum (FFT) inset in the top-right corner: Thon rings of a cryo-EM micrograph, the spots of a lattice.
- `file` (string, required): Path to the file.
- `format` (string): Encoding. Default png (sent as JPEG when a PNG would be too large); svg also returns the vector drawing as text. `png` = lossless (default); `jpeg` = lossy and smaller; `svg` = vector: text stays tex…
- `image` (integer): Image index (default 0).
- `lanes`: Gels and blots: how lanes are found for `marks: lanes` (as `openreadout_stats` lanes).
- `level` (integer): Pyramid level to read (default: the level nearest max_size, or the level at which `region` renders at about max_size).
- `lut` (string): Colour lookup. Default: gray for one channel (inverted on diffraction images), channel colours for composites. `gray` = black to white; `channel-color` = black to the channel's colour; `inverted` = w…
- `marks` (string): Marks from the data. Default auto: the prominent peaks of spectra and chromatograms are labelled; diffraction images get resolution rings. `auto` = label the largest peaks of spectra and chromatogram…
- `max_size` (integer): Longest side in pixels, rulers included (MCP: default 768, at most 2048).
- `mip` (string): Maximum-intensity projection, over the selected range if any. `z` = along z (focal planes); `t` = along t (time points).
- `objects`: Images: how objects are found for `marks: objects` (as `openreadout_stats` objects).
- `region`: Zoom: only this rectangle, `{x, y, width, height}` in full-resolution pixels (or in the pixels of `level` when a level is given). Whole-slide images: look at the overview first, then at regions of it.
- `run` (integer): Spectrum preview: run index.
- `scan` (integer): Spectrum preview: instrument scan number instead of an index.
- `select` (array): Plane selection such as `c=1`, `z=4`, `t=0` or combined `c=0,1,z=2`. Default: c=0, the middle z, t=0. Several channels imply a composite.
- `spectrum` (integer): Spectrum preview: zero-based spectrum index.
- `strict` (boolean): Refuse values the file's assurance does not validate (exit_code 6). Default: the server's.
- `sum` (string): Sum projection, over the selected range if any: a movie's frames added up (e.g. sum t, select t=0-39). `z` = along z (focal planes); `t` = along t (time points).
- `sweep` (integer): Trace preview: sweep index.
- `table` (integer): Plate or flow-cytometry preview: table index.
- `title` (string): Image previews with axes scale-bar: a title above the picture.
- `trace` (integer): Trace preview: trace index (see openreadout_info traces[]).
- `view` (string): Volumes: the plane to show. `axial`, `coronal`, `sagittal` (radiological orientation), `orthogonal` (all three, crossing at the middle or the selected z), `xz`, `yz`, or `native` (as stored). Default…
- `x_range` (array): Trace preview: only this window of the x axis, `[a, b]` in its units (bp of a sized electropherogram, base positions of a Sanger read, minutes, ppm, …).

Output parameters:

- `annotations` (array): The caller's annotations as drawn: each as given, plus where it landed in PNG pixels.
- `bytes` (integer): Size of the encoded image.
- `chromatogram`: Present for chromatogram previews (a mass-spectrometry run's total-ion chromatogram).
- `encoding` (string): `png`, `jpeg` or `svg`.
- `events`: Present for event previews.
- `format` (string): Format id of the input file.
- `height` (integer): Image height in pixels.
- `hint` (string|null): What to do next with the picture (look at it; zoom with a region read off the rulers).
- `image`: Present for image previews.
- `kind` (string): `image`, `trace`, `chromatogram`, `spectrum`, `plate` or `events`.
- `lanes` (object|null): `marks: lanes`: the lanes and bands found in the area shown, as `stats` lanes.
- `marks` (array): Marks drawn from the data (labelled peaks, action potentials).
- `notes` (array): Anything the caller should know (fallbacks, caps, implied options).
- `objects` (object|null): `marks: objects`: the objects counted in the area shown, as `stats` objects (the first 20 listed).
- `output` (string|null): The written file (CLI); absent when the preview is returned inline (MCP image content).
- `panels` (array): Plot panels (traces, spectra, plate curves, events): where each sits in the picture and the data range it shows.
- `path` (string): The input file.
- `plate`: Present for plate previews.
- `save` (string|null): How to save this picture to a file (MCP: the openreadout_export call).
- `spectrum`: Present for spectrum previews.
- `trace`: Present for trace previews.
- `verified` (boolean): True once a written file was read back and matched.
- `width` (integer): Image width in pixels.
- `xxh3` (string): xxh3-128 of the encoded bytes, 32 hex chars (identical across runs for the same request).

### `openreadout_qpcr` (~549 tokens)

Real-time PCR (RDML, .eds, .rex, ...): one record per well and target with sample, task, Cq and Tm; compute_cq recomputes Cq, ddcq gives 2^-ΔΔCq fold changes, standard_curve fits efficiency per target.

Input parameters:

- `baseline_end` (integer): Baseline window for `compute_cq`, last cycle.
- `baseline_start` (integer): Baseline window for `compute_cq`, first cycle.
- `compute_cq` (boolean): Also compute our own Cq.
- `control_sample` (string): ΔΔCq control (calibrator) sample; default: the file's.
- `cq_method` (string): How `compute_cq` computes Cq; default: `second-derivative` for LightCycler 480 `.ixo` files without a threshold or baseline window, else `threshold`. `threshold` = Where the baseline-corrected curve…
- `ddcq` (boolean): ΔΔCq relative quantification (rows: one per sample × target).
- `fields` (array): Rows show their main fields to 4 significant digits (records: well, sample, target, cq, tm; relative_quantities: cq means, delta_cq, delta_delta_cq, rq with rq_min and rq_max). fields adds others, e.…
- `file` (string, required): Path to the file or data-set directory.
- `max_records` (integer): At most this many records (default 500).
- `reference_targets` (array): ΔΔCq reference targets; default: the file's.
- `run` (string): Only this run.
- `sample` (string): Only this sample, case-insensitive.
- `standard_curve` (boolean): Standard curve per target (rows: one per target).
- `strict` (boolean): Refuse values the file's assurance does not validate (exit_code 6). Default: the server's.
- `target` (string): Only this target, case-insensitive.
- `threshold` (number): Threshold for `compute_cq`.
- `undetermined_cq` (number): Cq for undetermined results in means and ΔΔCq; default: left out and counted.
- `well` (string): Only this well (`A1`).

Output parameters:

- `acquisition_temperature_c` (number|null): Temperature of the step that reads fluorescence during cycling (the annealing / extension temperature of a two-step PCR), °C.
- `control_sample` (string|null): Control (calibrator) sample used or recorded.
- `cq_comparison`: Our Cq against the vendor's (with `compute_cq`).
- `cq_counts`: Cq statuses over every record that matches the filters (not cut by `max_records`).
- `cycles` (integer|null): Number of PCR cycles in the program.
- `dialect` (string): Dialect (`rdml`, `eds-sds`, `eds-7500`, `eds-json`, `rex`).
- `experiment` (string|null): Experiment or run name.
- `format` (string): Format id.
- `instrument` (string|null): Instrument model.
- `notes` (array): What to keep in mind.
- `path` (string): The input file.
- `record_count` (integer): Records matching the filters.
- `records` (array): The records.
- `reference_targets` (array): Reference targets used or recorded (endogenous controls).
- `relative_quantities` (array): ΔΔCq results (with `relative`).
- `standard_curves` (array): Standard curves (with `standard_curve`).
- `targets` (array): Per target: counts by Cq status and the mean Cq without the undetermined results.
- `truncated` (boolean): True when `max_records` cut the list.
- `undetermined_cq` (number|null): Cq used for undetermined results in the aggregates, when the request gave one.

### `openreadout_report` (~151 tokens)

A privacy-reviewed diagnostic bundle for a file that is refused, fails or is not validated, for a new-variant issue: no data values, free text only with include_text, and the issue_url to file it at. Nothing is sent; the user files it.

Input parameters:

- `file` (string, required): The file (or data-set directory) that is refused, fails or is not validated.
- `include_text` (boolean): Keep free text from the file (sample, image and channel names, comments); the path and personal data are still replaced. Default false: only with the user's consent.
- `output` (string): Also write the bundle to this new local file. Default: only return it.

Output parameters:

- `bytes` (integer|null): Size of the written bundle.
- `issue_url` (string): Where to file it (never contacted by the program).
- `output` (string|null): Where the bundle was written; `None` with `--dry-run` (or from MCP without `output`).
- `report`: The bundle, exactly as written.

### `openreadout_scans` (~398 tokens)

The scans of a mass-spectrometry run, without decoding peaks: scan number, MS level, retention time, polarity, precursor m/z and charge, isolation window, activation, collision energy, filter, stored TIC; filtered and paged, and every match counted (matched, ms_level_counts). IR, Raman, UV-Vis and NMR spectra are traces: openreadout_trace.

Input parameters:

- `activation` (string): Only this activation: HCD, CID, ETD, ... (case-insensitive).
- `charge` (integer): Only precursors of this charge state.
- `count` (boolean): Only count the matching scans (matched, ms_level_counts); list none.
- `file` (string, required): Path to the mass-spectrometry file.
- `limit` (integer): List at most this many matching scans (default 100, at most 5000); all are counted.
- `ms_level` (integer): Only scans of this MS level (1 = full scans, 2 = MS/MS).
- `offset` (integer): Skip this many matching scans (paging; default 0).
- `polarity` (string): Only `positive` or `negative` scans.
- `precursor` (number): Only MS/MS scans whose precursor m/z is within the tolerance of this.
- `precursor_ppm` (number): Precursor tolerance in ppm instead.
- `precursor_tol` (number): Precursor tolerance in m/z units (default 0.01).
- `rt_range` (array): Retention-time window `[start, end]` in minutes.
- `run` (integer): Run index for files with several runs (Sciex samples; default 0).
- `scan_filter` (string): Only scans whose filter string contains this text (case-insensitive).
- `strict` (boolean): Refuse values the file's assurance does not validate (exit_code 6). Default: the server's.

Output parameters:

- `filter`: The conditions applied (omitted when every scan is listed).
- `format` (string): Format id of the input file.
- `matched` (integer): Scans matching the conditions (all of them are counted, not only the page listed).
- `ms_level_counts` (object): Counts of the matching scans per MS level (`"1"`, `"2"`, ...).
- `offset` (integer): Position of the first listed scan among the matching ones (0-based; `--offset`).
- `path` (string): The input file.
- `returned` (integer): Number of scans listed.
- `rt_range_s` (array|null): Retention-time range of the matching scans in seconds.
- `run` (integer): Run index.
- `scan_count` (integer): Spectra in the run.
- `scans` (array): The listed scans, in spectrum-index order.
- `source` (string): `headers` when the reader listed scan headers without decoding peaks, `spectra` when every spectrum had to be decoded to list it.
- `truncated` (boolean): True when more matching scans follow the page (`offset + returned < matched`).

### `openreadout_search` (~393 tokens)

Query an index from openreadout_index: 'format=nd2 objective=60x', 'channel~CD4', 'events>100000', 'rate>=20kHz', 'acquired<2015', 'status=truncated|corrupt'. Returns {total, returned, results[]}: total counts every match, results is capped by limit (default 50); fields=['all'] returns every column.

Input parameters:

- `fields` (array): Columns to return (aliases allowed); default: path, format, size, acquired, sample, instrument model, technique, channels, objective, check status, what. `["all"]`: every column.
- `index_dir` (string, required): Index directory (from openreadout_index or `openreadout index`).
- `limit` (integer): Most results (default 50, max 1000).
- `query` (string): Query: space-separated terms, all must match; `OR` between alternatives. `field=value`, `!=`, `~` (contains), `<`/`<=`/`>`/`>=` with units (`size>1GB`, `rate>=20kHz`) or dates (`acquired<2020`), `fie…
- `sort` (string): Sort field (`size`, `-acquired` for descending). Default: path order.

Output parameters:

- `fields` (array): The columns of each result.
- `index_complete` (boolean): Whether the index covers every root to the end (see `index.json`).
- `index_dir` (string): The index directory searched.
- `query` (string): The query as given.
- `results` (array): One object per matching data set, with the requested columns.
- `returned` (integer): Results returned.
- `total` (integer): Data sets matching.
- `truncated` (boolean): True when `total` > `returned`.

### `openreadout_spectrum` (~417 tokens)

One mass spectrum, picked by retention time (rt, minutes: the scan nearest it), scan number or zero-based spectrum index: metadata, peaks[] (the most intense, with charge from the isotope spacing and neutral mass) and mz[]/intensity[].

Input parameters:

- `centroid` (boolean): The stored centroid list instead of the profile when a scan has both.
- `file` (string, required): Path to the mass-spectrometry file.
- `lock_mass` (string): Waters .raw: correct m/z with the lock-spray reference scans, given the lock compound's m/z (e.g. 556.2771), or "auto" for the Lock Mass the file records. Default: m/z as stored.
- `max_points` (integer): At most this many points, the most intense kept (default 1000; point_count reports the full size).
- `ms_level` (integer): Count spectrum among the spectra of this MS level only (1 = full scans, 2 = MS/MS). MS1 and MS/MS scans interleave, and ms_level=2 with spectrum=0 is the first MS/MS scan.
- `rt` (number): The MS scan (of ms_level, default 1) nearest this retention time, minutes: the spectrum at a chromatogram's apex.
- `run` (integer): Run index for files with several runs (Sciex samples; default 0).
- `scan` (integer): The scan number as the instrument counts it (1-based in Thermo files; mzML `scan=N` native ids, mzXML `num`, timsTOF spectrum position + 1).
- `spectrum` (integer): The zero-based spectrum index, counted within ms_level when it is given.
- `strict` (boolean): Refuse values the file's assurance does not validate (exit_code 6). Default: the server's.
- `top_peaks` (integer): Most intense peaks listed under peaks[] with charge and neutral mass (default 20).

Output parameters:

- `format` (string): Format id of the input file.
- `path` (string): The input file.
- `peaks` (array): The most intense peaks of the whole spectrum, with charges from their isotope patterns.
- `point_count` (integer): Number of points in the full spectrum (the arrays may be shortened by `max_points`).
- `run` (integer): Run index the spectrum belongs to.
- `spectrum`: The spectrum, with its arrays.
- `truncated` (boolean): True when `mz`/`intensity` were shortened to `max_points` (the most intense points are kept, in m/z order).
- `view` (string): `primary` (profile when recorded) or `centroid` (the instrument's centroid list).

### `openreadout_spikes` (~217 tokens)

Extracellular spike detection per channel: band-pass, threshold at K x MAD noise, spike counts, rates and times.

Input parameters:

- `band_hz` (array): Band-pass `[low, high]` Hz (default [300, 6000]).
- `channels` (array): Channels (default all).
- `file` (string, required): Path to the file or data-set directory.
- `max_seconds` (number): Only the first N seconds of each sweep.
- `max_times` (integer): Spike times per channel returned (default 200).
- `sign` (string): `neg` (default), `pos` or `both`.
- `strict` (boolean): Refuse values the file's assurance does not validate (exit_code 6). Default: the server's.
- `sweeps` (array): Sweeps/segments (default all).
- `threshold` (number): Threshold in MAD noise units (default 5).
- `trace` (integer): Trace index (default 0; pick the broadband stream).

Output parameters:

- `channels` (array): One entry per channel.
- `format` (string): Format id.
- `notes` (array): Remarks.
- `path` (string): Input path.
- `sample_rate_hz` (number|null): Sampling rate, Hz.
- `settings`: Settings used (the high edge after clamping to 0.45 × the sampling rate).
- `spike_count_total` (integer): Spikes on all channels.
- `sweeps` (array): Sweeps analysed.
- `trace` (integer): Trace analysed.

### `openreadout_stats` (~908 tokens)

Pixel statistics per channel and image: count, min, max, mean, std, percentiles p1–p99, zero and saturated fractions (at the detector's 2^bits−1 when recorded), histogram; RGB images also per component. per=plane adds every plane; per=well or field gives rows per well of a screening plate. mip='z' measures the maximum-intensity projection; whole slides: a coarser level and/or a region. Measurements on one plane: line (intensity profile, FWHM), polygon (statistics inside), objects (count nuclei, cells or spots; preview marks=objects shows them), lanes (gel and blot lanes, band volumes and sizes; preview marks=lanes).

Input parameters:

- `bins` (integer): Histogram bins (0 = none). Default 32, at most 65536.
- `file` (string, required): Absolute or working-directory-relative path to the instrument file, or a plate's index file or folder (Harmony `Index.idx.xml`, ImageXpress `.HTD`, CellVoyager `MeasurementData.mlf`, OME-Zarr plate).
- `image` (integer): Only this image index.
- `lanes`: Lanes and bands of a gel or blot in `region` or the whole plane: each lane's total and each band's row and background-subtracted volume (with `ladder`, its size). `{}` finds the lanes; preview marks=…
- `level` (integer): Pyramid level: 0 = full resolution (default).
- `line` (array): Intensity profile along the line `[x0, y0, x1, y1]` (pixels of `level`, as on the preview rulers): values per channel, peak position and FWHM in px and µm.
- `line_width` (integer): Profile width in pixels, averaged across the line. Default 1.
- `mip` (string): Maximum-intensity projection first: `z` (per image, channel and time point: the largest value of each pixel over the selected z planes) or `t`; the statistics are of the projections. `z` = Along z: o…
- `objects`: Count objects in `region`, `polygon` or the whole plane: count, density, sizes, centroids, each object's mean in every channel and how many are positive per channel. `{}` counts nuclei with settings…
- `per` (string): Rows. `channel` = channel and image aggregates (default); `plane` = also one entry per plane (image, c, z, t); `well` = a screening plate (pass the plate folder or index, never one TIFF): one row per…
- `polygon` (array): Statistics inside this polygon `[[x, y], ...]` (pixels of `level`): area, mean, std, median, sum per channel.
- `region`: Only this rectangle of each plane, `{x, y, width, height}` in the pixel coordinates of `level` (e.g. the 512 x 512 centre of a whole-slide image).
- `scale` (string): Histogram spacing: `linear` (default) or `log`. `linear` = Equal-width bins from `min` to `max` (integer data: to `max + 1`, so each bin holds whole values); `log` = Geometrically spaced bins from th…
- `select` (array): Plane selection strings such as `c=0`, `z=2-5`, `t=0,3`. The aggregates cover exactly the selection.
- `strict` (boolean): Refuse values the file's assurance does not validate (exit_code 6). Default: the server's.
- `wells` (array): per=well|field: only these wells (`C05`, `c5`).

### `openreadout_summarize` (~251 tokens)

Group statistics of a table written by an earlier openreadout_batch output (or any CSV, TSV, JSON Lines, JSON or Parquet table): n, mean, sd, sem, median, min, max and CV % per group of `by`, optionally averaging replicates first and testing every group against a control.

Input parameters:

- `by` (array, required): Group by these columns.
- `control` (string): The control group (a value of the first `by` column).
- `exact_by` (boolean): Group by exactly `by`.
- `output` (string): Write the summary to this file.
- `overwrite` (boolean): Replace an existing output file.
- `replicate` (string): Average rows within each replicate first.
- `table` (string, required): A table file written by an openreadout_batch `output` (or any CSV, TSV, JSON Lines, JSON or Parquet table).
- `test` (string): `welch` or `mann-whitney` against `control`.
- `values` (array): Value columns (default: the measure's main values).
- `where` (array): Row filters `COLUMN=VALUE` / `COLUMN!=VALUE`.

Output parameters:

- `input` (string): The table summarized.
- `output`: Where it was written.
- `summary`: The summary.

### `openreadout_table` (~667 tokens)

Rows of a table {columns, labels, rows, total_rows, truncated}: FCS events ($PnN columns), plate reads (well, row, col, read, wavelength_nm, time_s, value), event, spike or peak tables (including the vendor's own integration results). Values are raw; FCS can be compensated, transformed and given 0/1 population columns from a workspace or Gating-ML file. filter with count=true counts the events meeting conditions.

Input parameters:

- `compensate` (string): FCS only: compensate the values: `auto` (the gating file's matrix when one is given, else the file's $SPILLOVER/$SPILL/SPILL), `fcs` or `gating`. Values become FCS scale values first ($PnE, $PnG, $TI…
- `count` (boolean): Return only the count (`filter.matched_rows`, `total_rows`, `percent`), no rows.
- `file` (string, required): Path to the file.
- `filter` (array): Row conditions `COLUMN OP NUMBER` (OP: > >= < <= == !=; COLUMN: $PnN, $PnS or `gate:<path>`), all of which must hold, e.g. `["FITC-A > 1000"]`. Tested on the values returned (after compensate/transfo…
- `first_row` (integer): Zero-based first row. Default 0.
- `gatingml` (string): FCS only: Gating-ML 2.0 file (same uses as workspace).
- `max_rows` (integer): Maximum rows to return. Default 100 (fewer for wide tables: about 5000 values), capped at 10000.
- `parameters` (array): FCS only: parameters ($PnN) to transform; default every fluorescence parameter.
- `populations` (array): FCS only: populations (paths like `/Lymphocytes/Singlets` or unique names) whose 0/1 membership is appended as `gate:<path>` columns.
- `sample` (string): Workspace sample name or id (default: matched by file name or $FIL).
- `strict` (boolean): Refuse values the file's assurance does not validate (exit_code 6). Default: the server's.
- `table` (integer): Table index (FCS data set or plate read; see openreadout_info → tables[]). Default 0.
- `transform` (string): FCS only: transform after compensation: `logicle`, `arcsinh`, `hyperlog`, `log`, `linear`, `biex`, `flowjo-log`, `arcsinh-cofactor`, with parameters as `NAME:K=V,…` (`logicle:T=262144,W=0.5,M=4.5,A=0…
- `workspace` (string): FCS only: FlowJo workspace (.wsp) for compensate=gating, transform=workspace and populations.

Output parameters:

- `columns` (array): Column names (FCS `$PnN`).
- `filter`: Present with `--where`/`--count`: the row conditions and how many rows of the whole table meet them. `rows`, `first_row` and `truncated` then page through the matching rows.
- `first_row` (integer): Zero-based index of the first row returned.
- `format` (string): Format id of the input file.
- `labels` (array): Column labels (FCS `$PnS`), `null` where absent.
- `path` (string): The input file.
- `processing`: Present when the values were processed (FCS scale values, compensation, transforms, population membership columns); absent for raw values.
- `rows` (array): Row-major values; `rows[r][c]`. Non-finite values serialize as `null`. A text column holds codes here; `texts` has its text.
- `table` (integer): Table index (see `info` → `tables[]`).
- `texts` (object): Text columns (`info` → `tables[].columns[].extra.categories`) by column name: the text of each returned row, so `texts[name][r]` is what `rows[r][c]` codes. Absent when the table has no text column.
- `total_rows` (integer): Rows in the whole table.
- `truncated` (boolean): True when more rows follow the returned slice.

### `openreadout_trace` (~419 tokens)

One window of one sweep of a sampled signal or 1-D spectrum in physical units: electrophysiology sweeps, chromatography detector traces, ÄKTA curves, ITC thermograms, SPR sensorgrams, NMR FIDs and spectra (process=true turns an FID into a spectrum), IR/Raman/UV-Vis/CD spectra (each spectrum of a map is a sweep), qPCR curves, EPR, XRD, electrochemistry, thermal analysis. Per channel: min, max, mean, std and argmax_axis_value (the maximum's position on the axis: retention time, ppm, cm⁻¹, °2θ) over the window, plus the first max_samples values.

Input parameters:

- `channels` (array): Channel indices to return. Default: all channels.
- `count` (integer): Window length in samples (statistics cover the whole window). Default: to the end of the sweep.
- `file` (string, required): Path to the file.
- `first_sample` (integer): First sample of the window, zero-based within the sweep. Default 0.
- `max_samples` (integer): Samples returned per channel. Default 200, capped at 10000.
- `process` (boolean): NMR: return FID traces as spectra processed by OpenReadout (group delay, apodization, zero filling, FT, stored or automatic phase, baseline, ppm axis).
- `strict` (boolean): Refuse values the file's assurance does not validate (exit_code 6). Default: the server's.
- `sweep` (integer): Sweep (episode or segment) index. Default 0.
- `trace` (integer): Trace index (see openreadout_info → traces[]). Default 0.
- `x_range` (array): Window on the trace's own axis instead of first_sample/count, `[a, b]` either order: cm⁻¹, nm, ppm, a chromatogram's retention time in its axis unit; seconds for signals without an axis.

Output parameters:

- `axis`: The trace's abscissa (`info` → `traces[].extra.axis`: `{quantity, unit, first, step, …}`), e.g. the ppm axis of an NMR spectrum or a chromatogram's retention time in minutes; sample `i` of the sweep…
- `channels` (array): One entry per requested channel.
- `first_sample` (integer): First sample of the window (zero-based, within the sweep).
- `format` (string): Format id of the input file.
- `path` (string): The input file.
- `sample_count` (integer): Samples in the window (statistics cover all of them).
- `sample_rate_hz` (number|null): Samples per second.
- `start_s` (number|null): Time of the first window sample in seconds. Single-sweep traces use the trace's own clock: `info.traces[].start_s + first_sample / sample_rate_hz` (a chromatogram's retention time, negative when acqu…
- `sweep` (integer): Sweep index.
- `sweep_count` (integer): Sweeps in the trace.
- `sweep_sample_count` (integer): Samples in this sweep.
- `sweep_start_s` (number|null): Time of the sweep's first sample on the recording clock, seconds, when the file records it (`info.traces[].start_s` for a single sweep, `extra.sweep_starts_s[sweep]` for multi-sweep traces).
- `trace` (integer): Trace index (see `info` → `traces[]`).
- `truncated` (boolean): True when fewer samples are returned than the window holds.
- `x_range` (array|null): The axis window asked for (`x_range`, low to high): axis units, or seconds for signals without an axis. `first_sample`/`sample_count` are the samples inside it.

### `openreadout_watch` (~296 tokens)

Follow directories an instrument writes to: each call looks once and returns events since cursor (dataset_new, plane_new, scan_new, frame_new, dataset_complete, dataset_stalled, qc with qc=true: saturation, focus drift, dropped frames, TIC drop, error). Poll with the returned cursor; files are never locked.

Input parameters:

- `cursor` (integer): Return events with a sequence number greater than this (the `cursor` of the previous call); 0 or absent on the first call.
- `dirs` (array, required): Directories (or files) to watch. The same list (in any order) continues the same watcher across calls.
- `follow_symlinks` (boolean): First call only: walk into directories behind symbolic links too (links to files are always followed).
- `limit` (integer): Most events returned (default 200, max 5000); call again with the new cursor for more.
- `qc` (boolean): First call only: evaluate the built-in live QC rules on each new plane or scan.
- `since` (string): First call only: report data sets modified since then (`10m`, `2h`, `1d`, an ISO-8601 time, or `all`). Default: the live window (5 minutes) back from now.
- `stall_after` (number): First call only: seconds without growth before `dataset_stalled` (default 120).

Output parameters:

- `cursor` (integer): Pass back as `cursor` to get only newer events.
- `dropped` (boolean): True when events after the cursor were dropped (the server keeps the last 10000).
- `events` (array): Events after the given cursor, oldest first (the same objects `openreadout watch` prints under `data`).
- `more` (boolean): True when more events are waiting (raise `limit` or call again).
- `notes` (array): What the watcher left out and how to include it.
- `tracked` (integer): Data sets the watcher remembers.

## Diagnostics

Captured diagnostic sections: Provenance. The full working is on the page: https://verifymcp.io/servers/openreadout-openreadout/openreadout-mcp-x86-64-unknown-linux-musl#diagnostics

## Score history

- 2026-11-05: 50
- 2026-11-04: 50
- 2026-11-03: 50
- 2026-11-02: 50
- 2026-11-01: 50
- 2026-10-31: 50
- 2026-10-30: 50
- 2026-10-29: 50
- 2026-10-28: 50
- 2026-10-27: 50
- 2026-10-26: 50
- 2026-10-25: 50
- 2026-10-24: 50
- 2026-10-23: 50
- 2026-10-22: 50
- 2026-10-21: 50
- 2026-10-20: 50
- 2026-10-19: 50
- 2026-10-18: 50
- 2026-10-17: 51
- 2026-10-16: 51
- 2026-10-15: 51
- 2026-10-14: 51
- 2026-10-13: 51
- 2026-10-12: 51
- 2026-10-10: 51
- 2026-10-07: 51
- 2026-10-06: 51
- 2026-10-04: 51
- 2026-10-03: 51

## Common questions

### What is the OpenReadout MCP server?

OpenReadout is an MCP server listed in the public MCP registry as io.github.openreadout/openreadout. Read raw lab-instrument files offline: metadata, previews, integrity checks, open-format export. This page covers its MCPB bundle (https://github.com/openreadout/openreadout/releases/download/v0.4.0/openreadout-mcp-x86_64-unknown-linux-musl.mcpb).

### Is the OpenReadout MCP server safe to use?

OpenReadout scores 50 out of 100 on VerifyMCP. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the OpenReadout MCP server expose?

OpenReadout exposes 28 tools: openreadout_assay, openreadout_batch, openreadout_check, openreadout_chromatogram, openreadout_compare, and 23 more. Their descriptions and schemas cost roughly 15,215 tokens of context every time the server is loaded.

### What licence is the OpenReadout MCP server under?

OpenReadout declares the MIT OR Apache-2.0 licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

## Links

- Repository: https://github.com/openreadout/openreadout
- Website: https://openreadout.github.io/openreadout/
- Changelog RSS feed: https://verifymcp.io/servers/openreadout-openreadout/openreadout-mcp-x86-64-unknown-linux-musl.xml
- Changelog JSON feed: https://verifymcp.io/servers/openreadout-openreadout/openreadout-mcp-x86-64-unknown-linux-musl.json
- HTML version of this page: https://verifymcp.io/servers/openreadout-openreadout/openreadout-mcp-x86-64-unknown-linux-musl
