Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

Nimbus BCI

REMOTE · NIMBUS-MCP.FLY.DEV · 2 COMPONENTS

AI agents build, train, and analyze BCI/EEG pipelines: data, models, experiments, live sessions.

−34 this week 36 Trust /100

Last scanned (6 hours ago)

Scores higher than 23% of remote servers

Reachable. Last reached 24 Oct 2026.

Category Health and Science

Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →

Endpoint Security89
Transport & Reachability0
Schema Quality & AI Usability0
  • Schema blocked by authentication: the endpoint requires auth we don't have to read it. See how to fix → Unverified
Stability & Change Management0
  • Stability not yet verified: not enough scan history yet (needs a 30-day window).Unverified
Tool Coverage0
  • Tool coverage blocked by authentication: the endpoint requires auth we don't have to read its tools.Unverified
Tool Safety0
  • Tool safety blocked by authentication: the endpoint requires auth we don't have to read its tools.Unverified
Capabilities0
  • Capabilities blocked by authentication: the endpoint requires auth we don't have to read them. See how to fix → Unverified

Unverified: 6 categories

Categories scored 0 because we could not verify them: authentication we do not have, an unreachable endpoint, or not enough scan history. We only credit what we can confirm. Claim this server and supply a read-only token to verify it and lift the score.

Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 21 Oct 26 −34
    • Endpoint reachability: reachable → behind authorisation ▼ security
    • Transport: pass → unverified ▼ security
    • Stability: fail → unverified ▼ security
    • Tool safety: pass → unverified ▼ security
    • Authorization: fail → pass ▲ security
    • First check of Authorization: partial security
    • Tool coverage: 100 → unverified ▼ functional
    • Capabilities: pass → unverified ▼ functional
    • First check of Schema quality: unverified functional
  • 20 Oct 26 0
    • Stability: 0.47 → fail ▼ security
    • The server rewrote its instructions, which are the text every model session reads security
    • New tool “data.delete_upload”, which the server declares destructive security
    • Tool “stats.grouped” rewrote its description, which is the text the model reads security
    • Tool “project.save” rewrote its description, which is the text the model reads security
    • Tool “leaderboard.submit” rewrote its description, which is the text the model reads security
    • Tool “foundation.compare” rewrote its description, which is the text the model reads security
    • Tool “experiment.run” rewrote its description, which is the text the model reads security
    • Tool “experiment.get” rewrote its description, which is the text the model reads security
    • Tool “data.upload” rewrote its description, which is the text the model reads security
    • Tool “account.whoami” rewrote its description, which is the text the model reads security
    • “project.save” added a required parameter “expected_revision”, so existing callers break ▼ functional
    • Server version: 0.14.11 → 0.14.12 functional
    • Server version: 0.14.4 → 0.14.11 functional
    • “leaderboard.submit” added an optional parameter “verification” cosmetic
    • “stats.grouped” reworded the description of “execution_ids” cosmetic
  • 18 Oct 26 0
    • The server rewrote its instructions, which are the text every model session reads security
    • New tool “project.delete”, which the server declares destructive security
    • Tool “stats.grouped” rewrote its description, which is the text the model reads security
    • Tool “pipeline.validate_node” rewrote its description, which is the text the model reads security
    • Tool “execution.run” rewrote its description, which is the text the model reads security
    • Tool “catalog.leaderboard” rewrote its description, which is the text the model reads security
    • Tool “calibration.train” rewrote its description, which is the text the model reads security
    • Destructive annotations: pass → 100 functional
    • Server version: 0.14.2 → 0.14.4 functional
    • “pipeline.validate_node” added an optional parameter “dataset” cosmetic
    • “catalog.leaderboard” added an optional parameter “dataset_id” cosmetic
    • “pipeline.validate_node” reworded the description of “node_type” cosmetic
    • “stats.grouped” reworded the description of “execution_ids” cosmetic
    • “plots.confusion” reworded the description of “matrix” cosmetic
    • “leaderboard.submit” reworded the description of “dataset_id” cosmetic
    • “leaderboard.submit” reworded the description of “code” cosmetic
    • “calibration.train” reworded the description of “paradigm” cosmetic
    • “calibration.train” reworded the description of “template_id” cosmetic
    • “protocol.start_assignment” dropped the optional parameter “name” cosmetic
    • “protocol.save” dropped the optional parameter “name” cosmetic
  • 17 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 37 to 40. That category is still filling its 30-day observation window: 11 days of observed history at the previous scan, 12 at this one. The score rises as the window fills, whether or not the server changes.

  • 16 Oct 26 0
    • The server rewrote its instructions, which are the text every model session reads security
    • Tool “protocol.export_stats” rewrote its description, which is the text the model reads security
    • Schema quality: 6787 → 8080 ▼ functional
    • Schema quality: 6787 → 8062 ▼ functional
    • Tool coverage: 90% → 100% ▲ functional
    • Tool “plots.leaderboard” now declares an output schema ▲ functional
    • Tool “plots.erp” now declares an output schema ▲ functional
    • Tool “plots.dataset” now declares an output schema ▲ functional
    • Tool “plots.confusion” now declares an output schema ▲ functional
    • Tool “foundation.compare” now declares an output schema ▲ functional
    • Server version: 0.14.1 → 0.14.2 functional
    • Server version: 0.14.0 → 0.14.1 functional
    • Server version: 0.13.2 → 0.14.0 functional
    • New tool “protocol.export_stats” functional
    • New tool “protocol.stop” functional
    • New tool “protocol.start_assignment” functional
    • New tool “protocol.session_status” functional
    • New tool “protocol.save” functional
    • New tool “protocol.validate” functional
    • New tool “protocol.resume” functional
    • New tool “protocol.list” functional
    • New tool “protocol.pause” functional
    • “leaderboard.submit” added an optional parameter “backbone_revision” cosmetic
    • “leaderboard.submit” added an optional parameter “backbone_repo” cosmetic
    • “leaderboard.submit” added an optional parameter “backbone_license” cosmetic
    • “leaderboard.submit” added an optional parameter “backbone_kind” cosmetic
    • “leaderboard.submit” reworded the description of “code” cosmetic
    • “leaderboard.submit” made “code” optional cosmetic
  • 15 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 30 to 33. That category is still filling its 30-day observation window: 9 days of observed history at the previous scan, 10 at this one. The score rises as the window fills, whether or not the server changes.

  • 14 Oct 26 0
    • The server rewrote its instructions, which are the text every model session reads security
    • Tool “catalog.leaderboard” rewrote its description, which is the text the model reads security
    • Server version: 0.13.1 → 0.13.2 functional
    • Server version: 0.13.0 → 0.13.1 functional
    • New tool “foundation.compare” functional
  • 13 Oct 26 0
    • Tool “leaderboard.submit” rewrote its description, which is the text the model reads security
    • Tool “plots.leaderboard” rewrote its description, which is the text the model reads security
    • Server version: 0.12.1 → 0.13.0 functional
    • “leaderboard.submit” added an optional parameter “track” cosmetic
    • “plots.leaderboard” reworded the description of “track” cosmetic
Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 24 Oct 2026 · Probed https://nimbus-mcp.fly.dev/mcp

