Skip to main content
Glama
room-eq-wizard-mcp

room-eq-wizard-mcp

room-eq-wizard-mcp

An MCP server that connects LLMs to Room EQ Wizard (REW): typed control of REW's HTTP API plus local acoustic analysis that reduces measurement data to something a model can reason about.

REW is the DSP engine — sweeps, RT60, averaging, EQ optimization all run inside REW, and this server drives them through the API. What the server adds is the layer REW doesn't have: peak/null detection with Q factors and severity, per-band statistics, before/after comparison, room-mode prediction correlated against measurements, and log-decimated curves sized for an LLM context instead of megabytes of base64.

Requirements

  • Node.js 20+

  • REW 5.40+ running with its API server enabled:

    • macOS: open -a REW.app --args -api

    • Windows: roomeqwizard.exe -api

    • or enable it in REW Preferences → API

  • API-triggered measurement (run_sweep) additionally requires a REW Pro upgrade; every read/analysis/EQ tool works without it.

Related MCP server: Home Assistant MCP Server

Install

// Claude Desktop (claude_desktop_config.json) or any MCP client config
{
  "mcpServers": {
    "rew": {
      "command": "npx",
      "args": ["-y", "room-eq-wizard-mcp"]
    }
  }
}
# Claude Code
claude mcp add rew -- npx -y room-eq-wizard-mcp

The REW API address defaults to http://127.0.0.1:4735; override with the REW_API_URL environment variable if you run REW on another port.

Tools (46)

Area

Tools

Status

status, list_api_commands

Measurements

list_measurements, get_measurement, rename_measurement, delete_measurement, save_all_measurements, load_measurement_files, run_measurement_command, get_measurement_commands

Groups

list_groups, create_group, update_group, delete_group, add_measurements_to_group, get_group_measurements

Data

get_frequency_response, get_rt60, get_distortion

Measuring

run_sweep

Import

import_frequency_response, import_impulse_response, import_frequency_response_data, import_impulse_response_data, import_rta_file, import_sweep_recordings

Signal generator

generator

SPL meter

read_spl

EQ

auto_eq, get_eq_filters, set_eq_filters, get_predicted_response, list_equalisers

Processing

average_measurements, align_spl, arithmetic, smooth_measurement, add_spl_offset

Alignment

align_measurements, create_aligned_sum, get_alignment_state, configure_alignment, run_alignment_command

Analysis

analyze_response, compare_measurements, room_mode_analysis

Typical session: status → run_sweep (or load_measurement_files) → analyze_response → room_mode_analysis with your room dimensions → auto_eq → compare_measurements on the predicted result.

Architecture

