An MCP server for OriginLab Origin that reports what Origin did, not what it was asked to do.
Strong tool definitions with comprehensive descriptions and well-structured schemas. All 16 tools have clear, detailed descriptions (avg ~250 chars, well within 10-1024 range). Input schemas are complete with typed parameters and descriptions. Naming follows verb_noun convention (origin_plot, origin_worksheet_read, etc.). Key strengths: excellent error guidance in descriptions (e.g., origin_labtalk explains why Python scripts are refused), parameter constraints documented inline, and output fields clearly specified. Weaknesses: no enum constraints for categorical params (plot_type accepts string or number but no enum list), missing output schema documentation in tool definitions, and no explicit error classification (retryable vs fatal). Risk annotations present but not formalized as tool annotations in protocol.
Read an axis's scale and range as Origin currently holds them. Worth doing before setting a range: Origin's own rescaling may already have moved it, and the number a caller remembers setting is not necessarily the one in the graph.
Set an axis's scale, range or title, and read back what Origin holds. `scale` is a name (`linear`, `log10`, `ln`, `log2`, `probability`, `reciprocal`) or an Origin scale number. Omitted arguments are left alone. Unlike plot styles, these read back from the same properties Origin draws from, so `matches_request` is a real check. Origin clamps and rounds axis ranges for its own reasons, and a mismatch usually means it did. Origin swaps the axes of bar charts internally: the value axis of a horizontal bar chart is the one LabTalk calls `y`. Setting what looks like the value axis on one will retitle the categories instead.
Export a graph to a PNG. Also the only way to find out whether a style change did anything: Origin stores values it never acts on, so the picture is the only witness. The result reports where Origin was told to write, not that it succeeded -- `expGraph` says almost nothing about failure.
List a graph's layers and plots, with the addresses styling needs. Also reports each plot's `group_mode`. A plot in a group is drawn with the group's style, so writing to a member is refused -- check here before trying to style one.
No enum constraints for categorical parameters. plot_type accepts 'string|integer' but lacks enum list of valid plot types (line, scatter, column, bar, area, box, histogram, stack_column). LLMs will hallucinate invalid plot types.
Output schemas not documented in tool definitions. Descriptions state what is returned (e.g., 'returns the graph and layer') but JSON Schema output structure is not visible. LLMs cannot plan downstream tool calls without knowing response field names.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) in protocol. Risk field present in metadata (READ_ONLY, WRITE) but not exposed as MCP tool annotations. Agents cannot distinguish safe vs destructive operations without parsing descriptions.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 61 | 2026-07-28+ | v2 |
Run a LabTalk script inside Origin and return what it printed. The escape hatch: anything Origin can do from its command window. Prefer a dedicated tool where one exists, because this one cannot check its own work. `returned` says the script parsed and dispatched, not that it did anything. A LabTalk script stops at its first bad expression, so when `returned` is false the last captured line is the last line that ran. Origin's own error text goes to its console and cannot be captured from here. Scripts that start Python (`run -pyf`, `py.exec`) are refused: Origin will not run Python while a command is in flight, and every request here is one.
Add a layer (a panel) to a graph, and report which index it got. Returns the new layer's index because every other operation takes one, and assuming the new layer is 1 is wrong the moment the graph already had two.
Lay a graph's layers out as a grid of panels. A grid too small for the layers is refused: Origin would leave one off the page, and nothing about the result would say so.
Rebuild a layer's legend, and optionally place or hide it. Origin generates its legend from the plots present at the moment it is refreshed rather than storing it, so a legend showing the wrong series is almost always one that has not been refreshed since the plots changed. Call this after adding plots. `position` is one of `top_left`, `top_right`, `bottom_left`, `bottom_right`.
Check the bridge is reachable and report what is on the far end. Answers even when originpro is broken, which is when it matters most.
Plot worksheet columns into a graph layer, and return the graph and layer. Without `graph` this makes a new graph page. Give `graph` to add another panel to one that already exists -- that is how a multi-panel figure is built, one call per panel, then `origin_layers_arrange`. `plot_type` is a name (`line`, `scatter`, `column`, `bar`, `area`, `box`, `histogram`, `stack_column`, ...) or any Origin plot-type id as a number, so an unusual chart is never blocked by the name list. Columns are given as zero-based indexes or Origin short names. Several `y` columns go into the same layer, grouped unless `group` is false. Use the returned `graph` **and `layer`** for everything afterwards. Origin chooses the name, and the new layer is not the active one, so neither can be assumed. `plots_in_layer` is read back from Origin rather than counted from the request.
Read one LabTalk `set` option off a data plot. `option` is a LabTalk option token such as `-w` (line width, in points x 500) or `-pfp` (bar fill pattern). Use `origin_set_options` to find one -- the names are not guessable, and an invented one would be accepted by Origin and do nothing.
Set one LabTalk `set` option on a data plot, and read it back. The result's `readback` says whether Origin stored the value. Read `readback_means` before treating that as success: Origin stores options it does not recognise, so a matching read-back is necessary evidence, not sufficient. Render the graph if you need to know it changed. Writing to a plot inside a group is refused, because Origin would draw the group's style regardless while the write read back as if it had worked.
List the LabTalk `set` options that apply to a plot type, with their documentation.
Describe a worksheet -- size, column names, formats -- without reading the data.
Read a worksheet's data into a pandas DataFrame.
Write data into a worksheet, creating columns as needed.
Missing enum for legend position. origin_legend_set accepts position as 'string|null' but description lists only four valid values (top_left, top_right, bottom_left, bottom_right). Should be enum constraint.
Error handling lacks recovery guidance. Descriptions explain failure modes (e.g., 'returned says script parsed, not that it did anything') but do not guide LLM on next steps. No 'try X instead' or 'this is retryable' classification.