TLS valid

Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .

Subject Issuer Valid from Valid until Key Signature Serial
CN=*.fly.dev CN=YE1,O=Let's Encrypt,C=US 20 Oct 2026 18 Jan 2027 ECDSA 256 ECDSA-SHA384 5e6e25e6df778e81cd07b85fc9f12d4df7d
SANs: *.fly.dev
CN=YE1,O=Let's Encrypt,C=US (CA) CN=Root YE,O=ISRG,C=US 3 Sept 2025 2 Sept 2028 ECDSA 384 ECDSA-SHA384 5ddd70dd31f801c85c186a7a04b80afe
CN=Root YE,O=ISRG,C=US (CA) CN=ISRG Root X2,O=Internet Security Research Group,C=US 13 May 2026 2 Sept 2032 ECDSA 384 ECDSA-SHA384 872165fc34b6e5fba8add5b3705fb53a
CN=ISRG Root X2,O=Internet Security Research Group,C=US (CA) CN=ISRG Root X1,O=Internet Security Research Group,C=US 13 May 2026 2 Sept 2032 ECDSA 384 SHA256-RSA 6c8f1dc727c7117f7baf853ac980f9cd

Background: What to check on a remote MCP endpoint →

DNSSEC insecure

Validation of nimbus-mcp.fly.dev. — Not signed

