OpenReadout
NPM · OPENREADOUT · 6 COMPONENTS
Read raw lab-instrument files offline: metadata, previews, integrity checks, open-format export.
Available components
Last scanned (22 hours ago)
Scores higher than 92% of npm servers
Category Health and Science
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. How we score → Why this is hard to score →
Supply Chain Security100
- No malware found by supply-chain analysis.Pass
- No known CVEs affecting this package version or its production dependencies.Pass
- No install/post-install scripts declared.Pass
- 0 of 5 dependencies flagged as unhealthy. View diagnostics → Pass
Provenance & Transparency100
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Cryptographically verified build provenance (signed, bound to openreadout/openreadout). View diagnostics → Pass
- Clear OSI-approved license (MIT OR Apache-2.0).Pass
- Actively maintained (last published 17 days ago).Pass
- Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability69
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (good).Pass
- 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. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management51
- Stability check failed: the tool surface changed between 0.3.0 and 0.4.0: 6 tool removals, 0 breaking changes, 2 additions. See how to fix → Fail
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
- Structured output schemas are declared (96% of tools); any adoption earns full credit.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- We read all 28 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
- An AI judge read all 30 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a current MCP spec version (2026-07-28).Pass
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 4 Nov 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 48 to 51.
- 2 Nov 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 41 to 45.
- 31 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 35 to 38.
- 29 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 28 to 31.
- 27 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 21 to 25.
- 24 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 11 to 15.
- 22 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 5 to 8.
- 20 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 0 to 1.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 4 Nov 2026 · Analysed npm/openreadout@0.4.0
Provenance Verified
A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.
| Result | Verified |
|---|---|
| Ecosystem | npm |
| Reason | Verified |
| Discovered via | Registry attestation endpoint |
| Source repo | openreadout/openreadout |
| Certificate issuer | https://token.actions.githubusercontent.com |
| Certificate SAN | https://github.com/openreadout/openreadout/.github/workflows/release.yml@refs/tags/v0.4.0 |
| Rekor log index | 3304998074 |
| Predicate type | SLSA build provenance https://slsa.dev/provenance/v1 |
| Subject digest | sha512:9ba66e3385074612b7fabed7f888385e544871f2dc49bacc29ba04cb124f51bc3497cbc0483285c5384b434ea5e0e00f0be532680541e93fc29dea319 |
Background: How many MCP packages publish verified provenance →
Dependencies 5 packages
| Packages resolved | 5 |
|---|---|
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
openreadout_spikes ~217
Extracellular spike detection per channel: band-pass, threshold at K x MAD noise, spike counts, rates and times.
| Name | Type | Req | Description |
|---|---|---|---|
| band_hz | array | – | Band-pass `[low, high]` Hz (default [300, 6000]). |
| channels | array | – | Channels (default all). |
| file | string | yes | 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). |
| Name | Type | Req | Description |
|---|---|---|---|
| channels | array | yes | One entry per channel. |
| format | string | yes | Format id. |
| notes | array | – | Remarks. |
| path | string | yes | Input path. |
| sample_rate_hz | number|null | yes | Sampling rate, Hz. |
| settings | – | yes | Settings used (the high edge after clamping to 0.45 × the sampling rate). |
| spike_count_total | integer | yes | Spikes on all channels. |
| sweeps | array | yes | Sweeps analysed. |
| trace | integer | yes | Trace analysed. |
No examples provided.
openreadout_stats ~908
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).
| Name | Type | Req | Description |
|---|---|---|---|
| bins | integer | – | Histogram bins (0 = none). Default 32, at most 65536. |
| file | string | yes | 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`). |
Structured output declared, but exposes no named fields.
No examples provided.
openreadout_summarize ~251
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.
| Name | Type | Req | Description |
|---|---|---|---|
| by | array | yes | 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 | yes | 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`. |
| Name | Type | Req | Description |
|---|---|---|---|
| input | string | yes | The table summarized. |
| output | – | – | Where it was written. |
| summary | – | yes | The summary. |
No examples provided.
openreadout_table ~667
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.
| Name | Type | Req | Description |
|---|---|---|---|
| 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 | yes | 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. |
| Name | Type | Req | Description |
|---|---|---|---|
| columns | array | yes | 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 | yes | Zero-based index of the first row returned. |
| format | string | yes | Format id of the input file. |
| labels | array | yes | Column labels (FCS `$PnS`), `null` where absent. |
| path | string | yes | The input file. |
| processing | – | – | Present when the values were processed (FCS scale values, compensation, transforms, population membership columns); absent for raw values. |
| rows | array | yes | Row-major values; `rows[r][c]`. Non-finite values serialize as `null`. A text column holds codes here; `texts` has its text. |
| table | integer | yes | 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 | yes | Rows in the whole table. |
| truncated | boolean | yes | True when more rows follow the returned slice. |
No examples provided.
openreadout_trace ~419
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.
| Name | Type | Req | Description |
|---|---|---|---|
| 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 | yes | 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. |
| Name | Type | Req | Description |
|---|---|---|---|
| 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 | yes | One entry per requested channel. |
| first_sample | integer | yes | First sample of the window (zero-based, within the sweep). |
| format | string | yes | Format id of the input file. |
| path | string | yes | The input file. |
| sample_count | integer | yes | Samples in the window (statistics cover all of them). |
| sample_rate_hz | number|null | yes | Samples per second. |
| start_s | number|null | yes | 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 | yes | Sweep index. |
| sweep_count | integer | yes | Sweeps in the trace. |
| sweep_sample_count | integer | yes | 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 | yes | Trace index (see `info` → `traces[]`). |
| truncated | boolean | yes | 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. |
No examples provided.
openreadout_watch ~296
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.
| Name | Type | Req | Description |
|---|---|---|---|
| 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 | yes | 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). |
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | integer | yes | Pass back as `cursor` to get only newer events. |
| dropped | boolean | yes | True when events after the cursor were dropped (the server keeps the last 10000). |
| events | array | yes | Events after the given cursor, oldest first (the same objects `openreadout watch` prints under `data`). |
| more | boolean | yes | 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 | yes | Data sets the watcher remembers. |
No examples provided.
How do I install the OpenReadout MCP server?
OpenReadout runs locally as an npm package, launched with npx -y openreadout. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
npm · openreadout
claude mcp add openreadout-openreadout -- npx -y openreadout
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 npm package (openreadout).
Is the OpenReadout MCP server safe to use?
OpenReadout scores 88 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 4 November 2026. It declares no install or post-install scripts. 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.
Is the OpenReadout MCP server still maintained?
OpenReadout is still listed as active in the MCP registry. We last reached this channel on 4 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
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.