src/rew/       the only layer that talks to REW
  codec.ts       base64 big-endian float32 <-> arrays (REW's wire format)
  types.ts       Zod schemas — raw JSON is parsed once at this boundary
  client.ts      HTTP client; enables REW blocking mode once for long commands
src/analysis/  pure functions, no I/O, no mocks needed to test
  spectrum.ts    median-baseline peak/null detection, band stats, decimation
  room-modes.ts  rectangular-room modes, Schroeder frequency, correlation
src/tools/     MCP tools as data: one ToolDef type, one registration loop

Two properties worth knowing:

  • Everything REW computes stays REW's job. RT60, averaging, EQ matching are invoked via the API, never reimplemented — the numbers you get through this server match what the REW GUI shows.

  • Long commands use REW's blocking mode, enabled once per session. A sweep or EQ match returns when it finishes (client timeout 180 s). Note the blocking setting persists in REW across restarts.

Development

pnpm install
pnpm test        # unit suite (mocked HTTP) + live suite that self-skips without REW
pnpm build
pnpm typecheck

With REW running (-api), the live integration tests in src/rew/live.integration.test.ts activate automatically.

Credits

Design informed by two earlier REW MCP servers: koltyj/REW-mcp (analysis depth, typed client patterns) and KevinMeinon/rew-mcp-server (API coverage philosophy and field-tested REW payload shapes, plus its excellent REW API reference doc). REW itself is © John Mulcahy.

License

MIT

Available Tools

46 tools
add_measurements_to_groupA

Place one or more measurements in an existing group. Returns the UUIDs of the measurements added.

Inputs: group (required), measurements (required).

add_spl_offsetA

Shift a measurement's SPL level by a fixed offset in dB (changes the measurement in place).

Inputs: offsetDb (required), measurement (required).

align_measurementsA

Phase-align measurement B to measurement A at a frequency (typically the crossover) using REW's alignment tool, and report the delay REW computed for B. The standard sub-to-main time alignment: A is the reference (mains), B is the one being delayed (sub). The result stays in the alignment tool's preview state — follow with create_aligned_sum for the summed measurement, or apply the reported delay in your DSP.

Inputs: measurementA (required), measurementB (required), invertB, frequencyHz, +2 more.

align_splA

Align the SPL of several measurements to a target level (or to their average) around a centre frequency — level-matching before comparison or averaging.

Inputs: measurements (required), targetDb, frequencyHz, spanOctaves.

analyze_responseA

Interpret a measurement's frequency response: per-band levels, flatness, and detected peaks and nulls with frequency, deviation, Q, and severity. The primary tool for answering 'what is wrong with this response?'

Inputs: measurement (required), windowOctaves, minDeviationDb.

arithmeticA

Trace arithmetic on a pair of measurements (first = A, second = B): division for transfer functions, subtraction for difference curves, inversion for correction curves, etc. Produces a new measurement.

Inputs: operation (required), measurementA (required), measurementB (required), maxGainDb, +2 more.

auto_eqA

Run REW's automatic EQ for a measurement: sets the equaliser model and target, matches the response to the target, and returns the generated filters plus a summary of the predicted corrected response. This is REW's own optimiser — the filters match what the REW GUI would produce.

Inputs: measurement (required), model, shape, hpFreqHz, +3 more.

average_measurementsA

Average several measurements into a new one — the standard way to combine multiple mic positions. Vector average is REW's recommended default for spatial averaging.

Inputs: measurements (required), method.

compare_measurementsA

Compare two measurements (e.g. before/after EQ, left/right symmetry): the A-minus-B difference curve summarised per band, plus the largest divergences. Positive values mean A is hotter.

Inputs: measurementA (required), measurementB (required), maxPoints.

configure_alignmentA

Set any subset of the alignment tool's knobs — measurement pair, mode (Phase/Impulse), frequency, per-side gain/delay/polarity, delay limits — and return the resulting state. For manual what-if adjustments; align_measurements does the standard phase-align in one call.

Inputs: mode, gainADb, gainBDb, invertA, +8 more.

create_aligned_sumA

Create a new measurement containing the sum of the alignment tool's A and B with the current gain/delay/polarity settings applied. Run align_measurements (or configure_alignment) first to set the pair up.

Inputs: no named parameters.

create_groupA

Create a new measurement group, optionally placing measurements in it immediately. Fails if a group with the same name already exists. Returns the group including its UUID.

Inputs: name (required), notes, measurements.

delete_groupA

Delete one measurement group by UUID. There is no confirmation and no undo — REW deletes immediately. The group's measurements are not deleted.

Inputs: group (required).

delete_measurementA

Delete one measurement from REW. There is no confirmation and no undo — REW deletes immediately.

Inputs: measurement (required).

generatorA

Control REW's signal generator. Applies whichever settings are provided (signal, level, frequency), then optionally starts or stops playback. Call with only { play: true } / { play: false } to toggle playback of the current signal.

Inputs: play, signal, levelDbfs, frequencyHz.

get_alignment_stateA

Read the alignment tool's full state: mode, frequency, the A/B measurement indices, per-side gain/delay/polarity, delay limits, plus the modes and commands this REW version accepts.

Inputs: no named parameters.

get_distortionA

Get a measurement's distortion data (THD and harmonics) as a table. Only meaningful for measurements captured with distortion analysis (swept sine).

Inputs: measurement (required), ppo, unit.

get_eq_filtersA

Read the EQ filter bank REW holds for a measurement (type, frequency, gain, Q, enabled per filter).

Inputs: measurement (required).

get_frequency_responseA

Get a measurement's frequency response as a log-spaced curve, decimated to a readable number of points, plus summary statistics. For interpretation (peaks/nulls/band balance) prefer analyze_response.

Inputs: measurement (required), maxPoints, smoothing.

get_group_measurementsA

List the measurements currently in a group, as measurement summaries.

Inputs: group (required).

get_measurementA

Get the full summary of one measurement (all metadata REW holds for it).

Inputs: measurement (required).

get_measurement_commandsA

List the commands REW accepts for a specific measurement.

Inputs: measurement (required).

get_predicted_responseA

Summary of the predicted frequency response after applying the measurement's current EQ filters (REW's prediction, not a re-measurement).

Inputs: measurement (required).

get_rt60A

Generate and read RT60 / ISO 3382 decay parameters (EDT, T20, T30, Topt) per octave or one-third-octave band. Requires the measurement to have an impulse response (swept measurements do).

Inputs: measurement (required), octaveFraction.

import_frequency_responseA

Import a text frequency response file (lines of frequency, SPL/impedance, optional phase) into REW as a new measurement. For native .mdat files use load_measurement_files instead.

Inputs: filePath (required).

import_frequency_response_dataA

Create a REW measurement from in-memory frequency response data: log-spaced magnitude values (dB SPL, or ohms for impedance) starting at startFreqHz with pointsPerOctave resolution, plus optional phase.

Inputs: name (required), magnitude (required), startFreqHz (required), pointsPerOctave (required), +2 more.

import_impulse_responseA

Import an impulse response file (e.g. WAV) into REW; each imported channel becomes a measurement.

Inputs: filePath (required), channels.

import_impulse_response_dataA

Create a REW measurement from an in-memory impulse response: raw sample values at a given sample rate.

