Nimbus BCI
REMOTE · NIMBUS-MCP.FLY.DEV · 2 COMPONENTS
AI agents build, train, and analyze BCI/EEG pipelines: data, models, experiments, live sessions.
Available components
Last scanned (6 hours ago)
Scores higher than 23% of remote servers
Reachable. Last reached 24 Oct 2026.
Category Health and Science
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
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- The endpoint enforces authorisation, advertised via RFC 9728 protected-resource metadata. View diagnostics → Pass
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- HSTS check failed: the Strict-Transport-Security header is absent. See how to fix → View diagnostics → Fail
- DNSSEC check failed: this domain isn't protected by DNSSEC. See how to fix → View diagnostics → Fail
- The authorisation server offers only Dynamic Client Registration (RFC 7591), which MCP 2026-07-28 deprecated in favour of Client ID Metadata Documents. View diagnostics → Partial
Transport & Reachability0
- Transport blocked by authentication: the endpoint requires auth we don't have to verify streamable-http. See how to fix → View diagnostics → Unverified
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.
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
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 |
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 →
account.whoami 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 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.
| Name | Type | Req | Description |
|---|---|---|---|
| dataset | string | yes | Dataset 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 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/.
| Name | Type | Req | Description |
|---|---|---|---|
| execution_id | string | yes | Run whose results to export (from execution.run). |
Structured output declared, but exposes no named fields.
No examples provided.
calibration.pause Calibration.Pause ~35
Pause a running calibration between trials (cues hold; resume anytime).
| Name | Type | Req | Description |
|---|---|---|---|
| execution_id | string | yes | The calibration run to pause. |
Structured output declared, but exposes no named fields.
No examples provided.
calibration.resume Calibration.Resume ~27
Resume a paused calibration session.
| Name | Type | Req | Description |
|---|---|---|---|
| execution_id | string | yes | The calibration run to resume. |
Structured output declared, but exposes no named fields.
No examples provided.
calibration.start 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).
| Name | Type | Req | Description |
|---|---|---|---|
| classes | – | – | Override class list [{id,label,cue}] (MI default: left/right hand). |
| confirm | boolean | – | 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. |
| paradigm | string | – | 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 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.
| Name | Type | Req | Description |
|---|---|---|---|
| execution_id | string | yes | The calibration run to inspect (from calibration.start). |
Structured output declared, but exposes no named fields.
No examples provided.
calibration.train 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.
| Name | Type | Req | Description |
|---|---|---|---|
| execution_id | string | yes | The COMPLETED calibration run (from calibration.start). |
| name | – | – | Display name recorded on the training run. |
| paradigm | string | – | 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 Catalog.Datasets ~56
Curated public EEG datasets (MOABB packs) available to pipelines.
| Name | Type | Req | Description |
|---|---|---|---|
| only_on_disk | boolean | – | 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 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.
| Name | Type | Req | Description |
|---|---|---|---|
| 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 Catalog.Node Schema ~48
Full config JSON schema + input/output ports for one node type.
| Name | Type | Req | Description |
|---|---|---|---|
| node_type | string | yes | Node id from catalog.nodes (e.g. "csp", "nimbus_lda"). |
Structured output declared, but exposes no named fields.
No examples provided.
catalog.nodes 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.
| Name | Type | Req | Description |
|---|---|---|---|
| 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 Catalog.Template ~49
Full template incl. the 'train' execGraph needed by execution.run/pipeline.validate.
| Name | Type | Req | Description |
|---|---|---|---|
| template_id | string | yes | Template id from catalog.templates (e.g. "mi_csp_lda"). |
Structured output declared, but exposes no named fields.
No examples provided.
catalog.templates 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 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.
| Name | Type | Req | Description |
|---|---|---|---|
| confirm | boolean | – | MUST be true to delete — the explicit user go-ahead. |
| path | string | yes | Upload path from data.upload (e.g. user_…/file.csv). |
Structured output declared, but exposes no named fields.
No examples provided.
data.inspect_dataset 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.
| Name | Type | Req | Description |
|---|---|---|---|
| dataset | string | yes | Dataset id from catalog.datasets (e.g. "BNCI2014_001"). |
| mode | string | – | 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 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).
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | ABSOLUTE 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 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).
| Name | Type | Req | Description |
|---|---|---|---|
| dataset_name | – | – | Optional label for the uploaded dataset. |
| file_path | string | yes | Local 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 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 Device.Test ~148
Test a device connection WITHOUT starting a stream (safe, no confirm needed).
| Name | Type | Req | Description |
|---|---|---|---|
| connection_type | – | – | Device-specific selector when several exist (e.g. serial vs wifi). |
| device_type | string | yes | Device 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 Execution.Artifacts ~42
Trained artifacts (models/filters, e.g. *.pkl) saved by an execution.
| Name | Type | Req | Description |
|---|---|---|---|
| execution_id | string | yes | Run whose artifacts to list. |
Structured output declared, but exposes no named fields.
No examples provided.
execution.cancel Execution.Cancel ~32
Cancel a running execution.
| Name | Type | Req | Description |
|---|---|---|---|
| execution_id | string | yes | The run to terminate (from execution.run/execution.list). |
Structured output declared, but exposes no named fields.
No examples provided.
execution.download_artifact Execution.Download Artifact ~68
Download one artifact file to NIMBUS_EXPORT_DIR/executions/<id>/ and return its path.
| Name | Type | Req | Description |
|---|---|---|---|
| artifact_name | string | yes | File name from execution.artifacts (e.g. "nimbus_lda.pkl"). |
| execution_id | string | yes | Run that produced the artifact. |
Structured output declared, but exposes no named fields.
No examples provided.
execution.get Execution.Get ~42
Execution status summary (status: running/completed/failed/cancelled).
| Name | Type | Req | Description |
|---|---|---|---|
| execution_id | string | yes | The run to check (from execution.run/execution.list). |
Structured output declared, but exposes no named fields.
No examples provided.
execution.list Execution.List ~59
Recent executions. Optional status filter (running/completed/failed/cancelled).
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | 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 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.
| Name | Type | Req | Description |
|---|---|---|---|
| execution_id | string | yes | The completed run to fetch metrics for. |
| full | boolean | – | Return the backend's complete result object (all fields). |
Structured output declared, but exposes no named fields.
No examples provided.
execution.run 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).
| Name | Type | Req | Description |
|---|---|---|---|
| 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_graph | object | yes | Pipeline 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 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).
| Name | Type | Req | Description |
|---|---|---|---|
| experiment_id | string | yes | The experiment to inspect (from experiment.run). |
Structured output declared, but exposes no named fields.
No examples provided.
experiment.run 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).
| Name | Type | Req | Description |
|---|---|---|---|
| max_concurrent | integer | – | Parallel submissions cap, clamped to 1-2 (default 2). |
| runs | array | yes | 1-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 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.
| Name | Type | Req | Description |
|---|---|---|---|
| dataset | – | – | MOABB dataset id, e.g. "BNCI2014_001" (source=dataset). |
| mode | string | – | Pack split to load: training | evaluation | all (source=dataset). |
| path | – | – | Upload path (source=upload) or absolute local path (source=local). |
| source | string | yes | "dataset" (MOABB pack), "upload" (path from data.upload), or "local" (absolute path, local backend only). |
| subject | – | – | Subject id, e.g. "S01" (source=dataset). |
| Name | Type | Req | Description |
|---|---|---|---|
| meta | object | – | Figure sidecar. foundation.compare includes results/best/skipped (also as a JSON text content block). |
| mimeType | string | – | – |
| ok | boolean | yes | – |
| savedPath | string | – | Set when save=true. |
| sizeBytes | integer | – | Set when save=true. |
| title | string|null | – | – |
No examples provided.
leaderboard.mine 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 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.
| Name | Type | Req | Description |
|---|---|---|---|
| submission_id | string | yes | The submissionId returned by leaderboard.submit. |
Structured output declared, but exposes no named fields.
No examples provided.
leaderboard.submit 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.
| Name | Type | Req | Description |
|---|---|---|---|
| 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_id | string | yes | A 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… |
| name | string | yes | Display name on the board (<=100 chars). |
| requirements | – | – | Optional PyPI requirements (e.g. ["sklearn>=1.4"]). |
| track | string | – | "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… |
| verification | string | – | "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 Pipeline.Export ~50
Export the pipeline as a standalone runnable Python bundle (zip saved locally).
| Name | Type | Req | Description |
|---|---|---|---|
| name | – | – | Optional name recorded inside the bundle. |
| train_graph | object | yes | Pipeline graph {nodes, connections} to export. |
Structured output declared, but exposes no named fields.
No examples provided.
pipeline.validate 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().
| Name | Type | Req | Description |
|---|---|---|---|
| train_graph | object | yes | The graph to validate ({nodes, connections}). |
Structured output declared, but exposes no named fields.
No examples provided.
pipeline.validate_node 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).
| Name | Type | Req | Description |
|---|---|---|---|
| config | object | yes | The 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_type | string | yes | Node type id from catalog.nodes (e.g. "csp", "bandpass_filter"). |
Structured output declared, but exposes no named fields.
No examples provided.
plots.confusion 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.
| Name | Type | Req | Description |
|---|---|---|---|
| execution_id | string | yes | Run to plot (from execution.run / execution.results). |
| matrix | string | – | "eval" (held-out, default) or "train" (fit-set / cross-validation). CV and evaluation-plan runs often have no eval matrix — use "train". |
| save | boolean | – | Also write the PNG to NIMBUS_EXPORT_DIR/plots/ and return its path. |
| Name | Type | Req | Description |
|---|---|---|---|
| meta | object | – | Figure sidecar. foundation.compare includes results/best/skipped (also as a JSON text content block). |
| mimeType | string | – | – |
| ok | boolean | yes | – |
| savedPath | string | – | Set when save=true. |
| sizeBytes | integer | – | Set when save=true. |
| title | string|null | – | – |
No examples provided.
plots.dataset 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.
| Name | Type | Req | Description |
|---|---|---|---|
| band | string | – | Band for kind=topomap: delta|theta|alpha|beta|gamma (default alpha). |
| channel_idx | integer | – | 0-based channel for kind=spectrogram (default 0). |
| dataset | – | – | MOABB dataset id, e.g. "BNCI2014_001" (source=dataset). |
| kind | string | yes | Figure type: psd | topomap | bandpower | spectrogram. |
| mode | string | – | Pack split to load: training | evaluation | all (source=dataset). |
| path | – | – | Upload path (source=upload) or absolute local path (source=local). |
| save | boolean | – | Also write the PNG to NIMBUS_EXPORT_DIR/plots/ and return its path. |
| source | string | yes | "dataset" (MOABB pack), "upload" (path from data.upload), or "local" (absolute path, local backend only). |
| subject | – | – | Subject id, e.g. "S01" (source=dataset). |
| Name | Type | Req | Description |
|---|---|---|---|
| meta | object | – | Figure sidecar. foundation.compare includes results/best/skipped (also as a JSON text content block). |
| mimeType | string | – | – |
| ok | boolean | yes | – |
| savedPath | string | – | Set when save=true. |
| sizeBytes | integer | – | Set when save=true. |
| title | string|null | – | – |
No examples provided.
plots.erp 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.
| Name | Type | Req | Description |
|---|---|---|---|
| dataset | – | – | MOABB dataset id, e.g. "BNCI2014_001" (source=dataset). |
| max_channels | integer | – | Channels drawn per class subplot (default 16, max 64). |
| mode | string | – | Pack split to load: training | evaluation | all (source=dataset). |
| path | – | – | Upload path (source=upload) or absolute local path (source=local). |
| save | boolean | – | Also write the PNG to NIMBUS_EXPORT_DIR/plots/ and return its path. |
| source | string | yes | "dataset" (MOABB pack), "upload" (path from data.upload), or "local" (absolute path, local backend only). |
| subject | – | – | Subject id, e.g. "S01" (source=dataset). |
| Name | Type | Req | Description |
|---|---|---|---|
| meta | object | – | Figure sidecar. foundation.compare includes results/best/skipped (also as a JSON text content block). |
| mimeType | string | – | – |
| ok | boolean | yes | – |
| savedPath | string | – | Set when save=true. |
| sizeBytes | integer | – | Set when save=true. |
| title | string|null | – | – |
No examples provided.
plots.leaderboard 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.
| Name | Type | Req | Description |
|---|---|---|---|
| dataset_id | string | yes | Dataset to chart, e.g. "BNCI2014_001" (see catalog.leaderboard). |
| save | boolean | – | Also write the PNG to NIMBUS_EXPORT_DIR/plots/ and return its path. |
| track | string | – | "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… |
| Name | Type | Req | Description |
|---|---|---|---|
| meta | object | – | Figure sidecar. foundation.compare includes results/best/skipped (also as a JSON text content block). |
| mimeType | string | – | – |
| ok | boolean | yes | – |
| savedPath | string | – | Set when save=true. |
| sizeBytes | integer | – | Set when save=true. |
| title | string|null | – | – |
No examples provided.
project.create Project.Create ~54
Create a project (container for one pipeline document). Returns projectId.
| Name | Type | Req | Description |
|---|---|---|---|
| description | – | – | Optional longer description shown in the studio. |
| name | string | yes | Project display name (e.g. "MI CSP-LDA sweep"). |
Structured output declared, but exposes no named fields.
No examples provided.
project.delete 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.
| Name | Type | Req | Description |
|---|---|---|---|
| confirm | boolean | – | MUST be true to delete — the explicit user go-ahead. |
| project_id | string | yes | Project to delete (from project.create/project.list). |
Structured output declared, but exposes no named fields.
No examples provided.
project.list 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 Project.Load ~38
Load a project's saved pipeline (train graph + meta) for editing/re-running.
| Name | Type | Req | Description |
|---|---|---|---|
| project_id | string | yes | Project whose pipeline document to load. |
Structured output declared, but exposes no named fields.
No examples provided.
project.save 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.
| Name | Type | Req | Description |
|---|---|---|---|
| expected_revision | integer | yes | Optimistic-concurrency base from project.load / a prior save. Required. |
| name | – | – | Optional pipeline name stored on the document. |
| project_id | string | yes | Target project (from project.create/project.list). |
| subject | – | – | Optional dataset subject code (e.g. "S01") for this pipeline. |
| train_graph | object | yes | Pipeline graph {nodes, connections} to persist. |
Structured output declared, but exposes no named fields.
No examples provided.
protocol.export_stats 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.
| Name | Type | Req | Description |
|---|---|---|---|
| assignment_id | string | yes | The assignment to analyze (from start_assignment). |
Structured output declared, but exposes no named fields.
No examples provided.
protocol.list 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 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.
| Name | Type | Req | Description |
|---|---|---|---|
| session_id | string | yes | The deploy session to pause. |
Structured output declared, but exposes no named fields.
No examples provided.
protocol.resume 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).
| Name | Type | Req | Description |
|---|---|---|---|
| chunk_size | integer | – | Samples per streamed chunk (default 125). |
| n_channels | integer | – | Session channel count (the built-in template opens 4). |
| session_id | string | yes | The deploy session to resume. |
Structured output declared, but exposes no named fields.
No examples provided.
protocol.save 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.
| Name | Type | Req | Description |
|---|---|---|---|
| confirm | boolean | – | MUST be true to write. |
| spec | object | yes | Wire-format protocol document (validate first to iterate). |
Structured output declared, but exposes no named fields.
No examples provided.
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
claude mcp add --transport http nimbusbci-nimbus-mcp 'https://nimbus-mcp.fly.dev/mcp'
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.