q-sys-mcp
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@q-sys-mcpSet the main gain to -10 dB with a 2-second ramp."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
q-sys-mcp
Let an AI agent inspect and control a Q-SYS audio/video system over QSC's published QRC protocol — against a real Core or Q-SYS Designer's built-in emulator.
q-sys-mcp is an MCP server. It speaks QSC's QRC external-control protocol (JSON-RPC 2.0 over TCP) — the same interface third-party control systems like Crestron and AMX use — and exposes it to an LLM agent as a set of tools. Point it at a physical Q-SYS Core or at Q-SYS Designer running in Emulate mode and the agent can read meters, flip mutes, ramp gains, and watch controls for changes.
It's a pure wire-protocol client: zero QSC code, no SDK, no hardware required for development. That makes it a clean, sanctioned layer QSC ships on no platform — AI-native control — and it runs anywhere Node does.
Highlights
13 tools covering connect, status, discovery, read, write (with ramps), change-group polling, and disconnect.
No hardware needed — develop entirely against Designer's Emulate-mode soft-core on
localhost.Cross-platform —
node:netonly; CI proves it on Linux, macOS, and Windows × Node 18 & 20.Context-friendly — list/get tools take
filter/names_only/typeso large designs don't flood the agent's context.Safe by default — write tools warn when they're hitting a live Core (not an emulator); a 30 s
NoOpkeepalive holds the socket open through QRC's 60 s idle close.
Related MCP server: Crestron Home MCP Server
Quick start
Run it straight from npm (no install):
npx -y q-sys-mcp # MCP server on stdioOr from source:
git clone https://github.com/reowens/q-sys-mcp.git
cd q-sys-mcp
npm install # builds dist/ via the prepare hook
node dist/index.jsConnect it to your agent
Add it to your MCP client config (Claude Desktop, etc.):
{
"mcpServers": {
"q-sys": {
"command": "npx",
"args": ["-y", "q-sys-mcp"]
}
}
}From a local checkout instead, use "command": "node" with "args": ["/absolute/path/to/q-sys-mcp/dist/index.js"].
Always call qsys_connect first (host 127.0.0.1, port 1710 for a local emulator) before any other tool.
What it can do
Once connected, just ask in natural language — the agent picks the tools.
You: "Connect to my Q-SYS emulator and bring the main gain down to −20 dB over 2 seconds."
The agent runs:
qsys_connect→{ host: "127.0.0.1", port: 1710 }qsys_list_components→{ type: "gain" }— finds theLevelsgain blockqsys_set_component→{ name: "Levels", controls: [{ name: "gain", value: -20, ramp: 2 }] }
Or, if you've exposed that fader as a Named Control in Designer:
qsys_set_control → { name: "MainGain", value: -20, ramp: 2 }To watch a control live (meters, button states), create a change group and poll it:
qsys_create_change_group → { id: "meters", controls: ["MainGain"] }
qsys_poll_change_group → { id: "meters" } // returns only what changed since the last pollTools
Tool | QRC method | Purpose |
| (socket) + | Connect to a Core/emulator |
|
| Engine status (platform, design, run state) |
|
| List named components |
|
| A component's controls + values |
|
| Get Named Control values |
|
| Get specific component control values |
|
| Set a Named Control (with optional ramp) |
|
| Set component controls (with optional ramps) |
|
| Watch Named Controls for changes |
|
| Watch a component's controls |
|
| Get changes since last poll |
|
| Free a change group's server-side state |
| (socket) | Close the connection |
qsys_list_components and qsys_get_component_controls accept optional filter (case-insensitive name substring), names_only, and — for components — type, to trim large designs before they reach the agent's context.
Named Controls vs. components
Q-SYS exposes controls two ways, and the tools mirror that split:
Named Controls (
qsys_get_control/qsys_set_control) reach a control only if it's been explicitly exposed — dragged into the Named Controls pane in Designer with a unique name. Flat namespace, addressed by that one name.Component controls (
qsys_get_component_controls/qsys_get_component/qsys_set_component) reach any control on a component whose parent has a Code Name with Script Access enabled — no per-control naming needed.
If qsys_get_control can't find a name, it almost always means the control hasn't been added to the Named Controls pane.
Requirements
Node.js ≥ 18.
A control target on port 1710:
a real Q-SYS Core with a design loaded and in Run mode, or
Q-SYS Designer in Emulate mode — open a design and press F6 (Save to Design & Run; not F5, which deploys to a physical Core). Connect to
127.0.0.1:1710.
QRC is fully functional in Emulate mode, so you can build and test without any hardware.
Writes mutate the running/emulated system. On an emulator, nothing persists unless you save the design in Designer.
Develop & verify
npm test # offline: QRC integration + MCP-over-mock (no hardware)
npm run smoke -- 127.0.0.1 1710 # read-only smoke against a live emulator/Core
npm run smoke:mcp -- 127.0.0.1 1710 # full MCP-over-stdio smoke against a live target
npm run smoke:write -- 127.0.0.1 1710 # live WRITE round-trip: set a gain, verify, restore
npm run smoke:named -- MainGain # live Named-Control read/set + change-group poll
npm run smoke:keepalive # idle >60s, prove the socket survives QRC's idle closenpm test needs no hardware; every smoke:* script needs a live target (a real Core, or Designer in Emulate mode, on port 1710).
CI runs npm ci && npm run build && npm run typecheck && npm test on Linux, macOS, and Windows × Node 18 & 20 (.github/workflows/ci.yml). The whole suite is hardware-free — a mock QRC server plus an in-memory MCP transport — so the full matrix runs without a Core.
Roadmap / out of scope
WebSocket transport via
@q-sys/qrwc— a convenience adapter for real Cores. Raw QRC is the primary transport today; the lib is still beta.Auto-reconnect — re-dial on socket drop (Core restart / leaving Emulate). Today the agent re-calls
qsys_connect.Design authoring (reading/writing
.qsysfiles) — out of scope:.qsysis a compressed .NETBinaryFormattergraph type-coupled to QSC's assemblies.
Changelog
See CHANGELOG.md for release notes, or the GitHub releases page.
License
MIT — see LICENSE. Q-SYS and QRC are trademarks/protocols of QSC, LLC; this project is an independent client and is not affiliated with or endorsed by QSC.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/reowens/q-sys-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server