# SRS Lock-in Amplifier (pypi · labmcp-srs-lockin)

MCP server for Stanford Research Systems lock-in amplifiers (SR810/SR830, SR860/SR865A).

- Trust score: 69/100 (medium)
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-09-30

## Components

- pypi · `labmcp-srs-lockin`: 69/100 (this document), [markdown](https://verifymcp.io/servers/k-dense-ai-labmcp-srs-lockin/labmcp-srs-lockin.md), [page](https://verifymcp.io/servers/k-dense-ai-labmcp-srs-lockin/labmcp-srs-lockin)

## Channel facts

- Registry: `pypi`
- Package: `labmcp-srs-lockin`
- Version: `0.1.3`
- Transport: `stdio`

## 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-09-30.

- **Supply Chain Security**: 49/100
  - Malware scan not yet available for this package.
  - No known CVEs affecting this package version or its production dependencies.
  - Runs hatchling.build at install time, a recognised build step with no custom scripting around it.
  - 2 of 17 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 100/100
  - Source repository is publicly reachable at the declared URL.
  - Cryptographically verified build provenance (signed, bound to K-Dense-AI/lab-instrument-mcps).
  - Clear OSI-approved license (Apache-2.0).
  - Actively maintained (last published 3 days ago).
  - Publishes a security disclosure policy (SECURITY.md).
- **Schema Quality & AI Usability**: 81/100
  - AI-judged instruction clarity (excellent).
  - Tool/resource definitions use about 1582 tokens (~105/item across 15 items; 15 tools + 0 resources), lean.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 13/100
  - Stability observed for 4 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 99/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 96% of tool parameters carry a description.
  - Structured output schemas are declared (100% 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 15 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 16 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).

## Install

### How do I install the SRS Lock-in Amplifier MCP server?

SRS Lock-in Amplifier runs locally as a PyPI package, launched with uvx labmcp-srs-lockin. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add k-dense-ai-labmcp-srs-lockin -- uvx labmcp-srs-lockin
```

### Cursor

```json
{
  "mcpServers": {
    "k-dense-ai-labmcp-srs-lockin": {
      "command": "uvx",
      "args": [
        "labmcp-srs-lockin"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "k-dense-ai-labmcp-srs-lockin": {
      "command": "uvx",
      "args": [
        "labmcp-srs-lockin"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add k-dense-ai-labmcp-srs-lockin -- uvx labmcp-srs-lockin
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "k-dense-ai-labmcp-srs-lockin": {
      "type": "local",
      "command": [
        "uvx",
        "labmcp-srs-lockin"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add k-dense-ai-labmcp-srs-lockin --command uvx --arg labmcp-srs-lockin
```

### Hermes

```yaml
mcp_servers:
  k-dense-ai-labmcp-srs-lockin:
    command: "uvx"
    args: ["labmcp-srs-lockin"]
```

### Netclaw

```json
{
  "McpServers": {
    "k-dense-ai-labmcp-srs-lockin": {
      "Transport": "stdio",
      "Command": "uvx",
      "Arguments": [
        "labmcp-srs-lockin"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add k-dense-ai-labmcp-srs-lockin -t stdio -c uvx -a labmcp-srs-lockin
```

### Other

```json
{
  "mcpServers": {
    "k-dense-ai-labmcp-srs-lockin": {
      "command": "uvx",
      "args": [
        "labmcp-srs-lockin"
      ]
    }
  }
}
```

## 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-09-29 (score 69, +1)

No change was recorded against any check on this day. Stability & Change Management went from 7 to 10. That category is still filling its 30-day observation window: 2 days of observed history at the previous scan, 3 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-28 (score 68, −4)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-09-27 (score 72, 0)

- [functional improvement] Stability: unverified → 0.03
- [functional] Package version: 0.1.2 → 0.1.3

### 2026-09-26 (score 72)

First indexed and scored.

## MCP tools (15)

### `get_connection_info` (~40 tokens)

Get Connection Info

Report which instrument is connected (identity, address, simulated or real),
whether the server is read-only, and the active safety limits. Call this first.

### `get_command_log` (~46 tokens)

Get Command Log

Return the most recent raw commands sent to / replies received from the
instrument (newest last). Useful for debugging and for recording what was done.

Input parameters:

- `limit` (integer)

Output parameters:

- `result` (array)

### `reconnect` (~35 tokens)

Reconnect

Close and re-open the connection to the instrument (e.g. after it was power
cycled or a cable was re-plugged).

### `read_outputs` (~87 tokens)

Read Outputs

Read X, Y, R and θ as one coherent snapshot (SNAP?), with the reference frequency,
sensitivity, fraction of full scale and any overloads latched since the last reading.

Values are only meaningful once the output filter has settled (~5-10 time constants after a
change).

Input parameters:

- `include_aux_inputs` (boolean): Also read Aux In 1-4 (V)

Output parameters:

- `aux_inputs_v`: Aux In 1-4 (V), if requested
- `fraction_of_full_scale` (number): r / sensitivity; above 1 means overload
- `harmonic` (integer)
- `overloads` (array): Overload/unlock conditions latched since the last reading
- `r` (number): Magnitude R (same unit as x)
- `reference_frequency_hz` (number)
- `sensitivity` (number): Full-scale sensitivity, in `unit`
- `theta_deg` (number): Phase θ in degrees
- `timestamp` (string)
- `unit` (string): Unit of x, y and r
- `x` (number): In-phase output X (V rms, or A rms on a current input)
- `y` (number): Quadrature output Y (same unit as x)

### `get_settings` (~42 tokens)

Get Settings

Report the reference (source, frequency, harmonic, phase), sine output, sensitivity,
time constant/slope (with the 99 % settling time), and input configuration.

Output parameters:

- `coupling` (string)
- `dynamic_reserve`: SR810/SR830 only
- `filter_slope_db_oct` (integer)
- `harmonic` (integer)
- `input_configuration` (string): A, A-B, I_1MOhm or I_100MOhm
- `input_range_v`: SR86x voltage input range
- `model` (string)
- `phase_deg` (number)
- `reference_frequency_hz` (number)
- `reference_source` (string)
- `sensitivity` (number): Full-scale sensitivity (V, or A on a current input)
- `sensitivity_unit` (string)
- `settle_time_s` (number): Time to settle to 99 % after a change (manual table)
- `shield` (string)
- `sine_amplitude_v` (number): Sine output amplitude, V rms
- `sine_dc_level_v`: Sine output DC level (SR86x only)
- `sync_filter` (boolean)
- `time_constant_s` (number)
- `timestamp` (string)

### `set_reference` (~103 tokens)

Set Reference

Set the reference: source (internal/external), internal frequency, detection harmonic and
phase shift. Omitted parameters are left unchanged. Changing the frequency also changes the
frequency of the SINE OUT drive (at the current amplitude).

Input parameters:

- `frequency_hz`: Internal reference frequency (internal mode only)
- `harmonic`: Detection harmonic n
- `phase_deg`: Reference phase shift
- `source`: internal = sine output oscillator; external = lock to REF IN

Output parameters:

- `coupling` (string)
- `dynamic_reserve`: SR810/SR830 only
- `filter_slope_db_oct` (integer)
- `harmonic` (integer)
- `input_configuration` (string): A, A-B, I_1MOhm or I_100MOhm
- `input_range_v`: SR86x voltage input range
- `model` (string)
- `phase_deg` (number)
- `reference_frequency_hz` (number)
- `reference_source` (string)
- `sensitivity` (number): Full-scale sensitivity (V, or A on a current input)
- `sensitivity_unit` (string)
- `settle_time_s` (number): Time to settle to 99 % after a change (manual table)
- `shield` (string)
- `sine_amplitude_v` (number): Sine output amplitude, V rms
- `sine_dc_level_v`: Sine output DC level (SR86x only)
- `sync_filter` (boolean)
- `time_constant_s` (number)
- `timestamp` (string)

### `set_amplitude` (~64 tokens)

Set Amplitude

Set the SINE OUT amplitude (V rms), which drives the sample or excitation circuit.
Refused above the `max_amplitude_v` safety limit. Tell the user the new drive level first.

Input parameters:

- `amplitude_v` (number, required): Sine output amplitude in V rms

Output parameters:

- `coupling` (string)
- `dynamic_reserve`: SR810/SR830 only
- `filter_slope_db_oct` (integer)
- `harmonic` (integer)
- `input_configuration` (string): A, A-B, I_1MOhm or I_100MOhm
- `input_range_v`: SR86x voltage input range
- `model` (string)
- `phase_deg` (number)
- `reference_frequency_hz` (number)
- `reference_source` (string)
- `sensitivity` (number): Full-scale sensitivity (V, or A on a current input)
- `sensitivity_unit` (string)
- `settle_time_s` (number): Time to settle to 99 % after a change (manual table)
- `shield` (string)
- `sine_amplitude_v` (number): Sine output amplitude, V rms
- `sine_dc_level_v`: Sine output DC level (SR86x only)
- `sync_filter` (boolean)
- `time_constant_s` (number)
- `timestamp` (string)

### `set_amplitude_minimum` (~86 tokens)

Set Amplitude Minimum

Turn the sine output down to the instrument minimum (the lock-in's closest thing to
'output off') and stop any running frequency sweep. SR810/SR830: 4 mV rms (it cannot go to
zero - disconnect the cable if the sample must see no drive). SR86x: 1 nV rms and DC level 0 V.

### `set_sensitivity` (~117 tokens)

Set Sensitivity

Set the sensitivity (full-scale range). The smallest available range that is at least
\`full_scale` is chosen, so a signal of that size does not overload. On SR810/SR830 the dynamic
reserve can be set at the same time.

Input parameters:

- `dynamic_reserve`: SR810/SR830 only: dynamic reserve mode
- `full_scale` (number, required): Largest signal to measure without overload
- `unit` (string): V for voltage inputs; A for current inputs (1 V <-> 1 µA)

Output parameters:

- `coupling` (string)
- `dynamic_reserve`: SR810/SR830 only
- `filter_slope_db_oct` (integer)
- `harmonic` (integer)
- `input_configuration` (string): A, A-B, I_1MOhm or I_100MOhm
- `input_range_v`: SR86x voltage input range
- `model` (string)
- `phase_deg` (number)
- `reference_frequency_hz` (number)
- `reference_source` (string)
- `sensitivity` (number): Full-scale sensitivity (V, or A on a current input)
- `sensitivity_unit` (string)
- `settle_time_s` (number): Time to settle to 99 % after a change (manual table)
- `shield` (string)
- `sine_amplitude_v` (number): Sine output amplitude, V rms
- `sine_dc_level_v`: Sine output DC level (SR86x only)
- `sync_filter` (boolean)
- `time_constant_s` (number)
- `timestamp` (string)

### `set_time_constant` (~103 tokens)

Set Time Constant

Set the output filter time constant (nearest available value), and optionally the filter
slope and synchronous filter. The SR830 may raise a too-short time constant to its minimum for
the current slope/reserve; the returned settings show the value actually used.

Input parameters:

- `filter_slope_db_oct`: Low-pass filter slope in dB/octave
- `sync_filter`: Synchronous filter on/off
- `time_constant_s` (number, required): Output filter time constant

Output parameters:

- `coupling` (string)
- `dynamic_reserve`: SR810/SR830 only
- `filter_slope_db_oct` (integer)
- `harmonic` (integer)
- `input_configuration` (string): A, A-B, I_1MOhm or I_100MOhm
- `input_range_v`: SR86x voltage input range
- `model` (string)
- `phase_deg` (number)
- `reference_frequency_hz` (number)
- `reference_source` (string)
- `sensitivity` (number): Full-scale sensitivity (V, or A on a current input)
- `sensitivity_unit` (string)
- `settle_time_s` (number): Time to settle to 99 % after a change (manual table)
- `shield` (string)
- `sine_amplitude_v` (number): Sine output amplitude, V rms
- `sine_dc_level_v`: Sine output DC level (SR86x only)
- `sync_filter` (boolean)
- `time_constant_s` (number)
- `timestamp` (string)

### `set_input` (~114 tokens)

Set Input

Configure the signal input: A / A-B / current, AC or DC coupling, shield float/ground and
(SR86x) the voltage input range. Use DC coupling below ~160 mHz. Omitted parameters are left
unchanged.

Input parameters:

- `configuration`: Single-ended A, differential A-B, or current input with 1 MΩ / 100 MΩ gain
- `coupling`: Input coupling
- `input_range_v`: SR86x voltage input range
- `shield`: Input shield grounding

Output parameters:

- `coupling` (string)
- `dynamic_reserve`: SR810/SR830 only
- `filter_slope_db_oct` (integer)
- `harmonic` (integer)
- `input_configuration` (string): A, A-B, I_1MOhm or I_100MOhm
- `input_range_v`: SR86x voltage input range
- `model` (string)
- `phase_deg` (number)
- `reference_frequency_hz` (number)
- `reference_source` (string)
- `sensitivity` (number): Full-scale sensitivity (V, or A on a current input)
- `sensitivity_unit` (string)
- `settle_time_s` (number): Time to settle to 99 % after a change (manual table)
- `shield` (string)
- `sine_amplitude_v` (number): Sine output amplitude, V rms
- `sine_dc_level_v`: Sine output DC level (SR86x only)
- `sync_filter` (boolean)
- `time_constant_s` (number)
- `timestamp` (string)

### `auto_phase` (~51 tokens)

Auto Phase

Run Auto Phase (APHS): shift the reference phase so that Y ≈ 0 and X ≈ R. The outputs then
need several time constants to settle. Does nothing if the phase is unstable.

Output parameters:

- `coupling` (string)
- `dynamic_reserve`: SR810/SR830 only
- `filter_slope_db_oct` (integer)
- `harmonic` (integer)
- `input_configuration` (string): A, A-B, I_1MOhm or I_100MOhm
- `input_range_v`: SR86x voltage input range
- `model` (string)
- `phase_deg` (number)
- `reference_frequency_hz` (number)
- `reference_source` (string)
- `sensitivity` (number): Full-scale sensitivity (V, or A on a current input)
- `sensitivity_unit` (string)
- `settle_time_s` (number): Time to settle to 99 % after a change (manual table)
- `shield` (string)
- `sine_amplitude_v` (number): Sine output amplitude, V rms
- `sine_dc_level_v`: Sine output DC level (SR86x only)
- `sync_filter` (boolean)
- `time_constant_s` (number)
- `timestamp` (string)

### `auto_gain` (~47 tokens)

Auto Gain

Pick the sensitivity automatically for the present signal (SR830 AGAN / SR86x ASCL).
On the SR830 AGAN does nothing when the time constant is longer than 1 s.

Output parameters:

- `coupling` (string)
- `dynamic_reserve`: SR810/SR830 only
- `filter_slope_db_oct` (integer)
- `harmonic` (integer)
- `input_configuration` (string): A, A-B, I_1MOhm or I_100MOhm
- `input_range_v`: SR86x voltage input range
- `model` (string)
- `phase_deg` (number)
- `reference_frequency_hz` (number)
- `reference_source` (string)
- `sensitivity` (number): Full-scale sensitivity (V, or A on a current input)
- `sensitivity_unit` (string)
- `settle_time_s` (number): Time to settle to 99 % after a change (manual table)
- `shield` (string)
- `sine_amplitude_v` (number): Sine output amplitude, V rms
- `sine_dc_level_v`: Sine output DC level (SR86x only)
- `sync_filter` (boolean)
- `time_constant_s` (number)
- `timestamp` (string)

### `auto_range` (~42 tokens)

Auto Range

Optimise the input stage for the present signal: SR830 Auto Reserve (ARSV) or SR86x
Auto Range of the voltage input range (ARNG).

Output parameters:

- `coupling` (string)
- `dynamic_reserve`: SR810/SR830 only
- `filter_slope_db_oct` (integer)
- `harmonic` (integer)
- `input_configuration` (string): A, A-B, I_1MOhm or I_100MOhm
- `input_range_v`: SR86x voltage input range
- `model` (string)
- `phase_deg` (number)
- `reference_frequency_hz` (number)
- `reference_source` (string)
- `sensitivity` (number): Full-scale sensitivity (V, or A on a current input)
- `sensitivity_unit` (string)
- `settle_time_s` (number): Time to settle to 99 % after a change (manual table)
- `shield` (string)
- `sine_amplitude_v` (number): Sine output amplitude, V rms
- `sine_dc_level_v`: Sine output DC level (SR86x only)
- `sync_filter` (boolean)
- `time_constant_s` (number)
- `timestamp` (string)

### `frequency_sweep` (~211 tokens)

Frequency Sweep

Step the internal reference (and SINE OUT drive) from start_hz to stop_hz, waiting for the
output filter to settle at each point, and record X/Y/R/θ vs frequency - e.g. a resonance or
transfer-function measurement. The drive amplitude stays at its present value. Needs the
internal reference. The estimated duration must be within `max_sweep_duration_s`;
\`set_amplitude_minimum` stops a running sweep. `save_path` must be a new .csv file.

Input parameters:

- `log_spacing` (boolean): Logarithmic instead of linear spacing
- `points` (integer): Number of frequencies
- `restore_frequency` (boolean): Return to the starting frequency afterwards
- `save_path`: Optional CSV file for the full sweep
- `settle_time_constants`: Wait per point in time constants (default: 99 % settling for the slope)
- `start_hz` (number, required): First frequency
- `stop_hz` (number, required): Last frequency

Output parameters:

- `amplitude_v` (number): Sine amplitude used for the whole sweep
- `completed` (boolean): False if stopped early (by `set_amplitude_minimum` or the time budget)
- `count` (integer)
- `duration_s` (number)
- `peak_frequency_hz`: Frequency of the largest R (null if no point was measured)
- `peak_r`
- `points` (array)
- `saved_to`
- `settle_time_per_point_s` (number)
- `started` (string)
- `time_constant_s` (number)
- `unit` (string)
- `warnings` (array)

## Diagnostics

Captured diagnostic sections: Provenance, Install scripts, Dependencies. The full working is on the page: https://verifymcp.io/servers/k-dense-ai-labmcp-srs-lockin/labmcp-srs-lockin#diagnostics

## Score history

- 2026-09-30: 69
- 2026-09-29: 69
- 2026-09-28: 68
- 2026-09-27: 72
- 2026-09-26: 72

## Common questions

### What is the SRS Lock-in Amplifier MCP server?

SRS Lock-in Amplifier is an MCP server listed in the public MCP registry as io.github.K-Dense-AI/labmcp-srs-lockin. MCP server for Stanford Research Systems lock-in amplifiers (SR810/SR830, SR860/SR865A). This page covers its PyPI package (labmcp-srs-lockin).

### Is the SRS Lock-in Amplifier MCP server safe to use?

SRS Lock-in Amplifier scores 69 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 30 September 2026. 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 SRS Lock-in Amplifier MCP server expose?

SRS Lock-in Amplifier exposes 15 tools: get_connection_info, get_command_log, reconnect, read_outputs, get_settings, and 10 more. Their descriptions and schemas cost roughly 1,188 tokens of context every time the server is loaded.

### Is the SRS Lock-in Amplifier MCP server still maintained?

SRS Lock-in Amplifier is still listed as active in the MCP registry. We last reached this channel on 30 September 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 SRS Lock-in Amplifier MCP server under?

SRS Lock-in Amplifier declares the 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

- PyPI project: https://pypi.org/project/labmcp-srs-lockin/
- Socket report: https://socket.dev/pypi/package/labmcp-srs-lockin
- Repository: https://github.com/K-Dense-AI/lab-instrument-mcps
- Website: https://github.com/K-Dense-AI/lab-instrument-mcps/tree/main/servers/physics/srs-lockin
- Changelog RSS feed: https://verifymcp.io/servers/k-dense-ai-labmcp-srs-lockin/labmcp-srs-lockin.xml
- Changelog JSON feed: https://verifymcp.io/servers/k-dense-ai-labmcp-srs-lockin/labmcp-srs-lockin.json
- HTML version of this page: https://verifymcp.io/servers/k-dense-ai-labmcp-srs-lockin/labmcp-srs-lockin
