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

Nimbus BCI

PYPI · NIMBUS-MCP · 2 COMPONENTS

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

+4 this week 75 Trust /100

Last scanned (3 hours ago)

Scores higher than 71% of PyPI servers

Category Health and Science

Trust breakdown (7 categories)

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
Changelog

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

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

Diagnostics

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

Captured 24 Oct 2026 · 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 →

MCP tools · 63 exposed · ~8,987 tokens

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

Tool Tokens
account.whoami ~95

Who you are authenticated as: account email, plan (isPro / pioneer), this month's free-run quota, and — with a hosted token — the token name and days until it expires. Call this first when setup guidance appears or to check which credential a session uses. In anonymous Local Free mode there is no account: the response says so (mode/tier) instead of demanding a login.

Input schema present but exposes no named parameters.

Structured output declared, but exposes no named fields.

No examples provided.

bids.export_dataset ~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.

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

Structured output declared, but exposes no named fields.

No examples provided.

bids.export_execution ~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.

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

Structured output declared, but exposes no named fields.

No examples provided.

calibration.pause ~35

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

NameTypeReqDescription
execution_idstringyesThe calibration run to pause.

Structured output declared, but exposes no named fields.

No examples provided.

calibration.resume ~27

Resume a paused calibration session.

NameTypeReqDescription
execution_idstringyesThe calibration run to resume.

Structured output declared, but exposes no named fields.

No examples provided.

calibration.start ~311

