Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Description from the maker (original English)
MCP server for EEG/EMG/ECG/PPG boards via BrainFlow (OpenBCI, Muse, Neurosity, Unicorn, BrainBit).
These three are never merged into one score: opinions, measurements and popularity are different things.
We have not written a plain-language summary for this one yet. Below are the facts we read from the registry.
Pick the AI app you use, then copy the settings.
LABMCP_ADDRESS, LABMCP_SIMULATE, LABMCP_READ_ONLY, LABMCP_LIMITSYou need
Which app do you use?
Pick your app above. We remember it, so next time the button says “Install in …”.
Open Claude Desktop → Settings → Developer → Edit Config, and paste this into claude_desktop_config.json
{
"mcpServers": {
"labmcp-brainflow": {
"command": "uvx",
"args": [
"labmcp-brainflow"
],
"env": {
"LABMCP_ADDRESS": "your-value",
"LABMCP_SIMULATE": "your-value",
"LABMCP_READ_ONLY": "your-value",
"LABMCP_LIMITS": "your-value"
}
}
}
}Run this in your terminal
claude mcp add labmcp-brainflow --env LABMCP_ADDRESS=your-value --env LABMCP_SIMULATE=your-value --env LABMCP_READ_ONLY=your-value --env LABMCP_LIMITS=your-value -- uvx labmcp-brainflowFill in the empty values before running it.
Paste into .cursor/mcp.json in your project, or ~/.cursor/mcp.json
{
"mcpServers": {
"labmcp-brainflow": {
"command": "uvx",
"args": [
"labmcp-brainflow"
],
"env": {
"LABMCP_ADDRESS": "your-value",
"LABMCP_SIMULATE": "your-value",
"LABMCP_READ_ONLY": "your-value",
"LABMCP_LIMITS": "your-value"
}
}
}
}Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.
Paste into .vscode/mcp.json in your project
{
"servers": {
"labmcp-brainflow": {
"type": "stdio",
"command": "uvx",
"args": [
"labmcp-brainflow"
],
"env": {
"LABMCP_ADDRESS": "your-value",
"LABMCP_SIMULATE": "your-value",
"LABMCP_READ_ONLY": "your-value",
"LABMCP_LIMITS": "your-value"
}
}
}
}Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.
This one runs on your computer, and ChatGPT can only connect to servers on the internet. Pick another app.
Your choice stays on this device in a cookie; no account needed.
LABMCP_ADDRESS envLABMCP_SIMULATE envLABMCP_READ_ONLY envLABMCP_LIMITS envThese settings are generated from the maker’s registry entry. If the README says otherwise, follow the README.
Runs on your computer; the tool list appears in your AI app after you install it.
We check information anyone can see; we have not read the code. Checks that do not apply are left out of the count. · Checked Nov 7, 2026
The registry name was verified with the GitHub account K-Dense-AI, which owns the repo
We have not read this repo from GitHub yet
We have not read this repo from GitHub yet
This one runs on your computer; there is no internet endpoint
Runs on your computer and uses local settings instead
Runs on your computer; we can only read tool lists from internet endpoints
Compared with every active server in this category in the registry. Stars count only when the publisher owns the repo.
It passed 1 of 1 applicable basic checks. We have not read the code. Before adding a key or token, see what access the server asks for and use a key with only the permissions you need.
The registry does not list a required key, though some servers ask you to sign in on first use.
It runs on your computer. Your AI app starts it when needed, and data does not pass through the maker’s servers (unless it calls an online service itself).
The GitHub repo last changed –, and the latest version (0.1.2) reached the registry 42 days ago.
Apps that support MCP, such as Claude Desktop, Claude Code, Cursor and VS Code. You also need Python (uv) on your computer.
In the same category: Spec Driven Development, Remote Desktop Commander, 好縮 Short
Servers in the same category from other makers, sorted by stars.
Reading a card:★ GitHub starsiThree pillars: reviews · checks · usageiUpdated = latest version published to the registryi
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.
Smart URL shortener: create, tag and track short links on s.gooo.name.
Copied from the maker’s repo as written. PopNx MCP has not reviewed or endorsed it. HTML, images and scripts are removed. Links lead off this site.
Let an AI agent stream, record and analyse EEG, EMG, ECG, EOG, PPG and EDA from the biosensing boards supported by the open-source [BrainFlow](https://brainflow.org) SDK: OpenBCI, Muse, Neurosity, g.tec Unicorn, BrainBit and many more. It covers recording with event markers, EEG band powers and per-electrode signal-quality checks.
Research use only. This is not a medical device. Do not use it to diagnose, monitor or treat anyone. Follow the board manufacturer's safety instructions (battery operation, electrical isolation, skin preparation). This server does not change any of them.
| Package | labmcp-brainflow |
| Instruments | OpenBCI Cyton, Cyton+Daisy, Ganglion, Galea (USB dongle, BLE, WiFi Shield) · Muse 2 / S / S Athena / 2016 · Neurosity Crown / Notion · g.tec Unicorn · BrainBit · Callibri · Enophone · Mentalab Explore · EmotiBit · FreeEEG32/128 · NeuroPawn Knight · Shimmer3 · any other board in BrainFlow's BoardIds |
| Interfaces | USB serial dongle, Bluetooth LE (native or BLED112 dongle), WiFi, vendor SDKs (all through BrainFlow) |
| Protocol | BrainFlow SDK ≥ 5.21: BoardShim, BrainFlowInputParams, DataFilter (User API, Supported Boards, Data Format) |
| Status | 🧪 simulated: tested against BrainFlow's own synthetic board and a built-in fake, not yet verified on hardware. Report a hardware test |
uvx labmcp-brainflow --simulate --check
--simulate runs BrainFlow's own `SYNTHETIC_BOARD`, so the real BrainFlow code path runs: 16 EXG channels at 250 Hz with sine waves at 5, 10, 15 … 80 Hz plus accelerometer, gyro, PPG, EDA and temperature rows. On platforms where BrainFlow's native library can't load, or with --option simulator=fake, a pure-numpy stand-in is used instead. It simulates an 8-channel, 250 Hz EEG headset with 1/f background, posterior alpha at 10 Hz and one badly attached electrode (Fp2, heavy 50 Hz pickup), so the signal-quality check has something to find.
--option board= (or any BrainFlow BoardIds name such as ANT_NEURO_EE_411_BOARD, or a numeric id). The list_supported_boards tool prints this table too.--address. Depending on the board, BrainFlow expects a different BrainFlowInputParams field, and the server fills in the right one:Board (--option board=) | --address is | Required? | Notes |
|---|---|---|---|
cyton, cyton_daisy | serial port of the USB dongle | yes | macOS: use /dev/cu.usbserial-*, not /dev/tty.* |
ganglion (native BLE) | Bluetooth MAC | no (auto-discovery) | FW 2 boards: --option other_info=fw:2 |
ganglion_dongle | serial port of the BLED112 dongle | yes | optional --option mac_address= |
cyton_wifi, cyton_daisy_wifi, ganglion_wifi | WiFi Shield IP (192.168.4.1 in direct mode) | no (SSDP) | --option ip_port= (default 6789) |
muse_2, muse_s, muse_s_athena, muse_2016 | Bluetooth MAC | no | --option serial_number=Muse-XXXX; PPG: --option other_info=p50 (Muse 2) / p61 (Muse S) |
muse_2_bled, muse_s_bled | serial port of the BLED112 dongle | yes | |
crown, notion_1, notion_2 | device serial number | no | same network, broadcast must be allowed |
unicorn, brainbit | device serial number | no | Unicorn: pair with the supplied dongle |
enophone, explore_4, explore_8 | Bluetooth MAC | Linux only | |
emotibit | network broadcast address | no | |
freeeeg32, freeeeg128, neuropawn_knight, shimmer3, ironbci_32 | serial port | yes | |
playback | path of a file saved in BrainFlow format | yes | --option master_board= |
synthetic | nothing | BrainFlow's synthetic board |
For a board that isn't listed, the server infers the field from the address format: COM3 or /dev/… becomes a serial port, AA:BB:… a MAC address, a.b.c.d an IP address, and anything else a serial number. You can also set any field directly with --option serial_port=… / mac_address=… / ip_address=… / serial_number=… / other_info=… / timeout=….
uvx labmcp-brainflow --option board=cyton --address /dev/cu.usbserial-DM00Q0QN --check # macOS
uvx labmcp-brainflow --option board=cyton_daisy --address COM3 --check # Windows uvx labmcp-brainflow --option board=muse_2 --option serial_number=Muse-1A2B --check uvx labmcp-brainflow --option board=unicorn --check
Close other programs that hold the device (OpenBCI GUI, Muse app) first. On Linux, add yourself to the `dialout` group for serial ports.
Claude Code
claude mcp add eeg -- uvx labmcp-brainflow --option board=cyton --address /dev/ttyUSB0
Claude Desktop / Cursor / Windsurf (claude_desktop_config.json, .cursor/mcp.json, …)
{
"mcpServers": { "eeg": { "command": "uvx", "args": ["labmcp-brainflow", "--option", "board=cyton", "--address", "/dev/ttyUSB0"] } } }
With --read-only, the agent can still record and analyse data (a temporary stream is started for each recording) but cannot leave the stream running, insert markers or send configure_board commands. stop_streaming stays available.
| Tool | Kind | Description |
|---|---|---|
configure_board | ⚠️ hazard | Send a raw board-specific command to the firmware through BrainFlow's config_board (e.g. OpenBCI channel settings 'x1060110X', test signals, or Muse presets 'p50'/'p61' to enable PPG). |
get_band_powers | 👁 read | EEG band powers (delta 1-4, theta 4-8, alpha 8-13, beta 13-30, gamma 30-50 Hz) over the most recent window_s seconds: BrainFlow's channel-averaged relative powers plus per-channel absolute (uV^2) and relative powers and the peak frequency. Records a fresh window if not streaming. |
get_board_info | 👁 read | Describe the connected board: channel names by type (EEG/EMG/ECG/EOG share the EXG rows on most boards), sampling rate, available presets (data buffers) and streaming state. |
get_command_log | 👁 read | Return the most recent raw commands sent to / replies received from the instrument (newest last). Useful for debugging and for recording what was done. |
get_connection_info | 👁 read | 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_signal_quality | 👁 read | Check every EXG channel for common electrode problems: flat line (disconnected), railed (amplifier saturated, OpenBCI Cyton boards), strong 50/60 Hz mains noise (poor contact or missing reference), and implausibly high amplitude (movement, muscle, loose electrode). |
insert_marker | 🎛 control | Write an event marker into the data stream at the current sample (for event-related experiments: stimulus onsets, condition changes). Requires start_streaming; markers appear in record results and saved files. |
list_supported_boards | 👁 read | List common BrainFlow boards: the --option board= alias, BrainFlow board id, and which connection detail --address must hold (serial port, Bluetooth MAC, IP address or serial number). Any other BrainFlow BoardIds name or numeric id is accepted too. Does not need a board. |
reconnect | 🛑 safety | Close and re-open the connection to the instrument (e.g. after it was power cycled or a cable was re-plugged). |
record | 👁 read | Record duration_s seconds and return per-channel statistics, event markers and downsampled traces. Uses the live stream if one is running, otherwise starts a temporary one. The full data (every row, full sampling rate) can be written to save_path. stop_streaming ends a recording early. |
start_streaming | 🎛 control | Start continuous acquisition into BrainFlow's ring buffer (the board's radio/LEDs switch on; nothing is applied to the participant). Needed for insert_marker; record then reads from the live stream. Call stop_streaming when finished. |
stop_streaming | 🛑 safety | Stop acquisition (saves battery). A record in progress ends at once with the data acquired so far. Data already in the buffer is kept until the next stream starts or the session is released (reconnect). |
| Limit | Default | Meaning |
|---|---|---|
max_record_duration_s | 60 s | Longest recording or analysis window (record, get_band_powers, get_signal_quality) an agent may request |
Override at launch: --limit max_record_duration_s=600. BrainFlow boards measure; the only tool that can switch on an output (for example an impedance-test current through the electrodes, or the bias drive on a channel) is configure_board, a raw firmware passthrough that is marked as a hazard so MCP clients ask before running it.
average_relative comes from BrainFlow's DataFilter.get_avg_band_powers(apply_filter=True): detrend, 48–52 and 58–62 Hz band-stop, 2–45 Hz band-pass, Welch PSD, then bands of 1–4, 4–8, 8–13, 13–30 and 30–50 Hz averaged over channels and normalised to sum to 1. Per-channel values use detrend, a 50/60 Hz notch and a 1–45 Hz 4th-order zero-phase Butterworth (BrainFlow DataFilter), followed by a Welch PSD (Hann window, 50 % overlap, ≈0.5 Hz bins). Absolute band power is the integrated PSD in µV², and gamma is effectively 30–45 Hz.flat means the raw SD is below 0.5 µV (disconnected); railed means at least 90 % of the ADS1299 input range is used (OpenBCI Cyton family only, using BrainFlow's formula with gain 24, set by --option exg_gain=); line_noise means 50 or 60 Hz power exceeds the whole 1–45 Hz power; high_amplitude means the band-passed RMS is above 100 µV. EMG/ECG recordings will naturally be "high amplitude".preset= to get_board_info and record.start_streaming). You can insert them while record is running. Value 0 is reserved.save_path must be a new file (.csv; .csv, .tsv or .txt for save_format="brainflow"): ~ is expanded, missing folders are created, an existing file is never overwritten, and the path is checked before recording starts. save_format="csv" writes labelled columns for every row. save_format="brainflow" writes DataFilter.write_file output, which you can replay with `--optOnly the beginning is shown; read the rest in the repo