Skip to main content
Glama

Server Details

BCI/EEG toolkit: public MOABB/BNCI datasets, pipeline build/validate, hosted training, BIDS export.

Ownership verified
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

B3.4/5.0

Scored across 63 tools

Disambiguation4/5

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.

Naming Consistency5/5

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.

Tool Count1/5

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.

Completeness4/5

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
Vendor relationship
Not applicable
Documentation
Not applicable
Restrictions
Not applicable

Available Tools

63 tools
account.whoamiWho Am IA
Read-onlyIdempotent
Inspect

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 BIDSA
Idempotent
Inspect

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 BIDSA
Idempotent
Inspect

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 StatusA
Read-onlyIdempotent
Inspect

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 DatasetsC
Read-onlyIdempotent
Inspect

Curated public EEG datasets (MOABB packs) available to pipelines.

Inputs: only_on_disk. Returns: object

catalog.leaderboardLeaderboardA
Read-onlyIdempotent
Inspect

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 NodesA
Read-onlyIdempotent
Inspect

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 SchemaB
Read-onlyIdempotent
Inspect

Full config JSON schema + input/output ports for one node type.

Inputs: node_type (required). Returns: object

catalog.templateGet Pipeline TemplateA
Read-onlyIdempotent
Inspect

Full template incl. the 'train' execGraph needed by execution.run/pipeline.validate.

Inputs: template_id (required). Returns: object

catalog.templatesList Pipeline TemplatesA
Read-onlyIdempotent
Inspect

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 UploadA
Destructive
Inspect

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 DatasetA
Read-onlyIdempotent
Inspect

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 FileA
Read-onlyIdempotent
Inspect

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 DevicesB
Read-onlyIdempotent
Inspect

EEG devices supported by this backend (OpenBCI, Muse, BrainBit, LSL, PiEEG...).

Inputs: no named parameters. Returns: object

device.testTest EEG DeviceA
Read-onlyIdempotent
Inspect

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 ArtifactsC
Read-onlyIdempotent
Inspect

Trained artifacts (models/filters, e.g. *.pkl) saved by an execution.

Inputs: execution_id (required). Returns: object

execution.cancelCancel RunB
Destructive
Inspect

Cancel a running execution.

Inputs: execution_id (required). Returns: object

execution.deleteDelete RunA
Destructive
Inspect

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 ArtifactA
Idempotent
Inspect

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 RunA
Read-onlyIdempotent
Inspect

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 RunsC
Read-onlyIdempotent
Inspect

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 ResultsA
Read-onlyIdempotent
Inspect

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 ExperimentA
Destructive
Inspect

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 ExperimentC
Read-onlyIdempotent
Inspect

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 BackbonesA
Read-onlyIdempotent
Inspect

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 SubmissionsA
Read-onlyIdempotent
Inspect

List your leaderboard submissions (newest first), all datasets.

Inputs: no named parameters. Returns: object

leaderboard.statusLeaderboard Submission StatusA
Read-onlyIdempotent
Inspect

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 PipelineA
Idempotent
Inspect

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 PipelineA
Read-onlyIdempotent
Inspect

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 ConfigA
Read-onlyIdempotent
Inspect

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 MatrixA
Idempotent
Inspect

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 DatasetA
Idempotent
Inspect

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 ERPA
Idempotent
Inspect

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 LeaderboardA
Idempotent
Inspect

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 ProjectA
Destructive
Inspect

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 ProjectsA
Read-onlyIdempotent
Inspect

List projects owned by the current principal (agent work included).

Inputs: no named parameters. Returns: object

project.loadLoad ProjectA
Read-onlyIdempotent
Inspect

Load a project's saved pipeline (train graph + meta) for editing/re-running.

Inputs: project_id (required). Returns: object

project.renameRename ProjectA
Idempotent
Inspect

Rename a project you own (max 200 characters).

Inputs: name (required), project_id (required). Returns: object

project.saveSave Project PipelineA
Destructive
Inspect

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 StatsA
Read-onlyIdempotent
Inspect

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 ProtocolsB
Read-onlyIdempotent
Inspect

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 StatusA
Read-onlyIdempotent
Inspect

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 SessionA
Destructive
Inspect

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 ProtocolA
Read-onlyIdempotent
Inspect

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 ModelA
Read-onlyIdempotent
Inspect

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 StatisticsA
Read-onlyIdempotent
Inspect

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 with nimbus.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 StatusA
Read-onlyIdempotent
Inspect

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 StreamA
Destructive
Inspect

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 TelemetryA
Read-onlyIdempotent
Inspect

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

    Related MCP Servers

    • A
      license
      Not graded
      quality
      C
      maintenance
      An 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 PyPI
      1
      BSD 3-Clause
    • A
      license
      B
      quality
      B
      maintenance
      An 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.
      41
      40 PyPI
      12
      MIT
    • A
      license
      B
      quality
      B
      maintenance
      Enables 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.
      24
      29 PyPI
      1
      Creative Commons Zero v1.0 Universal
    Try in Browser

    Glama MCP Gateway

    Add one secure layer between your agents and this server.