nimbus-mcp
OfficialServer Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| NIMBUS_TOKEN | No | A hosted API token (nimb_…) minted in Nimbus Studio → Account → API tokens. Used for hosted mode authentication. | |
| NIMBUS_API_URL | No | The URL of the Nimbus backend API. Defaults to http://127.0.0.1:8080, or the store's api_url after a login. | http://127.0.0.1:8080 |
| NIMBUS_MCP_KEY | No | A local MCP key that must match MCP_LOCAL_KEY on a local backend. Used for local mode authentication. | |
| NIMBUS_EXPORT_DIR | No | Directory for exported artifacts. Defaults to ~/nimbus-exports. | ~/nimbus-exports |
| NIMBUS_TOKEN_FILE | No | Path to a 0600 JSON file {"token": "…"} containing a hosted API token. Keeps the secret out of process env and MCP configs. | |
| NIMBUS_MCP_KEY_FILE | No | Path to a 0600 JSON file {"key": "…"} containing a local MCP key. Consulted only when NIMBUS_MCP_KEY is unset. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| logging | {} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| whoamiA | 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. |
| list_nodesA | List Nimbus pipeline node types (data, preprocessing, features, models...). Use get_node_schema(node_type) for one node's full config schema and ports. |
| get_node_schemaB | Full config JSON schema + input/output ports for one node type. |
| list_templatesA | List built-in starter pipelines (MI/P300/SSVEP...). get_template(id) for the graph. |
| get_templateB | Full template incl. the 'train' execGraph needed by run_pipeline/validate_pipeline. |
| list_datasetsC | Curated public EEG datasets (MOABB packs) available to pipelines. |
| get_leaderboardA | Public benchmark leaderboard: pipeline rankings per dataset. Rankings are per-dataset under the canonical |
| validate_pipelineA | Validate a pipeline graph before running. ExecGraphSnapshot: {nodes: [{id, type, config}], connections: [{from, to}]}. Build it from get_template(id).train or from scratch using list_nodes(). |
| validate_node_configB | Validate one node's config object against its schema (get_node_schema). |
| run_pipelineA | Start a pipeline run (NON-BLOCKING). Returns executionId — poll with get_execution() until status is completed/failed, then get_results(). layout is optional canvas positions ({nodes: {id: {x, y}}}); a grid is synthesized when omitted. |
| cancel_executionC | Cancel a running execution. |
| get_executionB | Execution status summary (status: running/completed/failed/cancelled). |
| list_executionsC | Recent executions. Optional status filter (running/completed/failed/cancelled). |
| get_resultsA | Metrics for a completed run. Trimmed by default (accuracy, kappa, ITR, confusion matrix, per-class); full=True returns the complete result object. |
| run_experimentA | 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 get_experiment() for per-run status and, once finished, aggregated metrics. |
| get_experimentB | Experiment snapshot: status (running/completed/failed), per-run rows ({name, executionId, status, error?, metrics?}) and, once finished, aggregates {metric: {mean, std, best: {name, value}}} over completed runs only (std = population; None below 2 values). |
| list_artifactsC | Trained artifacts (models/filters, e.g. *.pkl) saved by an execution. |
| download_artifactB | Download one artifact file to NIMBUS_EXPORT_DIR/executions// and return its path. |
| export_pythonC | Export the pipeline as a standalone runnable Python bundle (zip saved locally). |
| list_devicesA | EEG devices supported by this backend (OpenBCI, Muse, BrainBit, LSL, PiEEG...). |
| test_deviceA | Test a device connection WITHOUT starting a stream (safe, no confirm needed). |
| start_streamA | Connect an EEG device and START a live streaming session on the user's head. Requires confirm=True; call test_device first. Track with stream_status(). Idle watchdog: if no stream_status()/get_live_session() poll happens for idle_timeout_sec (default 900), the session is stopped and the device disconnected automatically — an abandoned stream never keeps running on the user's head. Any poll resets the timer; idle_timeout_sec=0 disables the watchdog. |
| stream_statusA | Live snapshot of a streaming session (running, deviceConnected). Polling this also feeds the idle watchdog: each call resets the session's idle timer (see start_stream's idle_timeout_sec). |
| stop_streamA | Stop a streaming session and disconnect the device (always safe to call). Also removes the session from the idle watchdog so it cannot fire after an explicit stop. |
| get_live_sessionA | Live snapshot of a streaming session: latest prediction + recent window, signal quality (meanChannelQuality, snrDb, artifactProbability), indicators, running stats. Poll this while a session runs. Live telemetry requires a DEPLOYED model session (hub deploy / playback with a classifier); modelless hardware streams have no telemetry — use stream_status for those. Expect low confidence during filter/ASR warm-up (first seconds); quality < 0.5 or high artifactProbability means the signal is poor. 404 => session not active in this backend. Each poll also feeds the idle watchdog (see start_stream's idle_timeout_sec), keeping an actively watched session alive. |
| upload_dataA | 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 — the backend silently assumes 250 Hz otherwise, which mis-times epochs, filters and spectral features. format overrides extension-based detection (auto, mat, csv, tsv, txt, edf, bdf, h5, hdf5). |
| inspect_datasetA | 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 list_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. |
| inspect_fileA | 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 upload_data 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). |
| create_projectB | Create a project (container for one pipeline document). Returns projectId. |
| list_projectsB | List projects owned by the current principal (agent work included). |
| save_pipelineB | Save a pipeline graph into a project (visible on the studio canvas). Handles revision conflicts automatically (one retry). |
| load_pipelineB | Load a project's saved pipeline (train graph + meta) for editing/re-running. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 32 tools
Most tools target distinct actions/resources, but a few pairs overlap: stream_status vs get_live_session both poll a live session, and inspect_dataset vs inspect_file give near-identical exploratory summaries for different sources. Descriptions help disambiguate, but an agent may still hesitate between them.
Names are predominantly consistent snake_case verb_noun (list_nodes, get_template, run_pipeline). Minor deviations like whoami and stream_status break the exact verb_noun pattern but remain readable and conventional.
32 tools is heavy for a single MCP server; several subdomains (streaming, pipelines, datasets, projects, artifacts) could be consolidated. While each tool has a purpose, the set exceeds the 25-tool threshold where navigation becomes cumbersome.
The surface covers major workflows: device streaming, pipeline building/validation/execution, experiments, datasets, projects, and artifacts. Minor gaps exist (no delete/update for projects, pipelines, or artifacts), but agents can work around them.