# Q-SYS MCP (npm · qsys-mcp)

Control QSC Q-SYS systems over QRC from AI agents or Claude.

- Trust score: 79/100 (medium)
- Change this week: +33
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

- npm · `qsys-mcp`: 79/100 (this document), [markdown](https://verifymcp.io/servers/reowens-qsys-mcp/qsys-mcp.md), [page](https://verifymcp.io/servers/reowens-qsys-mcp/qsys-mcp)

## Channel facts

- Registry: `npm`
- Package: `qsys-mcp`
- Version: `0.6.0`
- 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-08-03.

- **Supply Chain Security**: 87/100
  - No malware found by supply-chain analysis.
  - Only part of the dependency tree could be resolved (96 of 100), so this covers what we could see, not the whole tree.
  - No install/post-install scripts declared.
  - Only part of the dependency tree could be resolved (96 of 100), so this covers what we could see, not the whole tree.
- **Provenance & Transparency**: 97/100
  - Source repository is publicly reachable at the declared URL.
  - Cryptographically verified build provenance (signed, bound to reowens/qsys-tools).
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 23 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 77/100
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 2601 tokens (~104/item across 25 items; 25 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 23/100
  - Stability observed for 7 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 99% of tool parameters carry a description.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add reowens-qsys-mcp -- npx -y qsys-mcp
```

### Codex

```bash
codex mcp add reowens-qsys-mcp -- npx -y qsys-mcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "reowens-qsys-mcp": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "qsys-mcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add reowens-qsys-mcp --command npx --arg -y --arg qsys-mcp
```

### Hermes

```yaml
mcp_servers:
  reowens-qsys-mcp:
    command: "npx"
    args: ["-y", "qsys-mcp"]
```

### Other

```json
{
  "mcpServers": {
    "reowens-qsys-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "qsys-mcp"
      ]
    }
  }
}
```

## 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-08-02 (score 79, +58)

- [security improvement] Install scripts: unverified → pass
- [security improvement] Provenance: unverified → pass
- [security improvement] Known CVEs: unverified → partial
- [security improvement] Malware scan: unverified → pass
- [security] The attested source repository moved: reowens/qsys-tools
- [functional regression] Security disclosure: fail → unverified
- [functional regression] Tool coverage: 100 → unverified
- [functional improvement] Maintenance: unverified → pass
- [functional improvement] Stability: unverified → 0.20
- [functional improvement] Dependency health: unverified → partial
- [functional improvement] License: unverified → pass
- [functional improvement] Schema quality: unverified → excellent
- [functional improvement] MCP protocol: unverified → pass
- [functional] Licence: MIT

### 2026-08-01 (score 21, +15)

- [functional regression] Dependency health: partial → unverified
- [functional improvement] Tool coverage: unverified → 100

### 2026-07-31 (score 6, 0)

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

### 2026-07-30 (score 6, −40)

- [security regression] Malware scan: pass → unverified
- [functional regression] Tool coverage: 100 → unverified
- [functional] First check of Schema quality: unverified

### 2026-07-27 (score 46)

First indexed and scored.

## MCP tools (25)

### `qsys_connect` (~224 tokens)

Connect to Q-SYS

Connect to a Q-SYS Core or to Q-SYS Designer running in Emulate mode (press F6 in Designer), over the QRC protocol (TCP). For a local emulator use host "127.0.0.1" and port 1710. Must be called before any other tool.

Input parameters:

- `allow_live_writes` (boolean): Permit write tools against a LIVE (non-emulator) Core. Default false: writes are refused unless the target reports IsEmulator=true. Set true only when the user has explicitly approved changing a real…
- `host` (string): Core IP/hostname, or 127.0.0.1 for a local Designer emulator
- `password` (string): Password, if the design requires authentication
- `port` (integer): QRC port (default 1710)
- `reconnect` (boolean): Auto-reconnect on a dropped socket (Core restart, network blip), replaying change-group registrations so polling resumes. Default true.
- `user` (string): Username, if the design requires authentication

### `qsys_status` (~28 tokens)

Q-SYS engine status

Get the Q-SYS engine status: platform, design name, run state, emulator flag.

### `qsys_list_components` (~160 tokens)

List components

List named components in the running/emulated design, with type and properties (Component.GetComponents). On large designs use filter/type/names_only to trim the response. Note: QRC only sees components whose Designer "Script Access" is set to External or All (None is the default) — a component missing here, or one that silently ignores writes, most likely needs its Code Name + Script Access set in Designer.

Input parameters:

- `filter` (string): Case-insensitive substring; only components whose name contains it are returned
- `names_only` (boolean): Return only name + type per component (drop properties) to save context
- `type` (string): Case-insensitive substring on component type (e.g. "gain", "mixer")

### `qsys_get_component_controls` (~93 tokens)

Get component controls

List a named component's controls and current values (Component.GetControls). Use filter/names_only to trim large components.

Input parameters:

- `filter` (string): Case-insensitive substring; only controls whose name contains it are returned
- `name` (string, required): Component name (as returned by qsys_list_components)
- `names_only` (boolean): Return only control names (drop values/positions) to save context

### `qsys_get_control` (~34 tokens)

Get control values

Get the current values of one or more Named Controls (Control.Get).

Input parameters:

- `names` (array, required): Named Control names

### `qsys_get_component` (~43 tokens)

Get specific component control values

Get specific control values within a named component (Component.Get).

Input parameters:

- `controls` (array, required): Control names within the component
- `name` (string, required): Component name

### `qsys_set_control` (~79 tokens)

Set a control value

Set a Named Control value, optionally ramped over a number of seconds (Control.Set). This MUTATES the running/emulated system.

Input parameters:

- `name` (string, required): Named Control name
- `ramp` (number): Ramp time in seconds (optional)
- `value` (number|string|boolean, required): New value (number, string, or boolean)

### `qsys_set_component` (~54 tokens)

Set component control values

Set one or more control values within a named component, each optionally ramped (Component.Set). This MUTATES the running/emulated system.

Input parameters:

- `controls` (array, required)
- `name` (string, required): Component name

### `qsys_load_snapshot` (~85 tokens)

Recall a snapshot

Recall control settings from a saved snapshot bank/number, optionally ramped over seconds (Snapshot.Load). This MUTATES the running/emulated system.

Input parameters:

- `bank` (string, required): Snapshot bank name, as named in Q-SYS Designer
- `number` (integer, required): Snapshot number within the bank (1-based)
- `ramp` (number): Ramp time in seconds (optional)

### `qsys_save_snapshot` (~66 tokens)

Save a snapshot

Capture the current control settings into a snapshot bank/number (Snapshot.Save). This OVERWRITES the stored snapshot.

Input parameters:

- `bank` (string, required): Snapshot bank name, as named in Q-SYS Designer
- `number` (integer, required): Snapshot number within the bank (1-based)

### `qsys_mixer_set_crosspoint` (~259 tokens)

Set mixer crosspoint(s)

Set gain/delay (number, ramped) or mute/solo (boolean) on the crosspoints of an input×output selection (Mixer.SetCrossPoint{Gain,Delay,Mute,Solo}). This MUTATES the running/emulated system. Read mixer state back via qsys_get_component.

Input parameters:

- `inputs` (string, required): Input selector — QRC String Syntax: "*" (all), "1 2 3"/"1,2,3" (list), "1-6" (range), "!3" (negate), combinable ("1-8 !3")
- `name` (string, required): Mixer component name
- `op` (string, required): Which crosspoint property to set
- `outputs` (string, required): Output selector — QRC String Syntax: "*" (all), "1 2 3"/"1,2,3" (list), "1-6" (range), "!3" (negate), combinable ("1-8 !3")
- `ramp` (number): Ramp time in seconds — gain/delay only, ignored otherwise
- `value` (number|boolean, required): Number (dB/seconds) for gain/delay; boolean for mute/solo

### `qsys_mixer_set_input` (~181 tokens)

Set mixer input(s)

Set gain (number, ramped) or mute/solo (boolean) on selected mixer inputs (Mixer.SetInput{Gain,Mute,Solo}). This MUTATES the running/emulated system. Read mixer state back via qsys_get_component.

Input parameters:

- `inputs` (string, required): Input selector — QRC String Syntax: "*" (all), "1 2 3"/"1,2,3" (list), "1-6" (range), "!3" (negate), combinable ("1-8 !3")
- `name` (string, required): Mixer component name
- `op` (string, required): Which input property to set
- `ramp` (number): Ramp time in seconds — gain only, ignored otherwise
- `value` (number|boolean, required): Number (dB) for gain; boolean for mute/solo

### `qsys_mixer_set_output` (~175 tokens)

Set mixer output(s)

Set gain (number, ramped) or mute (boolean) on selected mixer outputs (Mixer.SetOutput{Gain,Mute}). This MUTATES the running/emulated system. Read mixer state back via qsys_get_component.

Input parameters:

- `name` (string, required): Mixer component name
- `op` (string, required): Which output property to set
- `outputs` (string, required): Output selector — QRC String Syntax: "*" (all), "1 2 3"/"1,2,3" (list), "1-6" (range), "!3" (negate), combinable ("1-8 !3")
- `ramp` (number): Ramp time in seconds — gain only, ignored otherwise
- `value` (number|boolean, required): Number (dB) for gain; boolean for mute

### `qsys_mixer_set_cue` (~132 tokens)

Set mixer cue(s)

Set gain (number, ramped) or mute (boolean) on selected mixer cues (Mixer.SetCue{Gain,Mute}). This MUTATES the running/emulated system. Read mixer state back via qsys_get_component.

Input parameters:

- `cues` (string, required): Cue selector (string specification of mixer cues)
- `name` (string, required): Mixer component name
- `op` (string, required): Which cue property to set
- `ramp` (number): Ramp time in seconds — gain only, ignored otherwise
- `value` (number|boolean, required): Number (dB) for gain; boolean for mute

### `qsys_mixer_set_cue_input` (~173 tokens)

Route/monitor input(s) to cue(s)

Enable an input on a cue, or set its AFL (after-fade listen) flag (boolean) (Mixer.SetInputCue{Enable,Afl}). This MUTATES the running/emulated system. Read mixer state back via qsys_get_component.

Input parameters:

- `cues` (string, required): Cue selector (string specification of mixer cues)
- `inputs` (string, required): Input selector — QRC String Syntax: "*" (all), "1 2 3"/"1,2,3" (list), "1-6" (range), "!3" (negate), combinable ("1-8 !3")
- `name` (string, required): Mixer component name
- `op` (string, required): Set cue-input enable, or AFL monitoring
- `value` (number|boolean, required): Boolean

### `qsys_loop_player_start` (~254 tokens)

Start Loop Player playback

Schedule one or more audio files to play on a Loop Player component (LoopPlayer.Start). This MUTATES the running/emulated system. There is no QRC method to browse Core files — pass a file path you already know. Read Loop Player state back via qsys_get_component.

Input parameters:

- `files` (array, required): One file→output assignment per entry (a Files entry carries only name + output; the options below apply to the whole job)
- `log` (boolean): Log start + errors to the Core event log (default false)
- `loop` (boolean): Loop playback continuously (default false)
- `name` (string, required): Loop Player component name (its "Code Name")
- `refId` (string): If set, the Core logs an async failure notification for this job (the notification is not surfaced by these tools yet)
- `seek` (number): Offset into the file to start playback, in seconds (default 0)
- `startTime` (number): -1 = now, -2 = queue after current, ≥0 = absolute time-of-day (s). Omitted → Core default (0). With Time source "None", 0 plays now and >0 has no effect.

### `qsys_loop_player_stop_cancel` (~160 tokens)

Stop or cancel Loop Player playback

Stop current playback on outputs (op "stop"), or cancel a pending/queued future-start job without disrupting current playback (op "cancel") — LoopPlayer.Stop / LoopPlayer.Cancel. Outputs is a list of integer output numbers (e.g. [1, 2]). This MUTATES the running/emulated system.

Input parameters:

- `log` (boolean): Log the stop/cancel to the Core event log (default false)
- `name` (string, required): Loop Player component name (its "Code Name")
- `op` (string, required): "stop" halts current playback; "cancel" aborts a queued future-start job
- `outputs` (array, required): Output track numbers as an integer list, e.g. [1, 2]

### `qsys_create_change_group` (~66 tokens)

Create or extend a change group

Create a change group (or add Named Controls to an existing one) so you can poll for changes (ChangeGroup.AddControl).

Input parameters:

- `controls` (array, required): Named Control names to watch
- `id` (string, required): Change group id (any string; reused on poll)

### `qsys_poll_change_group` (~41 tokens)

Poll a change group

Poll a change group; returns the controls that changed since the last poll (ChangeGroup.Poll).

Input parameters:

- `id` (string, required): Change group id

### `qsys_change_group_add_component` (~76 tokens)

Add component controls to a change group

Add a named component's controls to a change group so you can poll them for changes (ChangeGroup.AddComponentControl).

Input parameters:

- `component` (string, required): Component name
- `controls` (array, required): Control names within the component to watch
- `id` (string, required): Change group id (any string; reused on poll)

### `qsys_destroy_change_group` (~36 tokens)

Destroy a change group

Destroy a change group, freeing its server-side state (ChangeGroup.Destroy).

Input parameters:

- `id` (string, required): Change group id

### `qsys_change_group_remove` (~58 tokens)

Remove controls from a change group

Remove Named Controls from a change group, leaving the group in place (ChangeGroup.Remove). Returns any unknown control names.

Input parameters:

- `controls` (array, required): Named Control names to stop watching
- `id` (string, required): Change group id

### `qsys_change_group_clear` (~36 tokens)

Clear a change group

Remove all controls from a change group without destroying it (ChangeGroup.Clear).

Input parameters:

- `id` (string, required): Change group id

### `qsys_change_group_invalidate` (~57 tokens)

Invalidate a change group

Invalidate a change group so the next poll resends every watched control, not just the changes (ChangeGroup.Invalidate). Handy after a reconnect to force a full snapshot.

Input parameters:

- `id` (string, required): Change group id

### `qsys_disconnect` (~31 tokens)

Disconnect from Q-SYS

Close the QRC connection to the Core/emulator. A later qsys_connect is required before other tools.

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/reowens-qsys-mcp/qsys-mcp#diagnostics

## Score history

- 2026-08-03: 79
- 2026-08-02: 79
- 2026-08-01: 21
- 2026-07-31: 6
- 2026-07-30: 6
- 2026-07-28: 46
- 2026-07-27: 46

## Links

- npm package: https://www.npmjs.com/package/qsys-mcp
- Socket report: https://socket.dev/npm/package/qsys-mcp
- Repository: https://github.com/reowens/qsys-tools
- Changelog RSS feed: https://verifymcp.io/servers/reowens-qsys-mcp/qsys-mcp/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/reowens-qsys-mcp/qsys-mcp/changelog.json
- HTML version of this page: https://verifymcp.io/servers/reowens-qsys-mcp/qsys-mcp