Start a guided subject calibration session (NON-BLOCKING; confirm-gated — the device goes on a human's head). The Nimbus Studio app shows the cues on its calibration dashboard automatically; poll calibration.status. Requires a Pro plan (hosted token or Pro session): calibration nodes and custom-data training are gated by the freemium node policy; local X-MCP-Key principals pass only when the desktop app flags the signed-in Pro session (MCP_LOCAL_IS_PRO).

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

Structured output declared, but exposes no named fields.

No examples provided.

calibration.status ~64

Live snapshot of a calibration session (phase, current trial, progress, paused). Once complete, carries the recorded upload — call calibration.train to turn it into the subject's own classifier.

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

Structured output declared, but exposes no named fields.

No examples provided.

calibration.train ~247

Train the subject's own classifier from a COMPLETED calibration session (NON-BLOCKING). Fetches the recorded upload, wires it into a train pipeline as a custom_data source, and starts the run. Requires a Pro plan (custom_data training is freemium-gated). The calibrate→train handoff resolves on every backend, desktop-local included; only recordings made before the desktop execution-linkage build resolve no upload — rerun calibration.start for those.

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

Structured output declared, but exposes no named fields.

No examples provided.

catalog.datasets ~56

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

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

Structured output declared, but exposes no named fields.

No examples provided.

catalog.leaderboard ~269

Public benchmark leaderboard: pipeline rankings per dataset. Two tracks: the top-level ``within_session`` block (curated suite pipelines) and ``crossSubject`` (leave-one-subject-out — curated pipelines plus BYO ``python_model`` submissions; BYO rows carry ``kind: "byo"`` and an ``owner`` name). Within each dataset, ``rows`` sort desc by ``meanAccuracyPct`` (95% CI in ``ciLoPct``/``ciHiPct``). ``packFingerprint`` identifies the exact dataset pack behind the scores; ``updated`` marks each dataset's most recent run. The ``pretrainedFewTrial`` efficiency track means: accuracy at a protocol-fixed 100-trials-per-subject budget — the frozen-backbone / few-parameter rows that matter when calibration data is scarce (``paramsTrained`` shown per row so cost is readable next to accuracy). ``submittableDatasets`` is the set open for ``leaderboard.submit``; a dataset can appear under ``crossSubject`` and still be closed for new submissions.

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

Structured output declared, but exposes no named fields.

No examples provided.

catalog.node_schema ~48

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

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

Structured output declared, but exposes no named fields.

No examples provided.

catalog.nodes ~73

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

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

Structured output declared, but exposes no named fields.

No examples provided.

catalog.template ~49

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

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

Structured output declared, but exposes no named fields.

No examples provided.

catalog.templates ~31

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

Input schema present but exposes no named parameters.

Structured output declared, but exposes no named fields.

No examples provided.

data.delete_upload ~92

Delete an uploaded file from your account (disk + registry). Requires confirm=True. Pass the path returned by data.upload (file.path). Only your own uploads can be deleted; missing paths return not-found.

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

Structured output declared, but exposes no named fields.

No examples provided.

data.inspect_dataset ~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.

NameTypeReqDescription
datasetstringyesDataset id from catalog.datasets (e.g. "BNCI2014_001").
modestring–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 ~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.

NameTypeReqDescription
pathstringyesABSOLUTE 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 ~234

Upload an EEG file (.edf/.bdf/.mat/.csv/.txt/.tsv/.h5/.hdf5, <=500MB) to the backend and get the registered path for a custom_data node. sampling_rate (Hz, e.g. 250.0) is REQUIRED for plain CSV/TSV/TXT files without embedded metadata — uploads without it are rejected (no silent 250 Hz assumption). format overrides extension-based detection (auto, mat, csv, tsv, txt, edf, bdf, h5, hdf5).

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

Structured output declared, but exposes no named fields.

No examples provided.

device.list ~32

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

Input schema present but exposes no named parameters.

Structured output declared, but exposes no named fields.

No examples provided.

device.test ~148

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

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

Structured output declared, but exposes no named fields.

No examples provided.

execution.artifacts ~42

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

NameTypeReqDescription
execution_idstringyesRun whose artifacts to list.

Structured output declared, but exposes no named fields.

No examples provided.

execution.cancel ~32

Cancel a running execution.

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

Structured output declared, but exposes no named fields.

No examples provided.

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

NameTypeReqDescription
confirmboolean–MUST be true to delete — the explicit user go-ahead.
execution_idstringyesThe run to delete (from execution.run/execution.list).

Structured output declared, but exposes no named fields.

No examples provided.

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.

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

Structured output declared, but exposes no named fields.

No examples provided.

execution.get ~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.

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

Structured output declared, but exposes no named fields.

No examples provided.

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.

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

Structured output declared, but exposes no named fields.

No examples provided.

execution.results ~74

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

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

Structured output declared, but exposes no named fields.

No examples provided.

execution.run ~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.

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

Structured output declared, but exposes no named fields.

No examples provided.

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

NameTypeReqDescription
confirmboolean–MUST be true to delete — the explicit user go-ahead.
experiment_idstringyesThe experiment to delete (from experiment.run).

Structured output declared, but exposes no named fields.

No examples provided.

experiment.get ~265

Experiment snapshot: status (running/completed/failed), per-run rows ({name, executionId, status, error?, metrics?, evaluationKind?}) and, once finished, aggregates over completed runs only: per-metric {mean, std, best, n}, plus ``pooledExecutionIds`` / ``pooledRunNames`` / ``kindBreakdown`` (per-subject vs LOSO etc. — each row has kind, n, mean, std, executionIds, runNames; #470). Pooled headline means are unchanged; kindBreakdown labels what was pooled. std is population; None below 2 values. kindBreakdown is always present when aggregates exist (including single-kind experiments). PORTABILITY: experiment records are stored on the Nimbus server under your account, so any entry point (local stdio, hosted gateway, another machine) signed in with the same account/token can read them; the serving process and the local ~/.nimbus/experiments store remain as fast-path caches. Experiments run before server-side storage landed exist only in the origin machine's local store and read as unknown elsewhere (#518).

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

Structured output declared, but exposes no named fields.

No examples provided.

experiment.run ~236

Run 1-25 pipelines as ONE paced experiment (NON-BLOCKING). Returns an experimentId immediately; a background thread submits at most 2 runs at a time (min(max_concurrent, 2)), retries queue-full up to 3 times per run, and polls each execution to completion. Poll experiment.get() for per-run status and, once finished, aggregated metrics. PORTABILITY: the experiment record is written through to the Nimbus server under your account (at start and at completion), so experiment.get works from ANY entry point — local stdio, hosted gateway, another machine — signed in with the same account/token. If the server is unreachable when the experiment starts it still runs and polls locally, but other entry points cannot read it until a write-through succeeds (#518).

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

Structured output declared, but exposes no named fields.

No examples provided.

foundation.compare ~254

Run every available pretrained backbone on YOUR data and see which wins — a ranked bar chart with CI whiskers, params, and wall time per backbone. Backbones that can't process your data (window size, channel count) are noted, not silently skipped. Each backbone embeds your trials frozen (the exact foundation_features preprocessing), a LDA is cross-validated on the embeddings. Returns a PNG image PLUS a JSON text block (and structuredContent.meta.results) with per-backbone accuracy, CI, embed dim, params, and time — pick the foundation_features backbone by measurement, not vibes.

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

No examples provided.

leaderboard.mine ~20

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

Input schema present but exposes no named parameters.

Structured output declared, but exposes no named fields.

No examples provided.

leaderboard.status ~68

Fetch one of your leaderboard submissions (owner-only). Returns status (queued | scoring | done | failed), metrics when done (meanAccuracyPct + CI, same shape as leaderboard rows), or the error that failed it.

NameTypeReqDescription
submission_idstringyesThe submissionId returned by leaderboard.submit.

Structured output declared, but exposes no named fields.

No examples provided.

leaderboard.submit ~629

Submit a BYO python_model to a leaderboard track for server-side scoring. Nimbus scores it server-side under the track's fixed protocol — you submit code, never results. Poll ``leaderboard.status`` with the returned ``submissionId``; scoring takes minutes (classical) to tens of minutes (deep). Requirements must be plain PyPI names/specs (max 20, no URLs). Identical code resubmission is idempotent per track (``deduplicated: true``). Verification contract (tier model X10): ``verification="verified"`` (default) is the server-side-scored submission above — on the hosted backend it is Pro-only; free accounts get a structured tier response. ``verification="unverified_local"`` names the designed Account-Free lane for locally-computed results; the backend has no unverified submission kind yet (see the response it returns — nothing is stored, and no row is faked). Anonymous callers get a structured login prompt: a submission needs an identity. Local (desktop/dev) backends keep their existing server-side quota behaviour.

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

Structured output declared, but exposes no named fields.

No examples provided.

pipeline.export ~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``.

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

Structured output declared, but exposes no named fields.

No examples provided.

pipeline.validate ~70

Validate a pipeline graph before running. ExecGraphSnapshot: {nodes: [{id, type, config}], connections: [{from, to}]}. Build it from catalog.template(id).train or from scratch using catalog.nodes().

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

Structured output declared, but exposes no named fields.

No examples provided.

pipeline.validate_node ~141

Validate one node's config (schema + semantic checks). Catches the same value errors as pipeline.validate for a single node (inverted bandpass, CSP components vs channel count when dataset is set).

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

Structured output declared, but exposes no named fields.

No examples provided.

plots.confusion ~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.

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

No examples provided.

plots.dataset ~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.

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

No examples provided.

plots.erp ~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.

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

No examples provided.

plots.leaderboard ~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.

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

No examples provided.

project.create ~54

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

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

Structured output declared, but exposes no named fields.

No examples provided.

project.delete ~91

Delete a project (and its saved pipeline document) from the studio workspace. Requires confirm=True: this removes the project from the user's project list. Executions already run from it are not affected. Find ids with project.list.

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

Structured output declared, but exposes no named fields.

No examples provided.

project.list ~20

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

Input schema present but exposes no named parameters.

Structured output declared, but exposes no named fields.

No examples provided.

project.load ~38

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

NameTypeReqDescription
project_idstringyesProject whose pipeline document to load.

Structured output declared, but exposes no named fields.

No examples provided.

project.rename ~46

Rename a project you own (max 200 characters).

NameTypeReqDescription
namestringyesNew display name.
project_idstringyesProject to rename (from project.create/project.list).

Structured output declared, but exposes no named fields.

No examples provided.

project.save ~174

Save a pipeline graph into a project (visible on the studio canvas). Always pass expected_revision from the last project.load (or a prior save/create response). When it does not match the current server revision, the save fails with a conflict — it does NOT silently overwrite concurrent edits. Omitting it is rejected so a stale single-writer convenience path cannot wipe another client's work.

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

Structured output declared, but exposes no named fields.

No examples provided.

protocol.export_stats ~133

Paired pre/post analysis for one assignment's recorded sessions: per-block aggregates (descriptive + CSV), paired t / Wilcoxon / dz (per-statistic minimums: paired t and Cohen's dz need ≥ 3 completed sessions, Wilcoxon needs ≥ 5), specificity notes, the adaptive-threshold trajectory, and a pre/post figure (base64 PNG — render or save it to look at the effect). An assignment with no recordings yet returns the empty payload with a note, never an error.

NameTypeReqDescription
assignment_idstringyesThe assignment to analyze (from start_assignment).

Structured output declared, but exposes no named fields.

No examples provided.

protocol.list ~17

Every saved protocol id at its latest version.

Input schema present but exposes no named parameters.

Structured output declared, but exposes no named fields.

No examples provided.

Install

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

# add to Claude Code
claude mcp add nimbusbci-nimbus-mcp -- uvx nimbus-mcp
Common questions

What is the Nimbus BCI MCP server?

Nimbus BCI is an MCP server listed in the public MCP registry as io.github.nimbusbci/nimbus-mcp. AI agents build, train, and analyze BCI/EEG pipelines: data, models, experiments, live sessions. This page covers its 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.