Zone DS Keys Algorithms Outcome
. trust_anchor 20326, 38696 8, 8 Verified
dev. present 60074 8 Verified
fly.dev. absent Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation
Authentication Enforced and verified

The endpoint asked for a token and published valid RFC 9728 metadata describing how to get one.

Result Enforced and verified
Enforced On connection
HTTP status 401

WWW-Authenticate challenge Bearer resource_metadata="https://nimbus-mcp.fly.dev/.well-known/oauth-protected-resource/mcp"

Bearer resource_metadata="https://nimbus-mcp.fly.dev/.well-known/oauth-protected-resource/mcp"
Header Value
www-authenticate Bearer resource_metadata="https://nimbus-mcp.fly.dev/.well-known/oauth-protected-resource/mcp"

Protected resource metadata

Document https://nimbus-mcp.fly.dev/.well-known/oauth-protected-resource/mcp
Retrieved Yes
Resource https://nimbus-mcp.fly.dev/mcp
Authorisation server https://nimbus-mcp.fly.dev/

Background: How OAuth 2.1 works in the 2026 MCP spec →

Transports 2 probes
Transport URL Outcome Status Location
streamable-http https://nimbus-mcp.fly.dev/mcp Auth required 401
http (plaintext) http://nimbus-mcp.fly.dev/mcp HTTPS enforced 301 https://nimbus-mcp.fly.dev/mcp
MCP tools · 60 exposed · ~8,291 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
account.whoami ~95

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.

Input schema present but exposes no named parameters.

Structured output declared, but exposes no named fields.

No examples provided.

bids.export_dataset ~220

Export a Nimbus dataset as a BIDS-layout zip saved to NIMBUS_EXPORT_DIR/bids/. 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.

NameTypeReqDescription
datasetstringyesDataset id — a MOABB pack id (e.g. "BNCI2014_001"), an upload path (as returned by data.upload), or a recording name. Auto-detected.
kind––Optional explicit source kind: pack|upload|recording (default auto).
subjects––Pack exports only — subject filter (e.g. ["S01", "S03"]) to bound zip size; default exports all installed subjects.

Structured output declared, but exposes no named fields.

No examples provided.

bids.export_execution ~79

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) saved to NIMBUS_EXPORT_DIR/bids/.

NameTypeReqDescription
execution_idstringyesRun whose results to export (from execution.run).

Structured output declared, but exposes no named fields.

No examples provided.

calibration.pause ~35

Pause a running calibration between trials (cues hold; resume anytime).

NameTypeReqDescription
execution_idstringyesThe calibration run to pause.

Structured output declared, but exposes no named fields.

No examples provided.

calibration.resume ~27

Resume a paused calibration session.

NameTypeReqDescription
execution_idstringyesThe calibration run to resume.

Structured output declared, but exposes no named fields.

No examples provided.

calibration.start ~311

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).

NameTypeReqDescription
classes––Override class list [{id,label,cue}] (MI default: left/right hand).
confirmboolean–MUST be true — explicit user go-ahead for a session on their head.
connection_type––Device selector when several exist (e.g. serial vs wifi).
device_type––Device id from device.list (omit → template default synthetic).
ip_address––Device IP for network/wifi devices.
ip_port––Port for network devices.
mac_address––Bluetooth MAC (BT devices).
name––Display name recorded on the execution.
paradigmstring–mi | p300 | sart | target_hit.
port––Serial/COM port for wired devices.
serial_number––Device serial (some BLE stacks).
source_id––LSL source id.
stream_name––LSL stream name (LSL devices).
trials_per_class––Override the template's trial count (minimum 5).

Structured output declared, but exposes no named fields.

No examples provided.

calibration.status ~64

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.

NameTypeReqDescription
execution_idstringyesThe calibration run to inspect (from calibration.start).

Structured output declared, but exposes no named fields.

No examples provided.

calibration.train ~247

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.

NameTypeReqDescription
execution_idstringyesThe COMPLETED calibration run (from calibration.start).
name––Display name recorded on the training run.
paradigmstring–Paradigm of the recording (mi | p300 | sart | target_hit); mi and p300 have default train templates.
template_id––Train template to use (e.g. from catalog.templates); required for sart/target_hit (mi defaults to mi_headband_csp_lda, p300 to p300_hardware_xdawn_lda).
train_graph––Explicit train graph instead of a template; its first data node (custom_data/public_data) is rewired onto the recording.

