
Ocean Insight Spectrometer
io.github.K-Dense-AIPublished by GitHub account K-Dense-AIv0.1.2Updated Oct 27, 2026
MCP server for Ocean Insight / Ocean Optics spectrometers (python-seabreeze).
Overview
Local MCP server that lets an AI assistant drive Ocean Insight (Ocean Optics) spectrometers: acquire spectra, tune integration time, and measure absorbance…
- What you can do
- Acquire intensity spectra with averaging, boxcar smoothing and corrections, with peak positions, FWHM and saturation checks; optionally save to a new CSV file
- Set or auto-tune integration time, and store dark and reference spectra for later measurements
- Measure absorbance and transmittance of the sample in the beam, with values at requested wavelengths and maxima or dips
- Find peaks or dips in the latest spectrum, and read detector temperature or enable/disable the thermo-electric cooler on supported models
- Inspect the instrument: list visible spectrometers, device details, connection info, safety limits and the raw command log; reconnect after a power cycle
- When to use it
- Useful in a lab setting where a supported Ocean Optics spectrometer is attached to the same computer and you want an assistant to walk through dark, blank and sample steps, report peak positions or widths, or log absorbance and transmittance measurements. It is also usable without hardware through a built-in simulator for trying the workflow first.
- Requirements
- Runs locally as a Python package (uvx labmcp-ocean-spectrometer) over stdio; desktop only. Needs a supported spectrometer connected by USB, one-time driver or udev setup via seabreeze_os_setup, and no other program (such as OceanView) holding the device. Optional environment variables: LABMCP_ADDRESS (serial number or address), LABMCP_LIMITS, LABMCP_READ_ONLY, LABMCP_SIMULATE. No authentication declared.
Installation
In SourceWeft
- Open Ocean Insight Spectrometer in the dashboard and add it to a workspace.
- Enable the server for the chats that should use its tools.
Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.
Other MCP clients
Follow the launch instructions in the repository.
README
Ocean Insight Spectrometer — MCP Server
Let an AI agent acquire spectra, set or auto-tune the integration time, store dark and reference spectra, and measure absorbance and transmittance with peak positions and FWHM on Ocean Insight (Ocean Optics) spectrometers. It works through the open-source python-seabreeze library.
Try it without hardware
The simulator models a USB2000+ (or QE Pro) looking at a tungsten-halogen lamp, a white LED or a Hg-Ar lamp. It includes shot and read noise, dark offset and dark current, electric-dark pixels, detector nonlinearity, saturation, and the stale first spectrum after an integration-time change. In simulation a "virtual user" blocks the beam before store_dark_reference, inserts a blank before store_reference, and inserts a dye sample (absorbance band at 520 nm, 0.8 AU) before measure_absorbance/measure_transmittance. With real hardware your scientist does these steps.
Connect your spectrometer
- Drivers / permissions (once per computer), as documented by python-seabreeze:
- Linux: this installs the udev rules (
/etc/udev/rules.d/10-oceanoptics.rules, needs sudo). Re-plug the spectrometer afterwards. - Windows: this installs the USB driver files. The
pyseabreezebackend also needslibusb-1.0.dll(see the seabreeze README). - macOS: works out of the box.
- Linux: this installs the udev rules (
- Close OceanView (or any other program using the spectrometer). Only one program can open it.
- Test the connection:
--addressis the spectrometer's serial number and is only needed when several are connected (list_spectrometersshows them). The default backend iscseabreeze(compiled libseabreeze); if it can't load, seabreeze falls back to the pure-Pythonpyseabreeze(pyusb).
On connect the server sets the integration time to 10 ms (--option integration_ms=…), clamped to the device range. It has to set it, because seabreeze cannot read the integration time back.
Add to your MCP client
Claude Code
Claude Desktop / Cursor / Windsurf (claude_desktop_config.json, .cursor/mcp.json, …)
Add --read-only to allow acquisitions and absorbance measurements with the present settings while blocking integration-time changes, reference storage and TEC control. For other clients, generate the snippet with uvx labmcp config ocean-spectrometer --client vscode (also cursor, codex, claude-code).
Tools
get_connection_info, get_command_log and reconnect are built into every LabMCP server.
Safety limits
Override at launch: --limit max_integration_time_ms=60000. Whatever the limits say, one acquisition (scans × integration time, plus the spectrum discarded after an integration-time change) must fit in 540 s, the time one tool call may take; auto_integration_time stops early for the same reason and says so.
Example prompts
- "Auto-adjust the integration time on the lamp, then take a 20-scan averaged spectrum and tell me where the peak is and how wide it is."
- "I'm going to measure a Beer–Lambert series. Walk me through dark, blank and each of my five standards, and report the absorbance at 520 nm for each."
- "Here's the Hg-Ar lamp. Find the lines between 400 and 600 nm and tell me how far they are from 404.66, 435.83 and 546.07 nm."
- "Measure the transmittance of this filter from 400 to 700 nm and save it to ~/data/filter_T.csv."
- "Cool the QE Pro to −10 °C and tell me when the detector temperature has settled."
Notes
- Raw counts. Intensities are detector counts, not irradiance. Radiometric calibration is out of scope.
- Saturation is judged on the raw ADC counts of every averaged scan: a pixel is saturated at ≥ 98 % of
max_intensity. Saturated pixels are flagged, and they're excluded from absorbance/transmittance (with boxcar smoothing, so are the pixels within the boxcar half width of them). seabreeze notes that some detectors saturate belowmax_intensity, so keep peaks at 70–85 %. - Corrections.
correct_dark_countssubtracts the mean of the optically masked electric-dark pixels;correct_nonlinearityapplies the EEPROM polynomial. The driver reads raw spectra and applies both corrections with the same formula asseabreeze.spectrometers.Spectrometer.intensities, so saturation can still be detected on raw data. A stored dark (store_dark_reference) is still required for absorbance, because electric-dark correction doesn't remove fixed-pattern dark signal. - Absorbance is A = −log10((S − D)/(R − D)). Pixels where the reference has less than 0.5 % of its peak signal above dark, or where the reference or sample is saturated, are returned as
null. The dark, reference and sample must share integration time, boxcar and corrections; the server enforces this and asks you to re-take references when they differ. - First spectrum after an integration-time change is discarded. It may have been integrated partly with the old setting; the QE Pro manual notes that it returns the most recently completed spectrum.
- Boxcar follows OceanView's convention:
boxcar_half_width= pixels averaged on each side. Peaks are found on the full-resolution spectrum. The returned curve is bin-averaged down tomax_points. - TEC tools use seabreeze's
thermo_electricfeature (enable_tec,set_temperature_setpoint_degrees_celsius,read_temperature_degrees_celsius) and only work when the backend exposes it for your model. In pyseabreeze 2.11 that is only the NIRQuest512. For the QE Pro it depends on libseabreeze (cseabreeze); this is unverified on hardware. The QE Pro manual says the TEC cools only ~15–40 °C below ambient. - Not exposed: shutter and lamp (
light_source/strobe_lamp) control, trigger modes, and irradiance calibration. seabreeze documents these features, but device support isn't specified and several aren't implemented in pyseabreeze, so they could not be verified. - Peaks next to invalid pixels. Invalid (
null) pixels are treated as unknown: a pixel next to one is not reported as a peak, and prominence and FWHM do not extend across them. When invalid pixels lie inside the requested range (for example the centre of a band too strong to measure), absorbance/transmittance results carry a warning. - Dark and reference spectra live in the server's memory and are lost on
reconnector restart. Save data withsave_path: it must end in.csv, missing folders are created, and an existing file is never overwritten (choose a new name). The path is checked before the spectrum is acquired.
Hardware verification
Source: servers/chemistry/ocean-spectrometer/README.md at commit 46545ea
Tools
0Version history
2- v0.1.2LatestSep 27, 2026
- v0.1.0Sep 26, 2026
Score
50% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
- Reached in the last 30 days25 pts
Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.
- Auth declared10 pts
Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.
- Tools listed15 pts
Answer tools/list without a credential, or ship a package that starts in a sandbox without one.
- DescriptionRequired15 pts
- Logo10 pts
- Documentation15 pts
- License10 pts