Inputs: name (required), samples (required), sampleRate (required), applyCal, +2 more.

import_rta_fileA

Import an audio file through REW's RTA, producing an RTA measurement of its spectrum.

Inputs: filePath (required), channel.

import_sweep_recordingsA

Import a recorded sweep as a measurement: set the sweep stimulus file, then import the recorded response file. Each imported channel becomes a measurement, as if REW had measured it live.

Inputs: responsePath (required), stimulusPath (required), channels.

list_api_commandsC

List the raw commands a REW endpoint area accepts (application, measurements, measure, generator, rta, or a specific measurement's commands). Useful to discover REW capabilities not covered by a dedicated tool.

Inputs: area (required).

list_equalisersB

List the equaliser hardware models REW can generate filters for.

Inputs: manufacturer.

list_groupsA

List all measurement groups in REW, with UUID, name, and notes. Group UUIDs are the only stable way to reference a group in other tools.

Inputs: no named parameters.

list_measurementsA

List all measurements currently loaded in REW, with UUID, index, title, notes, date, and frequency range. UUIDs are the stable way to reference a measurement in other tools.

Inputs: no named parameters.

load_measurement_filesA

Load one or more .mdat measurement files into REW. Returns the measurements that appeared.

Inputs: paths (required).

read_splA

Read the current sound pressure level from REW's SPL meter (SPL, Leq, SEL). Starts the meter, waits for it to integrate, reads, and optionally stops it. Play a signal (see the generator tool) to measure playback level.

Inputs: filter, stopAfter, weighting, settleSeconds.

rename_measurementA

Change a measurement's title and/or notes.

Inputs: measurement (required), notes, title.

room_mode_analysisA

Predict rectangular-room standing-wave modes from room dimensions, and optionally correlate them with the measured peaks/nulls of a measurement to identify which response problems are modal (EQ can tame modal peaks; modal nulls need placement or treatment).

Inputs: widthM (required), heightM (required), lengthM (required), maxHz, +2 more.

run_alignment_commandA

Run a raw alignment tool command (discover names with get_alignment_state's availableCommands). Escape hatch for commands without a dedicated tool, e.g. impulse-mode alignment or 'Aligned copy'. Extra parameters merge into the command body at the top level.

Inputs: command (required), parameters.

run_measurement_commandA

Run a raw REW command on one measurement (discover names with list_api_commands / the measurement's own command list). Escape hatch for operations without a dedicated tool, e.g. 'Trim IR to windows' or 'Estimate IR delay'.

Inputs: command (required), measurement (required), parameters.

run_sweepA

Configure and run a swept-sine SPL measurement. Requires REW's audio input/output to be configured and a REW Pro license for API-triggered measurement. Blocks until the sweep completes and returns the new measurement.

Inputs: name, notes, length, endFreqHz, +2 more.

save_all_measurementsA

Save every loaded measurement to a single .mdat file (overwrites an existing file at that path). Use forward slashes in the path.

Inputs: path (required), note.

set_eq_filtersA

Replace or update individual EQ filters on a measurement. Each entry is one filter slot; fields you omit keep their current value. Use get_eq_filters first to see the slots.

Inputs: filters (required), measurement (required).

smooth_measurementA

Apply fractional-octave smoothing to a measurement (changes the measurement in place).

Inputs: smoothing (required), measurement (required).

statusA

Check the REW API connection and report application state: reachability, measurement count, and any logged errors or warnings. Run this first if other tools fail.

Inputs: no named parameters.

update_groupA

Change a group's name and/or notes.

Inputs: group (required), name, notes.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.6/5.0

    Scored across 46 tools

    Disambiguation5/5

    Each tool has a clearly distinct purpose, even in dense areas like imports (file vs data vs RTA) and alignment (auto, manual, state, raw command). Escape hatches (run_measurement_command, run_alignment_command) are explicitly separated from dedicated tools, preventing misselection.

    Naming Consistency4/5

    The overwhelming majority follow verb_noun (list_*, create_*, import_*, get_*, run_*). A few exceptions (status, generator, arithmetic, auto_eq, room_mode_analysis) break the pattern, but they are memorable and not confusing.

    Tool Count2/5

    46 tools is well above the 25-tool threshold and feels heavy even for a complex REW wrapper. Many could be consolidated (e.g., import_* variants, raw command escape hatches), making the surface harder for an agent to navigate.

    Completeness5/5

    The tool set covers the full measurement lifecycle (create/import/load/save/delete), analysis (FR, RT60, distortion, response interpretation), EQ (auto EQ, filters, prediction), alignment, groups, SPL, and generator control. Raw command tools act as a catch-all, leaving no obvious dead ends.

    Maintenance

    ActivitySlowing
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      B
      maintenance
      Provides a control room for inspecting A1 Evo AcoustiX artifacts, operating REW measurement workflows, coordinating calibration presets, and making allowlisted Denon/Marantz receiver changes with backups and verification.
      7
      MIT