Structured output declared, but exposes no named fields.

No examples provided.

catalog.datasets ~56

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

NameTypeReqDescription
only_on_diskboolean–Only return datasets whose data packs are present on this backend (True by default; False also lists known-but-missing sets).

Structured output declared, but exposes no named fields.

No examples provided.

catalog.leaderboard ~269

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.

NameTypeReqDescription
dataset_id––Optional dataset id. When set, every track is filtered to that dataset. Omit it for the full board.

Structured output declared, but exposes no named fields.

No examples provided.

catalog.node_schema ~48

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

NameTypeReqDescription
node_typestringyesNode id from catalog.nodes (e.g. "csp", "nimbus_lda").

Structured output declared, but exposes no named fields.

No examples provided.

catalog.nodes ~73

List Nimbus pipeline node types (data, preprocessing, features, models...). Use catalog.node_schema(node_type) for one node's full config schema and ports.

NameTypeReqDescription
category––Optional filter — e.g. "data", "preprocessing", "features", "models" (exact category ids from the unfiltered list).

Structured output declared, but exposes no named fields.

No examples provided.

catalog.template ~49

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

NameTypeReqDescription
template_idstringyesTemplate id from catalog.templates (e.g. "mi_csp_lda").

Structured output declared, but exposes no named fields.

No examples provided.

catalog.templates ~31

List built-in starter pipelines (MI/P300/SSVEP...). catalog.template(id) returns the graph.

Input schema present but exposes no named parameters.

Structured output declared, but exposes no named fields.

No examples provided.

data.delete_upload ~92

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.

NameTypeReqDescription
confirmboolean–MUST be true to delete — the explicit user go-ahead.
pathstringyesUpload path from data.upload (e.g. user_…/file.csv).

Structured output declared, but exposes no named fields.

No examples provided.

data.inspect_dataset ~237

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 is REQUIRED (the backend 400s without it) — get the subject list via 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.

NameTypeReqDescription
datasetstringyesDataset id from catalog.datasets (e.g. "BNCI2014_001").
modestring–Which split to summarize — training | evaluation | all.
subject––REQUIRED subject code ("S01") or comma-list cohort ("S01,S03").

Structured output declared, but exposes no named fields.

No examples provided.

data.inspect_file ~260

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 and this returns guidance (upload the file first or switch to a local backend).

NameTypeReqDescription
pathstringyesABSOLUTE filesystem path (`~` is expanded; local backends only) or the RELATIVE upload path returned by data.upload (works on any backend).

Structured output declared, but exposes no named fields.

No examples provided.

data.upload ~234

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).

NameTypeReqDescription
dataset_name––Optional label for the uploaded dataset.
file_pathstringyesLocal file to upload (.edf/.bdf/.mat/.csv/.txt/.tsv/.h5/.hdf5, <=500MB).
format––Override extension-based detection (auto|mat|csv|tsv|txt|edf|bdf|h5|hdf5).
sampling_rate––Hz for headerless CSV/TSV/TXT (REQUIRED there, e.g. 250.0).

Structured output declared, but exposes no named fields.

No examples provided.

device.list ~32

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

Input schema present but exposes no named parameters.

Structured output declared, but exposes no named fields.

No examples provided.

device.test ~148

Test a device connection WITHOUT starting a stream (safe, no confirm needed).

NameTypeReqDescription
connection_type––Device-specific selector when several exist (e.g. serial vs wifi).
device_typestringyesDevice id from device.list (e.g. "brainbit", "muse").
ip_address––Device IP for network/wifi devices.
ip_port––Port for network devices.
mac_address––Bluetooth MAC (BT devices).
port––Serial/COM port for wired devices.
serial_number––Device serial (some BLE stacks).
source_id––LSL source id.
stream_name––LSL stream name (LSL devices).

Structured output declared, but exposes no named fields.

No examples provided.

execution.artifacts ~42

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

NameTypeReqDescription
execution_idstringyesRun whose artifacts to list.

Structured output declared, but exposes no named fields.

No examples provided.

execution.cancel ~32

Cancel a running execution.

NameTypeReqDescription
execution_idstringyesThe run to terminate (from execution.run/execution.list).

Structured output declared, but exposes no named fields.

No examples provided.

