Nimbus BCI
Server Details
BCI/EEG toolkit: public MOABB/BNCI datasets, pipeline build/validate, hosted training, BIDS export.
- Status
- Healthy
- Uptime
- 100.0% over the last 24 hours
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- nimbusbci/nimbus-mcp
- GitHub Stars
- 3
- Server Listing
- nimbus-mcp
- ChatGPT
- –
- Claude
- –
TDQS
Scored across 63 tools
Most tools are cleanly separated by namespace and action, especially execution, project, protocol, stream, and calibration operations. A few clusters overlap conceptually, such as data.inspect_dataset vs data.inspect_file vs plots.dataset, or stream.status/stream.telemetry/protocol.session_status, but the descriptions generally clarify which to use.
The tool set uses a highly consistent namespace.lower_snake_case convention with predictable action names. Occasional noun-style tools like execution.artifacts and execution.results are still readable and fit the same pattern.
With 63 tools, the surface is far beyond the typical 3-15 range and even beyond the 25+ 'too many' threshold. Although the platform is broad, this many tools creates substantial selection and context-load burden for an agent.
Coverage is broad and lifecycle-rich across data upload/inspection, pipelines, executions, experiments, projects, protocols, calibration, streaming, leaderboards, stats, and plots. Minor gaps remain, such as no obvious upload-listing or experiment-listing tool, but most workflows have a workable path.
Publisher details
- Operator
- Nimbus BCI · Publisher source
- Operator website
- https://nimbusbci.com/ · Publisher source
- Vendor relationship
- Not applicable
- Documentation
- Not applicable
- Trust center
- https://nimbusbci.com/ · Publisher source
- Restrictions
- Not applicable
Available Tools
63 toolsaccount.whoamiWho Am IARead-onlyIdempotentInspect
Who you are authenticated as: account email, plan (isPro / pioneer), this month's free-run quota, and — with a hosted token — the token name and days until it expires. Call this first when setup guidance appears or to check which credential a session uses. In anonymous Local Free mode there is no account: the response says so (mode/tier) instead of demanding a login.
Inputs: no named parameters. Returns: object
bids.export_datasetExport Dataset as BIDSAIdempotentInspect
Export a Nimbus dataset as a BIDS-layout zip (local: saved to
NIMBUS_EXPORT_DIR/bids/; hosted gateway: inline contentBase64, up to 1 MB).
Continuous sources (EDF/BDF uploads, stream recordings) export as BIDS-raw (EDF byte-passthrough; recordings converted HDF5→EDF with events.tsv). Epoched sources (MOABB packs, trial-table uploads) export as BIDS-derivatives (data passthrough + descriptive trial_index/label/session/run events — no fabricated onsets). The zip embeds nimbus_export_manifest.json with sha256s.
Inputs: dataset (required), kind, subjects. Returns: object
bids.export_executionExport Run as BIDSAIdempotentInspect
Export an execution's results as a BIDS-derivative zip (metrics.json,
per-subject participants.tsv, protocol.json, full pipeline_snapshot.json,
predictions.tsv when stored, provenance/execution.json). Local: saved to
NIMBUS_EXPORT_DIR/bids/. Hosted gateway: inline contentBase64 (up to
1 MB of base64); larger zips point to Nimbus Studio.
Inputs: execution_id (required). Returns: object
calibration.pausePause CalibrationAInspect
Pause a running calibration between trials (cues hold; resume anytime).
Inputs: execution_id (required). Returns: object
calibration.resumeResume CalibrationBInspect
Resume a paused calibration session.
Inputs: execution_id (required). Returns: object
calibration.startStart CalibrationAInspect
Start a guided subject calibration session (NON-BLOCKING; confirm-gated — the device goes on a human's head). The Nimbus Studio app shows the cues on its calibration dashboard automatically; poll calibration.status. Requires a Pro plan (hosted token or Pro session): calibration nodes and custom-data training are gated by the freemium node policy; local X-MCP-Key principals pass only when the desktop app flags the signed-in Pro session (MCP_LOCAL_IS_PRO).
Inputs: name, port, classes, confirm, +10 more. Returns: object
calibration.statusCalibration StatusARead-onlyIdempotentInspect
Live snapshot of a calibration session (phase, current trial, progress, paused). Once complete, carries the recorded upload — call calibration.train to turn it into the subject's own classifier.
Inputs: execution_id (required). Returns: object
calibration.trainTrain Calibration ModelAInspect
Train the subject's own classifier from a COMPLETED calibration session (NON-BLOCKING). Fetches the recorded upload, wires it into a train pipeline as a custom_data source, and starts the run. Requires a Pro plan (custom_data training is freemium-gated). The calibrate→train handoff resolves on every backend, desktop-local included; only recordings made before the desktop execution-linkage build resolve no upload — rerun calibration.start for those.
Inputs: execution_id (required), name, paradigm, template_id, +1 more. Returns: object
catalog.datasetsList DatasetsCRead-onlyIdempotentInspect
Curated public EEG datasets (MOABB packs) available to pipelines.
Inputs: only_on_disk. Returns: object
catalog.leaderboardLeaderboardARead-onlyIdempotentInspect
Public benchmark leaderboard: pipeline rankings per dataset.
Two tracks: the top-level within_session block (curated suite
pipelines) and crossSubject (leave-one-subject-out — curated
pipelines plus BYO python_model submissions; BYO rows carry
kind: "byo" and an owner name). Within each dataset, rows
sort desc by meanAccuracyPct (95% CI in ciLoPct/ciHiPct).
packFingerprint identifies the exact dataset pack behind the
scores; updated marks each dataset's most recent run. The
pretrainedFewTrial efficiency track means: accuracy at a
protocol-fixed 100-trials-per-subject budget — the frozen-backbone /
few-parameter rows that matter when calibration data is scarce
(paramsTrained shown per row so cost is readable next to
accuracy). submittableDatasets is the set open for
leaderboard.submit; a dataset can appear under crossSubject
and still be closed for new submissions.
Inputs: dataset_id. Returns: object
catalog.nodesList Pipeline NodesARead-onlyIdempotentInspect
List Nimbus pipeline node types (data, preprocessing, features, models...).
Use catalog.node_schema(node_type) for one node's full config schema and ports.
Inputs: category. Returns: object
catalog.node_schemaNode Config SchemaBRead-onlyIdempotentInspect
Full config JSON schema + input/output ports for one node type.
Inputs: node_type (required). Returns: object
catalog.templateGet Pipeline TemplateARead-onlyIdempotentInspect
Full template incl. the 'train' execGraph needed by execution.run/pipeline.validate.
Inputs: template_id (required). Returns: object
catalog.templatesList Pipeline TemplatesARead-onlyIdempotentInspect
List built-in starter pipelines (MI/P300/SSVEP...).
catalog.template(id) returns the graph. Each row carries datasetId
(catalog id, e.g. "BNCI2014_001" — the id catalog.leaderboard and
catalog.datasets use) and paradigm when the template loads a public dataset.
Inputs: dataset, paradigm. Returns: object
data.delete_uploadDelete UploadADestructiveInspect
Delete an uploaded file from your account (disk + registry).
Requires confirm=True. Pass the path returned by data.upload (file.path). Only your own uploads can be deleted; missing paths return not-found.
Inputs: path (required), confirm. Returns: object
data.inspect_datasetInspect DatasetARead-onlyIdempotentInspect
Exploratory summary of a public EEG dataset (MOABB pack): channels, sampling rate, trial/class balance, per-channel µV stats, band powers and a PSD overview.
Look at the data BEFORE building pipelines: class balance drives
stratification choices (imbalanced classes skew accuracy), and
flatlined channels mean a montage/reference problem worth fixing
first. subject defaults to the dataset's catalog defaultSubject
(see catalog.datasets), e.g. "S01"; a comma-list like
"S01,S03" loads a cohort. mode: training | evaluation | all.
Units note: values are ASSUMED volts by the loader — a µV-native file
reads 1e6x too large; set unitsScale in a pipeline's custom_data
config when needed.
Inputs: dataset (required), mode, subject. Returns: object
data.inspect_fileInspect Data FileARead-onlyIdempotentInspect
Exploratory summary of an EEG file (.edf/.bdf/.mat/.csv/.tsv/.txt/.h5): channels, sampling rate, trial/class balance, per-channel µV stats, band powers and a PSD overview.
The path shape picks the source: ABSOLUTE path → read the file from disk (only on a LOCAL backend: desktop app / MCP local mode — no upload needed); RELATIVE path (the one data.upload returns) → describe the uploaded file, which works on ANY backend (hosted or local).
Look at the data BEFORE building pipelines: class balance drives stratification choices, and flatlined channels mean a montage/reference problem worth fixing first. Units note: values are ASSUMED volts by the loader — a µV-native CSV reads 1e6x too large; set unitsScale in a pipeline's custom_data config when needed. On a hosted backend absolute paths are refused with an error that explains how to proceed (upload the file first or switch to a local backend).
CSV/TSV/TXT files have no embedded sampling rate: pass sampling_rate (Hz) for them — the backend never assumes 250 Hz. Formats that embed their rate (EDF/BDF/MAT/H5) ignore it.
Inputs: path (required), sampling_rate. Returns: object
data.uploadUpload Data FileAInspect
Upload an EEG file (.edf/.bdf/.mat/.csv/.txt/.tsv/.h5/.hdf5, <=500MB) to the backend and get the registered path for a custom_data node.
sampling_rate (Hz, e.g. 250.0) is REQUIRED for plain CSV/TSV/TXT files without embedded metadata — uploads without it are rejected (no silent 250 Hz assumption). format overrides extension-based detection (auto, mat, csv, tsv, txt, edf, bdf, h5, hdf5).
Inputs: file_path (required), format, dataset_name, sampling_rate. Returns: object
device.listList EEG DevicesBRead-onlyIdempotentInspect
EEG devices supported by this backend (OpenBCI, Muse, BrainBit, LSL, PiEEG...).
Inputs: no named parameters. Returns: object
device.testTest EEG DeviceARead-onlyIdempotentInspect
Test a device connection WITHOUT starting a stream (safe, no confirm needed).
Inputs: device_type (required), port, ip_port, source_id, +5 more. Returns: object
execution.artifactsList Run ArtifactsCRead-onlyIdempotentInspect
Trained artifacts (models/filters, e.g. *.pkl) saved by an execution.
Inputs: execution_id (required). Returns: object
execution.cancelCancel RunBDestructiveInspect
Cancel a running execution.
Inputs: execution_id (required). Returns: object
execution.deleteDelete RunADestructiveInspect
Permanently delete one of your finished runs (completed/failed/cancelled) with its results. Running runs must be cancelled first (409 nimbus.execution.delete_not_terminal). Owner only.
Inputs: execution_id (required), confirm. Returns: object
execution.download_artifactDownload Run ArtifactAIdempotentInspect
Download one artifact file.
Local/stdio: saved to NIMBUS_EXPORT_DIR/executions// and its path returned.
Hosted gateway: returned inline as contentBase64 (up to 1 MB of base64);
larger files point to Nimbus Studio. Nothing is written on the gateway.
Inputs: execution_id (required), artifact_name (required). Returns: object
execution.getGet RunARead-onlyIdempotentInspect
Execution status summary (status: running/completed/failed/cancelled).
Summary fields: dataset is the human-readable display label
(e.g. "BCIIV2a"); datasetId is the catalog id (e.g. "BNCI2014_001")
accepted by other tools (data.inspect_dataset, public_data.dataset).
title is the run name shown in Studio.
Inputs: execution_id (required). Returns: object
execution.listList RunsCRead-onlyIdempotentInspect
Recent executions. Optional status filter (running/completed/failed/cancelled).
Per-run fields: dataset is the human-readable display label
(e.g. "BCIIV2a"); datasetId is the catalog id (e.g. "BNCI2014_001")
accepted by other tools (data.inspect_dataset, public_data.dataset).
title is the run name shown in Studio.
Inputs: limit, status. Returns: object
execution.resultsRun ResultsARead-onlyIdempotentInspect
Metrics for a completed run. Trimmed by default (accuracy, kappa, ITR, confusion matrix, per-class); full=True returns the complete result object.
Inputs: execution_id (required), full. Returns: object
execution.runRun PipelineAInspect
Start a pipeline run (NON-BLOCKING). Returns executionId — poll with
execution.get() until status is completed/failed, then execution.results().
If an identical graph is already running for you, the run still starts but
the response carries a warning + duplicateOf ids (cancel one with
execution.cancel to avoid paying twice).
The server runs a limited number of executions at once (3 by default); when
all slots are busy the call fails immediately with 429
nimbus.execution.queue_full and a retryAfter (seconds) — wait, then retry.
Inputs: train_graph (required), name, layout, subject, +1 more. Returns: object
experiment.deleteDelete ExperimentADestructiveInspect
Delete one of your experiment records (server + this machine's local cache). Its individual runs are kept — delete them with execution.delete. A still-running experiment cannot be deleted.
Inputs: experiment_id (required), confirm. Returns: object
experiment.getGet ExperimentCRead-onlyIdempotentInspect
Experiment snapshot: status (running/completed/failed), per-run rows
({name, executionId, status, error?, metrics?, evaluationKind?}) and,
once finished, aggregates over completed runs only: per-metric
{mean, std, best, n}, plus pooledExecutionIds / pooledRunNames
/ kindBreakdown (per-subject vs LOSO etc. — each row has kind, n,
mean, std, executionIds, runNames; #470). Pooled headline means are
unchanged; kindBreakdown labels what was pooled. std is population;
None below 2 values. kindBreakdown is always present when aggregates
exist (including single-kind experiments).
PORTABILITY: experiment records are stored on the Nimbus server under your account, so any entry point (local stdio, hosted gateway, another machine) signed in with the same account/token can read them; the serving process and the local ~/.nimbus/experiments store remain as fast-path caches. Experiments run before server-side storage landed exist only in the origin machine's local store and read as unknown elsewhere (#518).
Inputs: experiment_id (required). Returns: object
experiment.runRun ExperimentAInspect
Run 1-25 pipelines as ONE paced experiment (NON-BLOCKING). Returns an experimentId immediately; a background thread submits at most 2 runs at a time (min(max_concurrent, 2)), retries queue-full up to 3 times per run, and polls each execution to completion. Poll experiment.get() for per-run status and, once finished, aggregated metrics.
PORTABILITY: the experiment record is written through to the Nimbus server under your account (at start and at completion), so experiment.get works from ANY entry point — local stdio, hosted gateway, another machine — signed in with the same account/token. If the server is unreachable when the experiment starts it still runs and polls locally, but other entry points cannot read it until a write-through succeeds (#518).
Inputs: runs (required), max_concurrent. Returns: object
foundation.compareCompare Foundation BackbonesARead-onlyIdempotentInspect
Run every available pretrained backbone on YOUR data and see which wins — a ranked bar chart with CI whiskers, params, and wall time per backbone. Backbones that can't process your data (window size, channel count) are noted, not silently skipped. Each backbone embeds your trials frozen (the exact foundation_features preprocessing), a LDA is cross-validated on the embeddings. Returns a PNG image PLUS a JSON text block (and structuredContent.meta.results) with per-backbone accuracy, CI, embed dim, params, and time — pick the foundation_features backbone by measurement, not vibes.
Inputs: source (required), mode, path, dataset, +1 more. Returns: ok, meta, title, mimeType, +2 more
leaderboard.mineMy Leaderboard SubmissionsARead-onlyIdempotentInspect
List your leaderboard submissions (newest first), all datasets.
Inputs: no named parameters. Returns: object
leaderboard.statusLeaderboard Submission StatusARead-onlyIdempotentInspect
Fetch one of your leaderboard submissions (owner-only).
Returns status (queued | scoring | done | failed), metrics when done (meanAccuracyPct + CI, same shape as leaderboard rows), or the error that failed it.
Inputs: submission_id (required). Returns: object
leaderboard.submitSubmit to LeaderboardAInspect
Submit a BYO python_model to a leaderboard track for server-side scoring.
Nimbus scores it server-side under the track's fixed protocol — you
submit code, never results. Poll leaderboard.status with the
returned submissionId; scoring takes minutes (classical) to tens
of minutes (deep). Requirements must be plain PyPI names/specs (max
20, no URLs). Identical code resubmission is idempotent per track
(deduplicated: true).
Verification contract (tier model X10): verification="verified"
(default) is the server-side-scored submission above — on the hosted
backend it is Pro-only; free accounts get a structured tier response.
verification="unverified_local" names the designed Account-Free
lane for locally-computed results; the backend has no unverified
submission kind yet (see the response it returns — nothing is
stored, and no row is faked). Anonymous callers get a structured
login prompt: a submission needs an identity. Local (desktop/dev)
backends keep their existing server-side quota behaviour.
Inputs: name (required), dataset_id (required), code, track, +7 more. Returns: object
pipeline.exportExport PipelineAIdempotentInspect
Export the pipeline as a standalone runnable Python bundle (zip).
Local/stdio: the zip is saved under NIMBUS_EXPORT_DIR/exports and its path
returned. Hosted gateway: the zip is returned inline as contentBase64
(up to 1 MB of base64). UI-only nodes (interactive_application) are left out and
listed in exportNotes.
Inputs: train_graph (required), name. Returns: object
pipeline.validateValidate PipelineARead-onlyIdempotentInspect
Validate a pipeline graph before running. ExecGraphSnapshot: {nodes: [{id, type, config}], connections: [{from, to}]}. Build it from catalog.template(id).train or from scratch using catalog.nodes().
Inputs: train_graph (required). Returns: object
pipeline.validate_nodeValidate Node ConfigARead-onlyIdempotentInspect
Validate one node's config (schema + semantic checks).
Catches the same value errors as pipeline.validate for a single node (inverted bandpass, CSP components vs channel count when dataset is set).
Inputs: config (required), node_type (required), dataset. Returns: object
plots.confusionPlot Confusion MatrixAIdempotentInspect
Confusion-matrix figure for one execution: heatmap with trial counts + per-class accuracy bars, rendered as a PNG the assistant can see. Use it right after execution.results to eyeball WHICH classes are confused, not just the accuracy number.
Inputs: execution_id (required), save, matrix. Returns: ok, meta, title, mimeType, +2 more
plots.datasetPlot DatasetAIdempotentInspect
Figure over an EEG data source — the visual companion to data.inspect_dataset. kind=psd (Welch, channel mean bold), kind=bandpower (channel × band dB heatmap), kind=topomap (band-power scalp map), kind=spectrogram (time-frequency for one channel). Sources are the same ones inspect uses: MOABB packs, uploads, local files.
Inputs: kind (required), source (required), band, mode, +5 more. Returns: ok, meta, title, mimeType, +2 more
plots.erpPlot ERPAIdempotentInspect
ERP butterfly figure from epoched data: one subplot per class, all channel means (thin) + across-channel mean (bold), time-locked to the trial event. Shows whether class-conditioned evoked structure exists BEFORE training anything.
Inputs: source (required), mode, path, save, +3 more. Returns: ok, meta, title, mimeType, +2 more
plots.leaderboardPlot LeaderboardAIdempotentInspect
Leaderboard bar chart for one dataset: accuracy with 95% CI whiskers, best first; BYO python_model submissions highlighted in a distinct color. The visual companion to catalog.leaderboard. On the pretrained_few_trial track the figure also includes the classical LOSO baseline as a muted side panel for comparison.
Inputs: dataset_id (required), save, track. Returns: ok, meta, title, mimeType, +2 more
project.createCreate ProjectBInspect
Create a project (container for one pipeline document). Returns projectId.
Inputs: name (required), description. Returns: object
project.deleteDelete ProjectADestructiveInspect
Delete a project (and its saved pipeline document) from the studio workspace.
Requires confirm=True: this removes the project from the user's project list. Executions already run from it are not affected. Find ids with project.list.
Inputs: project_id (required), confirm. Returns: object
project.listList ProjectsARead-onlyIdempotentInspect
List projects owned by the current principal (agent work included).
Inputs: no named parameters. Returns: object
project.loadLoad ProjectARead-onlyIdempotentInspect
Load a project's saved pipeline (train graph + meta) for editing/re-running.
Inputs: project_id (required). Returns: object
project.renameRename ProjectAIdempotentInspect
Rename a project you own (max 200 characters).
Inputs: name (required), project_id (required). Returns: object
project.saveSave Project PipelineADestructiveInspect
Save a pipeline graph into a project (visible on the studio canvas).
Always pass expected_revision from the last project.load (or a prior save/create response). When it does not match the current server revision, the save fails with a conflict — it does NOT silently overwrite concurrent edits. Omitting it is rejected so a stale single-writer convenience path cannot wipe another client's work.
Inputs: project_id (required), train_graph (required), expected_revision (required), name, +1 more. Returns: object
protocol.export_statsExport Protocol StatsARead-onlyIdempotentInspect
Paired pre/post analysis for one assignment's recorded sessions: per-block aggregates (descriptive + CSV), paired t / Wilcoxon / dz (per-statistic minimums: paired t and Cohen's dz need ≥ 3 completed sessions, Wilcoxon needs ≥ 5), specificity notes, the adaptive-threshold trajectory, and a pre/post figure (base64 PNG — render or save it to look at the effect). An assignment with no recordings yet returns the empty payload with a note, never an error.
Inputs: assignment_id (required). Returns: object
protocol.listList ProtocolsBRead-onlyIdempotentInspect
Every saved protocol id at its latest version.
Inputs: project_id. Returns: object
protocol.pausePause Protocol SessionAInspect
Pause a running protocol session (blocks freeze; the session and device stay alive — resume with protocol.resume). Simulated and playback sessions only while paused: no data is recorded.
Inputs: session_id (required). Returns: object
protocol.resumeResume Protocol SessionAInspect
Resume a paused protocol session (restarts the server-driven device loop). Live-hardware resume requires a Pro plan; simulated sessions are free. Pass the session's channel count (start_assignment reports it).
Inputs: session_id (required), chunk_size, n_channels. Returns: object
protocol.saveSave ProtocolAInspect
Validate and persist the NEXT VERSION of a protocol document (confirm-gated: each call appends a version row; accidental calls clutter the version history). Edits create a new version — the assignment pins the version it runs.
Inputs: spec (required), confirm, project_id. Returns: object
protocol.session_statusProtocol Session StatusARead-onlyIdempotentInspect
Live snapshot of a protocol deploy session: the scheduler block /
session progress + threshold state (under protocol) beside the
telemetry window (recent indicators, quality, stats).
Inputs: session_id (required), window. Returns: object
protocol.start_assignmentStart Protocol AssignmentAInspect
Enroll a subject and prepare their neurofeedback deploy session (confirm-gated — a session runs on a human). Creates the assignment (yoked sham arms REQUIRE yoked_donor_upload_id: a recorded simulated session's upload — mint one by running an active-arm session and data.upload-ing its recording), then persists the protocol graph as a deployable execution. Requires a Pro plan for LIVE hardware sessions; simulated-source sessions (the default template) are free.
Graph source: execution_id reuses THAT run's stored graph (it must contain a protocol_session node; no device is pre-connected — the deploy session's data source stays yours). Without execution_id the built-in template graph is cloned — simulated source → bandpass → bandpower_indicator → protocol_session stamped with the protocol refs — and a simulated device is connected to the returned session id.
The session starts when a client opens {statusUrl} (the deploy WS), sends init_deployment with modelExecutionId={executionId}, then start; the Studio app shows the feedback panel automatically. Poll protocol.session_status; stop with protocol.stop (the recording's block annotations + assignment progression are written on stop).
Inputs: arm (required), protocol_id (required), subject_label (required), protocol_version (required), +3 more. Returns: object
protocol.stopStop Protocol SessionADestructiveInspect
Stop a protocol session (always safe to call): stops streaming, saves the block-annotated recording, advances the assignment when the scheduler reached its natural end, and disconnects the device (best-effort — a failed disconnect is reported, never raised).
Inputs: session_id (required). Returns: object
protocol.validateValidate ProtocolARead-onlyIdempotentInspect
Validate a neurofeedback protocol document WITHOUT saving it. Returns {valid: true, spec} on success, or {valid: false, errors: [...]} with the per-violation list (loc/msg) when the document is invalid — the verdict is data, never an exception.
Inputs: spec (required). Returns: object
python.validateValidate Python ModelARead-onlyIdempotentInspect
Statically check a python_model script (BYO model class) without running it.
Compiles the source and verifies the contract — a class with fit(X, y, info) and predict(X); optional predict_proba(X) unlocks confidence panels. Never executes the code, so it is safe against the hosted backend. Use it before execution.run to catch syntax errors, missing methods, or the wrong class name cheaply.
Inputs: code (required), class_name. Returns: object
stats.groupedGrouped StatisticsARead-onlyIdempotentInspect
Cluster-aware group statistics across executions.
REQUIREMENT (read first): each execution must have been run with an evaluation plan that STORED per-SUBJECT accuracies for at least 3 subjects — e.g. leave-one-subject-out (LOSO) or grouped CV over
= 3 subjects. Session groups within one subject (multi-session single-subject runs) are refused with
nimbus.stats.non_subject_groups— those are not independent subjects. A plain single-subject CV run with no subject/session grouping stores no group stats and fails withnimbus.stats.insufficient_groups.
HOW to get grouped stats: in the train graph set public_data.subject
to >= 3 subjects (e.g. "S01,S02,S03", mode "all"), add an
evaluation_plan node wired right after public_data with
method: "loso" and evaluationTargetNodeId = your model node id,
and keep an epoching node. See catalog.node_schema("evaluation_plan")
and the mi_bciiv2a_csp_cv template for a working plan.
What it does: pools the per-subject accuracies each run's evaluation
plan stored, then reports the between-group summary — mean accuracy
with a t-interval and a one-sample t-test vs chance. Responses label
groupKind, real groupKeys (subject ids like S01 when stamped
or recoverable), perGroup (key + accuracy pairs),
overall.pooledExecutionIds, and kindBreakdown /
overall.kindBreakdown (per_subject vs loso etc. with n + mean —
#470; between-group pooled mean is unchanged).
Inputs: execution_ids (required), chance. Returns: object
stream.startStart EEG StreamAInspect
Connect an EEG device and START a live streaming session on the user's head. Requires confirm=True; call device.test first. Track with stream.status(). Idle watchdog: if no stream.status()/stream.telemetry() poll happens for idle_timeout_sec (default 900), the session is stopped and the device disconnected automatically — an abandoned stream never keeps running on the user's head. Any poll resets the timer; idle_timeout_sec=0 disables the watchdog.
Inputs: device_type (required), port, confirm, ip_port, +10 more. Returns: object
stream.statusEEG Stream StatusARead-onlyIdempotentInspect
Live snapshot of a streaming session (running, deviceConnected). Polling this also feeds the idle watchdog: each call resets the session's idle timer (see stream.start's idle_timeout_sec).
Inputs: session_id (required). Returns: object
stream.stopStop EEG StreamADestructiveInspect
Stop a streaming session and disconnect the device (always safe to call). Also removes the session from the idle watchdog so it cannot fire after an explicit stop.
Inputs: session_id (required). Returns: object
stream.telemetryEEG Stream TelemetryARead-onlyIdempotentInspect
Live snapshot of a streaming session: latest prediction + recent window, signal quality (meanChannelQuality, snrDb, artifactProbability), indicators, running stats. Poll this while a session runs. Works with OR without a deployed model: modelless hardware streams (no classifier) report live signal quality + focus/relaxation band-power indicators with latestPrediction null; deployed sessions additionally carry predictions and confidence stats. Expect low confidence during filter/ASR warm-up (first seconds); quality < 0.5 or high artifactProbability means the signal is poor. 404 => session not active in this backend. Each poll also feeds the idle watchdog (see stream.start's idle_timeout_sec), keeping an actively watched session alive.
Inputs: session_id (required), window. Returns: object
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
Related MCP Connectors
Discover, run, inspect, build, test, and privately reuse AI workflows.
Hosted NeuroDock — stateless communication and planning tools over OAuth-secured Streamable HTTP.
Search and license real-world AI training data: egocentric video, UMI gripper demos, custom EEG.
A visual brain for your agents: live, reusable UI fragments and skills to pull into code.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceAn MCP server that gives AI agents a unified interface to clinical/research EEG workflows: signal processing, source imaging, persistent dataset/EHR storage, and web visualization.61 PyPI1BSD 3-Clause
- AlicenseBqualityBmaintenanceAn MCP server that gives AI assistants conversational access to MNE-Python for analyzing neurophysiology data (EEG, MEG, sEEG, ECoG, fNIRS). Enables plain-language analysis pipelines, from loading recordings to generating figures and explanations.4140 PyPI12MIT
- AlicenseBqualityBmaintenanceEnables read-only analysis of intracortical spike-level brain-computer-interface recordings, including signal quality, spike detection, firing rates, and cursor-velocity decoding from local or streamed datasets.2429 PyPI1Creative Commons Zero v1.0 Universal
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to read real-time focus state from any BrainFlow-supported EEG headset.1MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.