Nimbus BCI
PYPI · NIMBUS-MCP · 2 COMPONENTS
AI agents build, train, and analyze BCI/EEG pipelines: data, models, experiments, live sessions.
Available components
Last scanned (3 hours ago)
Scores higher than 71% of PyPI servers
Category Health and Science
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security100
- No malware found by supply-chain analysis.Pass
- No known CVEs affecting this package version or its production dependencies.Pass
- Runs hatchling.build at install time, a recognised build step with no custom scripting around it. View diagnostics → Pass
- 1 of 22 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency32
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
- Licence could not be checked: the licence is declared in free text we could not match to a standard (SPDX) licence identifier, so we cannot tell whether it is OSI-approved.Unverified
- Actively maintained (last published 1 days ago).Pass
- Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability81
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 10014 tokens (~158/item across 63 items; 63 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management46
- Stability check failed: the tool surface changed between 0.11.0 and 0.14.17: 0 tool removals, 1 breaking changes, 20 additions. See how to fix → Fail
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
- Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- All 4 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
- An AI judge read all 64 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a current MCP spec version (2026-07-28).Pass
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.
- 24 Oct 26 +15
- Malware scan: unverified → pass ▲ security
- 23 Oct 26 −12
- Malware scan: pass → unverified ▼ security
- Schema quality: unverified → 100 ▲ functional
- Package version: 0.14.15 → 0.14.17 functional
- 22 Oct 26 +15
- Malware scan: unverified → pass ▲ security
- 21 Oct 26 +1
- Malware scan: unverified → pass ▲ security
- Package version: 0.14.11 → 0.14.15 functional
- 20 Oct 26 0
- Malware scan: unverified → pass ▲ security
- Package version: 0.14.8 → 0.14.11 functional
- 19 Oct 26 −15
- Malware scan: pass → unverified ▼ security
- Stability: 0.27 → fail ▼ security
- Package version: 0.14.4 → 0.14.8 functional
- 18 Oct 26 0
- Tool safety: pass → unverified ▼ security
- Stability: 0.23 → unverified ▼ security
- Tool coverage: 100 → unverified ▼ functional
- Capabilities: pass → unverified ▼ functional
- Destructive annotations: pass → 100 functional
- Package version: 0.14.2 → 0.14.4 functional
- 17 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 20 to 23. That category is still filling its 30-day observation window: 6 days of observed history at the previous scan, 7 at this one. The score rises as the window fills, whether or not the server changes.
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 · Analysed pypi/nimbus-mcp@0.14.17
Provenance No attestation
The registry publishes no build provenance for this version, so there is nothing to verify.
| Result | No attestation |
|---|---|
| Ecosystem | pypi |
| Reason | No attestation published |
Background: How many MCP packages publish verified provenance →
Install scripts 1 script
| Hook | Tier | Command |
|---|---|---|
| build_backend | allowlisted | hatchling.build |
Background: Why install scripts are a supply-chain risk →
Dependencies 22 packages
| Packages resolved | 22 |
|---|---|
| Stale | 1 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
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 ~241
Export a Nimbus dataset as a BIDS-layout zip (local: saved to NIMBUS_EXPORT_DIR/bids/; hosted gateway: inline ``contentBase64``, up to 1 MB). Continuous sources (EDF/BDF uploads, stream recordings) export as BIDS-raw (EDF byte-passthrough; recordings converted HDF5→EDF with events.tsv). Epoched sources (MOABB packs, trial-table uploads) export as BIDS-derivatives (data passthrough + descriptive trial_index/label/session/run events — no fabricated onsets). The zip embeds nimbus_export_manifest.json with sha256s.
| 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 ~108
Export an execution's results as a BIDS-derivative zip (metrics.json, per-subject participants.tsv, protocol.json, full pipeline_snapshot.json, predictions.tsv when stored, provenance/execution.json). Local: saved to NIMBUS_EXPORT_DIR/bids/. Hosted gateway: inline ``contentBase64`` (up to 1 MB of base64); larger zips point to Nimbus Studio.
| 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 ~239
Exploratory summary of a public EEG dataset (MOABB pack): channels, sampling rate, trial/class balance, per-channel µV stats, band powers and a PSD overview. Look at the data BEFORE building pipelines: class balance drives stratification choices (imbalanced classes skew accuracy), and flatlined channels mean a montage/reference problem worth fixing first. subject defaults to the dataset's catalog ``defaultSubject`` (see catalog.datasets), e.g. "S01"; a comma-list like "S01,S03" loads a cohort. mode: training | evaluation | all. Units note: values are ASSUMED volts by the loader — a µV-native file reads 1e6x too large; set unitsScale in a pipeline's custom_data config when needed.
| 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 | – | – | Subject code ("S01") or comma-list cohort ("S01,S03"); defaults to the catalog defaultSubject. |
Structured output declared, but exposes no named fields.
No examples provided.
data.inspect_file Data.Inspect File ~336
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). CSV/TSV/TXT files have no embedded sampling rate: pass sampling_rate (Hz) for them — the backend never assumes 250 Hz. Formats that embed their rate (EDF/BDF/MAT/H5) ignore it.
| 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). |
| sampling_rate | – | – | Hz for CSV/TSV/TXT files (REQUIRED there, e.g. 250.0). |
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.delete Execution.Delete ~85
Permanently delete one of your finished runs (completed/failed/cancelled) with its results. Running runs must be cancelled first (409 nimbus.execution.delete_not_terminal). Owner only.
| Name | Type | Req | Description |
|---|---|---|---|
| confirm | boolean | – | MUST be true to delete — the explicit user go-ahead. |
| execution_id | string | yes | The run to delete (from execution.run/execution.list). |
Structured output declared, but exposes no named fields.
No examples provided.
execution.download_artifact Execution.Download Artifact ~110
Download one artifact file. Local/stdio: saved to NIMBUS_EXPORT_DIR/executions/<id>/ and its path returned. Hosted gateway: returned inline as ``contentBase64`` (up to 1 MB of base64); larger files point to Nimbus Studio. Nothing is written on the gateway.
| 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 ~109
Execution status summary (status: running/completed/failed/cancelled). Summary fields: ``dataset`` is the human-readable display label (e.g. "BCIIV2a"); ``datasetId`` is the catalog id (e.g. "BNCI2014_001") accepted by other tools (data.inspect_dataset, public_data.dataset). ``title`` is the run name shown in Studio.
| 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 ~127
Recent executions. Optional status filter (running/completed/failed/cancelled). Per-run fields: ``dataset`` is the human-readable display label (e.g. "BCIIV2a"); ``datasetId`` is the catalog id (e.g. "BNCI2014_001") accepted by other tools (data.inspect_dataset, public_data.dataset). ``title`` is the run name shown in Studio.
| 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 ~239
Start a pipeline run (NON-BLOCKING). Returns executionId — poll with execution.get() until status is completed/failed, then execution.results(). If an identical graph is already running for you, the run still starts but the response carries a ``warning`` + ``duplicateOf`` ids (cancel one with execution.cancel to avoid paying twice). The server runs a limited number of executions at once (3 by default); when all slots are busy the call fails immediately with 429 nimbus.execution.queue_full and a retryAfter (seconds) — wait, then retry.
| 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.delete Experiment.Delete ~79
Delete one of your experiment records (server + this machine's local cache). Its individual runs are kept — delete them with execution.delete. A still-running experiment cannot be deleted.
| Name | Type | Req | Description |
|---|---|---|---|
| confirm | boolean | – | MUST be true to delete — the explicit user go-ahead. |
| experiment_id | string | yes | The experiment to delete (from experiment.run). |
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 ~113
Export the pipeline as a standalone runnable Python bundle (zip). Local/stdio: the zip is saved under NIMBUS_EXPORT_DIR/exports and its path returned. Hosted gateway: the zip is returned inline as ``contentBase64`` (up to 1 MB of base64). UI-only nodes (interactive_application) are left out and listed in ``exportNotes``.
| 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 ~163
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 | – | Local/stdio: also write the PNG to NIMBUS_EXPORT_DIR/plots/ and return its path. Ignored on the hosted gateway (the image is returned inline). |
| 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 ~321
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 | – | Local/stdio: also write the PNG to NIMBUS_EXPORT_DIR/plots/ and return its path. Ignored on the hosted gateway (the image is returned inline). |
| 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 ~243
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 | – | Local/stdio: also write the PNG to NIMBUS_EXPORT_DIR/plots/ and return its path. Ignored on the hosted gateway (the image is returned inline). |
| 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 ~230
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 | – | Local/stdio: also write the PNG to NIMBUS_EXPORT_DIR/plots/ and return its path. Ignored on the hosted gateway (the image is returned inline). |
| 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.rename Project.Rename ~46
Rename a project you own (max 200 characters).
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | New display name. |
| project_id | string | yes | Project to rename (from project.create/project.list). |
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.
How do I install the Nimbus BCI MCP server?
Nimbus BCI runs locally as a PyPI package, launched with uvx nimbus-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
pypi · nimbus-mcp
claude mcp add nimbusbci-nimbus-mcp -- uvx nimbus-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 PyPI package (nimbus-mcp).
Is the Nimbus BCI MCP server safe to use?
Nimbus BCI scores 75 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 24 October 2026. 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 63 tools: account.whoami, catalog.nodes, catalog.node_schema, catalog.templates, catalog.template, and 58 more. Their descriptions and schemas cost roughly 8,987 tokens of context every time the server is loaded.
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.