execution.download_artifact ~68

Download one artifact file to NIMBUS_EXPORT_DIR/executions/<id>/ and return its path.

NameTypeReqDescription
artifact_namestringyesFile name from execution.artifacts (e.g. "nimbus_lda.pkl").
execution_idstringyesRun that produced the artifact.

Structured output declared, but exposes no named fields.

No examples provided.

execution.get ~42

Execution status summary (status: running/completed/failed/cancelled).

NameTypeReqDescription
execution_idstringyesThe run to check (from execution.run/execution.list).

Structured output declared, but exposes no named fields.

No examples provided.

execution.list ~59

Recent executions. Optional status filter (running/completed/failed/cancelled).

NameTypeReqDescription
limitinteger–Maximum number of runs to return (default 20).
status––Filter by run status: running/completed/failed/cancelled.

Structured output declared, but exposes no named fields.

No examples provided.

execution.results ~74

Metrics for a completed run. Trimmed by default (accuracy, kappa, ITR, confusion matrix, per-class); full=True returns the complete result object.

NameTypeReqDescription
execution_idstringyesThe completed run to fetch metrics for.
fullboolean–Return the backend's complete result object (all fields).

Structured output declared, but exposes no named fields.

No examples provided.

execution.run ~192

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).

NameTypeReqDescription
description––Optional longer description of the experiment.
layout––Optional canvas positions {nodes: {id: {x, y}}}; a deterministic grid is synthesized when omitted.
name––Display name for the run (shown in the Runs list).
subject––Optional dataset subject code (e.g. "S01") recorded with the run.
train_graphobjectyesPipeline graph {nodes: [{id, type, config}], connections: [{from, to}]} as built by catalog.template/pipeline.validate.

Structured output declared, but exposes no named fields.

No examples provided.

experiment.get ~265

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).

NameTypeReqDescription
experiment_idstringyesThe experiment to inspect (from experiment.run).

Structured output declared, but exposes no named fields.

No examples provided.

experiment.run ~236

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).

NameTypeReqDescription
max_concurrentinteger–Parallel submissions cap, clamped to 1-2 (default 2).
runsarrayyes1-25 entries, each {name: str, train_graph: {nodes, connections}} (same graph shape as execution.run's train_graph).

Structured output declared, but exposes no named fields.

No examples provided.

foundation.compare ~254

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.

NameTypeReqDescription
dataset––MOABB dataset id, e.g. "BNCI2014_001" (source=dataset).
modestring–Pack split to load: training | evaluation | all (source=dataset).
path––Upload path (source=upload) or absolute local path (source=local).
sourcestringyes"dataset" (MOABB pack), "upload" (path from data.upload), or "local" (absolute path, local backend only).
subject––Subject id, e.g. "S01" (source=dataset).
NameTypeReqDescription
metaobject–Figure sidecar. foundation.compare includes results/best/skipped (also as a JSON text content block).
mimeTypestring––
okbooleanyes–
savedPathstring–Set when save=true.
sizeBytesinteger–Set when save=true.
titlestring|null––

No examples provided.

leaderboard.mine ~20

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

Input schema present but exposes no named parameters.

Structured output declared, but exposes no named fields.

No examples provided.

leaderboard.status ~68

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.

NameTypeReqDescription
submission_idstringyesThe submissionId returned by leaderboard.submit.

Structured output declared, but exposes no named fields.

No examples provided.

leaderboard.submit ~629

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.

NameTypeReqDescription
backbone_kind––Checkpoint family for the BYO backbone lane — one of the zoo's supported kinds (e.g. "cbramod", "labram").
backbone_license––License declared for the backbone checkpoint.
backbone_repo––HF 'org/name' repo id for the BYO backbone lane.
backbone_revision––Full 40-char commit SHA pinning the backbone.
class_name––Contract class to instantiate; omit to auto-detect.
code––Python source defining a class with fit(X, y, info) and predict(X) (<=256KB; validate first with python.validate). Required unless backbone_repo is set.
dataset_idstringyesA dataset id from catalog.leaderboard ``submittableDatasets`` (e.g. "BNCI2014_001"). A dataset can appear under crossSubject and still be closed for submission (BNCI2014_008 is scored there and is no…
namestringyesDisplay name on the board (<=100 chars).
requirements––Optional PyPI requirements (e.g. ["sklearn>=1.4"]).
trackstring–"cross_subject" (default — full-data leave-one-subject-out, seed 42) or "pretrained_few_trial" (efficiency track: LOSO with a protocol-fixed 100-trials-per-subject cap; code that imports torch must d…
verificationstring–"verified" (default; server-side scored, Pro on the hosted backend) or "unverified_local" (Account-Free locally-computed lane; see the tool description for its current backend status).

Structured output declared, but exposes no named fields.

No examples provided.

pipeline.export ~50

Export the pipeline as a standalone runnable Python bundle (zip saved locally).

NameTypeReqDescription
name––Optional name recorded inside the bundle.
train_graphobjectyesPipeline graph {nodes, connections} to export.

Structured output declared, but exposes no named fields.

No examples provided.

pipeline.validate ~70

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().

NameTypeReqDescription
train_graphobjectyesThe graph to validate ({nodes, connections}).

Structured output declared, but exposes no named fields.

No examples provided.

pipeline.validate_node ~141

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).

NameTypeReqDescription
configobjectyesThe node's config object to check.
dataset––Optional MOABB pack id (e.g. "BNCI2014_001") so CSP/Nyquist checks can use channel count and sampling rate. Omitted → those context checks are skipped; inverted-band checks still run.
node_typestringyesNode type id from catalog.nodes (e.g. "csp", "bandpass_filter").

Structured output declared, but exposes no named fields.

No examples provided.

plots.confusion ~145

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.

NameTypeReqDescription
execution_idstringyesRun to plot (from execution.run / execution.results).
matrixstring–"eval" (held-out, default) or "train" (fit-set / cross-validation). CV and evaluation-plan runs often have no eval matrix — use "train".
saveboolean–Also write the PNG to NIMBUS_EXPORT_DIR/plots/ and return its path.
NameTypeReqDescription
metaobject–Figure sidecar. foundation.compare includes results/best/skipped (also as a JSON text content block).
mimeTypestring––
okbooleanyes–
savedPathstring–Set when save=true.
sizeBytesinteger–Set when save=true.
titlestring|null––

No examples provided.

plots.dataset ~303

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.

NameTypeReqDescription
bandstring–Band for kind=topomap: delta|theta|alpha|beta|gamma (default alpha).
channel_idxinteger–0-based channel for kind=spectrogram (default 0).
dataset––MOABB dataset id, e.g. "BNCI2014_001" (source=dataset).
kindstringyesFigure type: psd | topomap | bandpower | spectrogram.
modestring–Pack split to load: training | evaluation | all (source=dataset).
path––Upload path (source=upload) or absolute local path (source=local).
saveboolean–Also write the PNG to NIMBUS_EXPORT_DIR/plots/ and return its path.
sourcestringyes"dataset" (MOABB pack), "upload" (path from data.upload), or "local" (absolute path, local backend only).
subject––Subject id, e.g. "S01" (source=dataset).
NameTypeReqDescription
metaobject–Figure sidecar. foundation.compare includes results/best/skipped (also as a JSON text content block).
mimeTypestring––
okbooleanyes–
savedPathstring–Set when save=true.
sizeBytesinteger–Set when save=true.
titlestring|null––

No examples provided.

plots.erp ~225

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.

NameTypeReqDescription
dataset––MOABB dataset id, e.g. "BNCI2014_001" (source=dataset).
max_channelsinteger–Channels drawn per class subplot (default 16, max 64).
modestring–Pack split to load: training | evaluation | all (source=dataset).
path––Upload path (source=upload) or absolute local path (source=local).
saveboolean–Also write the PNG to NIMBUS_EXPORT_DIR/plots/ and return its path.
sourcestringyes"dataset" (MOABB pack), "upload" (path from data.upload), or "local" (absolute path, local backend only).
subject––Subject id, e.g. "S01" (source=dataset).
NameTypeReqDescription
metaobject–Figure sidecar. foundation.compare includes results/best/skipped (also as a JSON text content block).
mimeTypestring––
okbooleanyes–
savedPathstring–Set when save=true.
sizeBytesinteger–Set when save=true.
titlestring|null––

No examples provided.

plots.leaderboard ~212

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.

NameTypeReqDescription
dataset_idstringyesDataset to chart, e.g. "BNCI2014_001" (see catalog.leaderboard).
saveboolean–Also write the PNG to NIMBUS_EXPORT_DIR/plots/ and return its path.
trackstring–"within_session" (curated 5-fold), "crossSubject" (LOSO, curated + BYO submissions), or "pretrained_few_trial" (the efficiency track: LOSO at the protocol's fixed per-subject trial budget — the figur…
NameTypeReqDescription
metaobject–Figure sidecar. foundation.compare includes results/best/skipped (also as a JSON text content block).
mimeTypestring––
okbooleanyes–
savedPathstring–Set when save=true.
sizeBytesinteger–Set when save=true.
titlestring|null––

No examples provided.

project.create ~54

Create a project (container for one pipeline document). Returns projectId.

NameTypeReqDescription
description––Optional longer description shown in the studio.
namestringyesProject display name (e.g. "MI CSP-LDA sweep").

Structured output declared, but exposes no named fields.

No examples provided.

project.delete ~91

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.

NameTypeReqDescription
confirmboolean–MUST be true to delete — the explicit user go-ahead.
project_idstringyesProject to delete (from project.create/project.list).

Structured output declared, but exposes no named fields.

No examples provided.

project.list ~20

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

Input schema present but exposes no named parameters.

Structured output declared, but exposes no named fields.

No examples provided.

project.load ~38

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

NameTypeReqDescription
project_idstringyesProject whose pipeline document to load.

Structured output declared, but exposes no named fields.

No examples provided.

project.save ~174

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.

NameTypeReqDescription
expected_revisionintegeryesOptimistic-concurrency base from project.load / a prior save. Required.
name––Optional pipeline name stored on the document.
project_idstringyesTarget project (from project.create/project.list).
subject––Optional dataset subject code (e.g. "S01") for this pipeline.
train_graphobjectyesPipeline graph {nodes, connections} to persist.

Structured output declared, but exposes no named fields.

No examples provided.

protocol.export_stats ~133

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.

NameTypeReqDescription
assignment_idstringyesThe assignment to analyze (from start_assignment).

Structured output declared, but exposes no named fields.

No examples provided.

protocol.list ~17

Every saved protocol id at its latest version.

Input schema present but exposes no named parameters.

Structured output declared, but exposes no named fields.

No examples provided.

protocol.pause ~59

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.

NameTypeReqDescription
session_idstringyesThe deploy session to pause.

Structured output declared, but exposes no named fields.

No examples provided.

protocol.resume ~98

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).

NameTypeReqDescription
chunk_sizeinteger–Samples per streamed chunk (default 125).
n_channelsinteger–Session channel count (the built-in template opens 4).
session_idstringyesThe deploy session to resume.

Structured output declared, but exposes no named fields.

No examples provided.

protocol.save ~84

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.

NameTypeReqDescription
confirmboolean–MUST be true to write.
specobjectyesWire-format protocol document (validate first to iterate).

Structured output declared, but exposes no named fields.

No examples provided.

Install

How do I install the Nimbus BCI MCP server?

Nimbus BCI is a hosted endpoint at https://nimbus-mcp.fly.dev/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

remote · nimbus-mcp.fly.dev

# add to Claude Code
claude mcp add --transport http nimbusbci-nimbus-mcp 'https://nimbus-mcp.fly.dev/mcp'
Common questions

What is the Nimbus BCI MCP server?

Nimbus BCI is an MCP server listed in the public MCP registry as io.github.nimbusbci/nimbus-mcp. AI agents build, train, and analyze BCI/EEG pipelines: data, models, experiments, live sessions. This page covers its hosted endpoint (https://nimbus-mcp.fly.dev/mcp).

Is the Nimbus BCI MCP server safe to use?

Nimbus BCI scores 36 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the Nimbus BCI MCP server expose?

Nimbus BCI exposes 60 tools: account.whoami, catalog.nodes, catalog.node_schema, catalog.templates, catalog.template, and 55 more. Their descriptions and schemas cost roughly 8,291 tokens of context every time the server is loaded.

Does the Nimbus BCI MCP server require authentication?

Yes. Nimbus BCI asked us for credentials when we connected, so you will need to authorise it in your MCP client before it can do anything.

Is the Nimbus BCI MCP server still maintained?

Nimbus BCI is still listed as active in the MCP registry. We last reached this channel on 24 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.