Skip to main content
Glama

srunx

A unified CLI, web dashboard, and Python API for SLURM job management.

Stop juggling sbatch scripts, squeue loops, and SSH sessions.

PyPI Downloads Python 3.12+ License CI Docs Ask DeepWiki

  • Submit & manage SLURM jobs from CLI, browser, or Python

  • Orchestrate multi-step workflows with YAML and dependency graphs

  • Monitor GPU availability and job states with Slack notifications

  • Local or remote, one CLI — target a local SLURM or any SSH'd cluster with --profile <name>; no shell-in, no separate "remote" commands — the same verbs you already know

  • Container-native — Pyxis, Apptainer, and Singularity support built in

Installation

Requires Python 3.12+ and access to a SLURM cluster (local or via SSH).

uv add srunx             # with uv (recommended)
pip install srunx        # or with pip

The web dashboard and Slack notifications are included in the base install — no extras required.

For AI agent integration (MCP server), add the mcp extra:

uv add "srunx[mcp]"

Related MCP server: secure-cluster-mcp

Quick Start

Submit a job, wait for it, and view the logs — end to end:

# 1. Submit
$ srunx sbatch --job-name training --gpus-per-node 2 --conda ml_env --wrap "python train.py"
✅ Submitted job training (id=847291)

# 2. Follow until completion
$ srunx watch jobs 847291
⠋ 847291 training  PENDING  →  RUNNING  →  COMPLETED (4m 12s)

# 3. Inspect output
$ srunx tail 847291 -n 20

Or describe the whole pipeline once and let srunx drive it:

srunx flow run workflow.yaml

Same commands, remote cluster

Every command above accepts --profile <name> and dispatches transparently over SSH — same syntax, same output, same feel as local:

srunx sbatch --profile dgx --job-name training --gpus-per-node 2 --conda ml_env --wrap "python train.py"
srunx squeue --profile dgx
srunx tail   --profile dgx 847291 --follow
srunx flow run pipeline.yaml --profile dgx

srunx rsyncs your code under a per-mount lock, runs sbatch in place on the remote, and streams logs back. Your shell never leaves the laptop.

Why srunx?

Instead of stitching together sbatch, squeue, SSH, and a pipeline runner, srunx offers one coherent surface that covers the day-to-day SLURM loop.

Capability

srunx

submitit

simple-slurm

Snakemake

CLI for submit / status / cancel

✅

❌

❌

⚠️ partial

Python API

✅

✅

✅

✅

Web dashboard

✅

❌

❌

❌

Workflow DAG with dependencies

✅

❌

❌

✅

Inter-job value passing (load-time)

✅

❌

❌

⚠️ via files

Matrix parameter sweeps

✅

⚠️ manual

❌

⚠️ via wildcards

GPU availability monitoring

✅

❌

❌

❌

SSH remote submit + file sync

✅

❌

❌

❌

Container support (Pyxis / Apptainer / Singularity)

✅

⚠️ limited

❌

⚠️ via rules

Slack notifications

✅

❌

❌

⚠️ plugin

If you need full-featured scientific workflow tooling, Snakemake / Nextflow are still the right call. srunx targets the sweet spot of "SLURM + a few dependencies + a nice UI" without Airflow-scale infrastructure.

CLI

Every command below runs locally or against a remote cluster over SSH. Add --profile <name> (or set $SRUNX_SSH_PROFILE) and sbatch / squeue / sinfo / sacct / history / gpus / tail / watch / flow run transparently dispatch through the SSH adapter — no shell-in first, no separate "remote" subcommand. srunx ssh is just for managing those profiles (add / list / sync / test); it does not run jobs itself.

Type column: SLURM = mirrors the native SLURM CLI (muscle memory maps directly); srunx = srunx-original command with no direct SLURM counterpart.

Job submission & control (SLURM parity)

Command

Type

Description

srunx sbatch <script> / srunx sbatch --wrap "<cmd>"

SLURM

Submit a SLURM job

srunx scancel <id>

SLURM

Cancel a job

Status & accounting

Command

Type

Description

srunx squeue

SLURM

List active jobs (use -j <id> for a single job's state)

srunx sinfo

SLURM

Partition / state / nodelist listing (native-sinfo parity)

srunx sacct

SLURM

Real SLURM sacct wrapper (cluster accounting DB)

srunx history

srunx

srunx's own submission history (SQLite-backed)

srunx gpus

srunx

GPU aggregate summary across partitions

srunx tail <id>

srunx

View / stream job logs

srunx watch jobs|resources|cluster

srunx

Watch for state changes / resource availability

Workflows & sweeps

Command

Type

Description

srunx flow

srunx

Run / validate YAML workflows

srunx flow run --arg KEY=VALUE

srunx

Override workflow args from the CLI

srunx flow run --sweep KEY=V1,V2 --max-parallel N

srunx

Ad-hoc matrix parameter sweep

Environment & tooling

Command

Type

Description

srunx ssh

srunx

Manage SSH profiles (add / list / sync / test) — remote execution itself is --profile on the commands above

srunx config

srunx

Manage configuration

srunx template

srunx

Manage job templates

srunx ui

srunx

Launch the web dashboard

More CLI examples: User Guide · Python-side counterparts: API Reference

Web Dashboard

A dashboard for visual cluster management. Connect to your SLURM cluster over SSH and manage jobs, workflows, and resources from a browser.

srunx ui                # -> http://127.0.0.1:8000
srunx ui --port 3000    # custom port

Jobs

Browse, search, filter, and cancel jobs.

Workflow DAG

Visualize job dependencies. Run workflows directly from the UI.

Resources

GPU and node availability per partition.

Explorer

Browse remote files via SSH mounts. Shell scripts can be submitted as sbatch jobs directly from the file tree.

Full walkthrough: Web UI tutorial · Web UI how-to · Explorer how-to

Workflow Orchestration

Define pipelines in YAML. Jobs run as soon as their dependencies complete — independent branches execute in parallel automatically.

name: experiment
args:
  model: "bert-base-uncased"
  output_dir: "/outputs/{{ model }}"

jobs:
  - name: preprocess
    command: ["python", "preprocess.py", "--out", "{{ output_dir }}/data"]
    exports:
      DATA_PATH: "{{ output_dir }}/data/processed.parquet"

  - name: train
    command: ["python", "train.py", "--model", "{{ model }}", "--data", "{{ deps.preprocess.DATA_PATH }}"]
    depends_on: [preprocess]
    gpus_per_node: 2
    environment:
      container:
        image: nvcr.io/nvidia/pytorch:24.01-py3
        mounts:
          - /data:/data
    exports:
      MODEL_PATH: "{{ output_dir }}/models/best.pt"

  - name: evaluate
    command: ["python", "eval.py", "--model", "{{ deps.train.MODEL_PATH }}"]
    depends_on: [train]

What this shows off:

  • args with Jinja2 — reusable, parameterized pipelines ({{ model }}, {{ output_dir }})

  • Inter-job exports — parents declare exports:; children read them via {{ deps.<parent>.<key> }}, fully resolved at workflow load time (no runtime env files)

  • Containers per job — Pyxis / Apptainer / Singularity are first-class (environment.container)

  • Dependency-driven scheduling — evaluate blocks on train; parallel branches run automatically

Run it:

srunx flow run workflow.yaml              # execute
srunx flow run workflow.yaml --dry-run    # show plan only
srunx flow run workflow.yaml --from train # resume / partial execution

Retry with retry: N and retry_delay: <seconds> per job.

Parameter Sweeps

Run the same workflow across a matrix of hyperparameters without copying YAML. Each cell materializes into its own sbatch submission and is tracked independently.

name: train
args:
  lr: 0.01
  seed: 1

sweep:
  matrix:
    lr: [0.001, 0.01, 0.1]
    seed: [1, 2, 3]
  fail_fast: false
  max_parallel: 4

jobs:
  - name: train
    command: ["python", "train.py", "--lr", "{{ lr }}", "--seed", "{{ seed }}"]
    gpus_per_node: 1

Run it — or declare the axes ad-hoc on the command line:

srunx flow run train.yaml                                                # YAML-declared sweep
srunx flow run --sweep lr=0.001,0.01 --max-parallel 2 train.yaml          # ad-hoc
srunx flow run --sweep lr=0.001,0.01 --max-parallel 2 --dry-run train.yaml

Sweeps are a first-class concept across CLI, Web UI, and MCP. Web-triggered sweeps route cells through a bounded SlurmSSHExecutorPool against the configured SSH profile, while CLI and MCP runs use the local SLURM client by default. The Web UI surfaces per-cell progress with ETA, filter / sort, and per-cell cancellation.

Full workflow surface (validation, retries, partial execution, sweep recipes): Workflows how-to

Monitoring

# Monitor a job until completion
srunx watch jobs 12345

# Wait for GPUs, then submit
srunx watch resources --min-gpus 4
srunx sbatch --wrap "python train.py" --gpus-per-node 4

# Periodic cluster reports to Slack
srunx watch cluster --schedule 1h --notify $SLACK_WEBHOOK

Full monitoring options (continuous watch, thresholds, scheduled reports): Monitoring how-to

Remote SSH

Keep your local editor workflow while the jobs actually run on the cluster. Configure a profile once, and every srunx command accepts --profile <name> with the same syntax as local:

# One-time setup
srunx ssh add --profile dgx --ssh-host dgx1
srunx ssh mount add --profile dgx --mount ml-exp \
  --local ~/projects/ml-exp --remote /home/user/ml-exp

# Same verbs you already use — now against the remote cluster
srunx sbatch train.sh --profile dgx                   # auto-rsyncs the mount + sbatch runs in-place on the remote path
srunx squeue --profile dgx                            # live queue on the remote cluster
srunx tail 847291 --profile dgx --follow              # stream remote logs
srunx flow run pipeline.yaml --profile dgx            # full DAG: sync once, hold the per-mount lock, submit
  • SSH config hosts, saved profiles, and ProxyJump support

  • Environment variable passthrough (--env KEY=VALUE)

  • File sync via rsync with per-mount locking — auto-detects profile from current directory

Mount model, sync semantics, and in-place execution rules: SSH sync how-to

Slack Notifications

Get notified when jobs finish — set SLACK_WEBHOOK_URL (or configure it in the web dashboard), then append --slack to any srunx flow run command. In Python, pass SlackCallback to the runner (see the Python API section below).

export SLACK_WEBHOOK_URL="https://hooks.slack.com/services/..."
srunx flow run workflow.yaml --slack

MCP Server

srunx ships an MCP server so Claude Code (and other MCP clients) can submit jobs, inspect the queue, and drive workflows over stdio. Install the extra and register the server with your client:

uv add "srunx[mcp]"
srunx-mcp                                                              # launch the stdio server directly

# Or register with Claude Code in one shot
claude mcp add --scope user srunx -- uvx --from 'srunx[mcp]' srunx-mcp

Once connected, the agent can call run_workflow with optional sweep and mount parameters:

run_workflow(
    yaml_path="train.yaml",
    sweep={"matrix": {"lr": [0.001, 0.01]}, "max_parallel": 2},
    transport="dgx",
    mount="my-project",
)

transport="<profile>" selects the remote cluster; the optional mount=<name> translates work_dir / log_dir into that mount's remote paths. mount requires transport — passing mount alone is an error — so the agent can launch mount-aware submissions against a remote cluster without leaving the chat.

Setup + tool-by-tool usage: MCP Setup tutorial · MCP Usage how-to · MCP Tools reference

Python API

The full CLI surface is available as a Python library. Use it inside notebooks, existing Python pipelines, or custom tooling.

Submit and wait:

from srunx import Job, JobResource, JobEnvironment, Slurm

job = Job(
    name="training",
    command=["python", "train.py"],
    resources=JobResource(nodes=1, gpus_per_node=2, time_limit="4:00:00"),
    environment=JobEnvironment(conda="ml_env"),
)

client = Slurm()
completed = client.run(job)  # submit, poll, and return when terminal
print(completed.status, completed.job_id)

Fire-and-track:

submitted = client.submit(job)                 # returns Job with job_id populated
info = client.retrieve(submitted.job_id)       # poll status on demand
client.cancel(submitted.job_id)                # if you change your mind

Run a YAML workflow programmatically, with callbacks:

from srunx.observability.notifications.legacy_slack import SlackCallback
from srunx.runtime.workflow.runner import WorkflowRunner

runner = WorkflowRunner.from_yaml(
    "workflow.yaml",
    callbacks=[SlackCallback(webhook_url="...")],
)
runner.run()                                    # blocks until the DAG finishes

Documentation

Full docs (Diátaxis-structured) at ksterx.github.io/srunx:

Development

git clone https://github.com/ksterx/srunx.git
cd srunx
uv sync --dev

# Full pre-commit quality gate
uv run pytest && uv run mypy . && uv run ruff check .

Contributions welcome — please open an issue or PR on GitHub.

License

Apache-2.0

Available Tools

15 tools
cancel_jobA

Cancel a running or pending SLURM job.

Args:
    job_id: SLURM job ID to cancel
    transport: Cluster selector — omit / "local" for local SLURM, or an
        SSH profile name to cancel on that remote cluster.

Inputs: job_id (required), transport. Returns: object

create_workflowA

Create a SLURM workflow YAML file.

Generates a YAML workflow definition that can be executed with run_workflow.
Each job in the workflow can depend on other jobs, forming a DAG.

Args:
    name: Workflow name for identification
    jobs: List of job definitions. Each job dict should contain:
        - name (required): Job identifier
        - command (required for regular jobs): Command as string or list of strings
        - script_path (required for shell jobs): Path to shell script
        - depends_on: List of job names this job depends on (e.g. ["preprocess"])
          Supports dependency types: "afterok:job_a", "after:job_a", "afterany:job_a"
        - retry: Number of retry attempts on failure (default 0)
        - retry_delay: Seconds between retries (default 60)
        - resources: Dict with nodes, gpus_per_node, ntasks_per_node,
          cpus_per_task, memory_per_node, time_limit, partition, nodelist
        - environment: Dict with conda, venv, env_vars, container
        - log_dir: Log directory path
        - work_dir: Working directory path
    output_path: File path to write the YAML workflow (e.g. "workflow.yaml")
    args: Optional template variables for Jinja2 templating in job definitions
    default_project: Default SSH project/mount name for file syncing

Inputs: jobs (required), name (required), output_path (required), args, +1 more. Returns: object

get_configA

Get the current srunx configuration including resource defaults and environment settings.

Inputs: no named parameters. Returns: object

get_job_logsA

Get stdout/stderr logs for a SLURM job.

Args:
    job_id: SLURM job ID
    job_name: Optional job name to help locate log files
    transport: Cluster selector — omit / "local" for local SLURM, or an
        SSH profile name to fetch logs from that remote cluster.

Inputs: job_id (required), job_name, transport. Returns: object

get_job_statusA

Get the status of a specific SLURM job.

Args:
    job_id: SLURM job ID to check
    transport: Cluster selector — omit / "local" for local SLURM, or an
        SSH profile name to query that remote cluster.

Inputs: job_id (required), transport. Returns: object

get_resourcesA

Get current GPU and node resource availability on the SLURM cluster.

Args:
    partition: Specific partition to check (None for all partitions)
    transport: Cluster selector — omit / "local" for local SLURM, or an
        SSH profile name to query that remote cluster.

Inputs: partition, transport. Returns: object

get_workflowB

Read and parse a workflow YAML file, returning its full structure.

Args:
    yaml_path: Path to the YAML workflow file

Inputs: yaml_path (required). Returns: object

inspect_mountA

Report what syncing a mount would change, without changing anything.

Read-only: this never transfers, deletes, or creates anything on the
cluster. Call it freely, including before a sync you are unsure about.

Its main job is answering a question ``sync_files`` cannot: **what is on the
cluster that no longer exists locally?** A sync is additive, so those files
stay — including code deleted in a local refactor, which a job on the
cluster can still import and run. They are listed here as
``mirror_delete_candidate_paths``.

Those candidates mix two kinds of thing:

* **produced by jobs** — checkpoints, logs, outputs. Must NOT be deleted.
* **left over locally** — stale modules, renamed files. Usually should be.

``stale_upload_paths`` is the second group on its own: paths srunx recorded
uploading that are no longer present locally. Job output was never uploaded,
so it does not appear there — which holds even when the mount's exclude list
misses an output directory, the case that otherwise buries a few stale
scripts among dozens of artifacts.

One exception: output pulled into the local tree with ``srunx ssh sync
--pull`` becomes a file the next push manages, so it is recorded like any
other and can be reported as stale once its local copy is removed. Excluding
the output directories on the mount avoids that, and is worth doing anyway.

**Check ``stale_uploads_known`` first.** When it is false the record could
not answer (nothing uploaded with tracking yet, an unreadable record, or a
changed exclude filter), and ``stale_uploads: 0`` means "could not tell",
not "nothing is stale" — ``stale_uploads_unknown_reason`` says which. Fall
back to reading the full candidate list yourself in that case.

Args:
    transport: SSH profile name to inspect. Required — there is no local
        inspection, and (unlike the CLI) no implicit current-profile
        fallback. Call ``list_ssh_profiles`` for the available profiles and
        the mounts each defines.
    mount: Mount name from that SSH profile.
    max_paths: Cap on how many paths to list. Counts stay exact regardless;
        past the cap the list is omitted rather than shortened, and
        ``mirror_delete_candidate_paths_omitted`` says so.

Returns:
    ``files_would_transfer``, ``mirror_delete_candidates`` (a count),
    ``mirror_delete_candidate_paths``, whether that list was omitted,
    ``effective_exclude_patterns``, and the stale-upload fields described
    above (``stale_uploads_known`` / ``stale_uploads`` /
    ``stale_upload_paths`` / ``stale_uploads_unknown_reason``).

    The exclude list matters for reading the result: excluded paths are
    invisible to this inspection *and* protected from a mirror's deletions,
    so something absent from the candidates may simply be excluded rather
    than in sync.

Inputs: mount (required), transport (required), max_paths. Returns: object

list_jobsB

List SLURM jobs in the queue (all users, like squeue).

Args:
    transport: Cluster selector — omit / "local" for local SLURM, or an
        SSH profile name to query that remote cluster.

Inputs: transport. Returns: object

list_ssh_profilesA

List all configured SSH connection profiles for remote SLURM clusters.

Shows profile names, hostnames, and configured mount points.

Inputs: no named parameters. Returns: object

list_workflowsA

List workflow YAML files in a directory.

Scans the directory for YAML files that contain a valid srunx workflow
structure (must have 'name' and 'jobs' keys).

Args:
    directory: Directory to search for workflow files (default: current directory)

Inputs: directory. Returns: object

run_workflowA

Execute a SLURM workflow from a YAML file.

Jobs are executed in dependency order - independent jobs run in parallel,
dependent jobs wait for their prerequisites to complete.

Args:
    yaml_path: Path to the YAML workflow file
    from_job: Start execution from this job (skip earlier jobs)
    to_job: Stop execution at this job (skip later jobs)
    single_job: Execute only this specific job, ignoring dependencies
    dry_run: If true, show what would be executed without actually running
    args: Optional mapping merged over the YAML ``args`` section before
        Jinja rendering. ``python:`` prefix values are rejected.
    sweep: Optional sweep spec: ``{"matrix": {...}, "fail_fast": bool,
        "max_parallel": int}``. When present, the request goes through
        :class:`SweepOrchestrator` and the response contains
        ``sweep_run_id``.
    transport: Cluster selector — omit / "local" for local SLURM, or an
        SSH profile name to run against that remote cluster. Orthogonal to
        ``mount``: ``transport`` picks *which* cluster, ``mount`` picks the
        path-translation root within it.
    mount: Optional mount name within the SSH profile, enabling mount-aware
        path translation for ``work_dir`` / ``log_dir``. Requires an SSH
        ``transport``; passing ``mount`` with a local transport is an error.

Inputs: yaml_path (required), args, mount, sweep, +5 more. Returns: object

submit_jobB

Submit a SLURM job.

Args:
    command: Shell command to execute (e.g. "python train.py --epochs 100")
    name: Job name for identification in SLURM queue
    nodes: Number of compute nodes to allocate
    gpus_per_node: Number of GPUs per node (0 for CPU-only)
    ntasks_per_node: Number of tasks per node
    cpus_per_task: Number of CPUs per task
    memory_per_node: Memory per node (e.g. "32GB", "64G")
    time_limit: Wall time limit (e.g. "4:00:00", "1-00:00:00")
    partition: SLURM partition name (e.g. "gpu", "cpu")
    nodelist: Specific nodes to use (e.g. "node001,node002")
    conda: Conda environment name to activate before running
    venv: Path to Python virtual environment to activate
    env_vars: Additional environment variables as key-value pairs
    log_dir: Directory for stdout/stderr log files
    work_dir: Working directory for the job (defaults to cwd)
    transport: Cluster selector — omit / "local" for local SLURM, or an
        SSH profile name to submit to that remote cluster.

Inputs: command (required), name, venv, conda, +12 more. Returns: object

sync_filesA

Sync a configured mount from this machine to a remote SLURM cluster.

Copies new and changed files only. Files that exist on the cluster but not
locally are left untouched unless ``delete=True``.

That means a file deleted locally stays on the cluster, where a job can
still pick it up. This tool does not report those — call ``inspect_mount``
to see them. It is read-only, so it is safe to call before or after a sync;
reach for it rather than setting ``delete=True`` to find out what is stale.

Args:
    transport: SSH profile name to sync against. Required and must name
        an SSH profile — there is no local-to-local sync, and (unlike
        the CLI) no implicit current-profile fallback. ``"local"`` is
        rejected. Call ``list_ssh_profiles`` to see profiles and the
        mounts each one defines.
    mount: Mount name from that SSH profile. Only pre-registered mounts
        can be synced; arbitrary paths are not accepted.
    dry_run: Preview only. Reports exactly what would be transferred and
        deleted without touching the cluster. Prefer this first whenever
        you are unsure, and always before a ``delete=True`` run.
    delete: Mirror the mount — also DELETE cluster files that no longer
        exist locally. **This destroys remote-only data** such as
        training checkpoints, job logs, and outputs written by jobs on
        the cluster, which by definition do not exist locally. Leave it
        off unless the user explicitly asked for a mirror, and preview
        with ``dry_run=True`` before running it.
    max_delete: Refuse the mirror, without changing anything, if it would
        delete more than this many **entries**. Entries are files *and*
        directories, matching rsync's own ``--max-delete`` unit: removing
        a directory holding two files counts as three entries (both files
        plus the directory), so set this above the file count you have in
        mind. Guards against mirroring from a wrong or half-populated
        local directory. Must be >= 1; to sync without deleting, leave
        ``delete`` off. Only applies to a real ``delete=True`` run — a
        ``dry_run`` preview is never capped, so it can show the whole list.

Returns:
    On success: ``files_transferred``, ``entries_deleted``, and the
    ``deleted_paths`` list. Past a very large number of deletions the list
    is omitted and ``deleted_paths_omitted`` is set — the count stays
    exact, and no list is ever silently shortened.

    The two counts use different units on purpose, because that is what
    rsync reports: ``entries_deleted`` includes removed directories, while
    ``files_transferred`` counts only regular files whose data actually
    crossed the wire — matching rsync's own "regular files transferred"
    statistic. Directory creations, symlinks, devices, hard links and
    attribute-only touch-ups move no data and are excluded, so a sync can
    legitimately change the remote while reporting zero transfers.

    Counts are reliable; path *strings* have one documented limit. rsync
    separates its flag block from the filename with whitespace whose width
    varies by version, so a filename that itself begins with spaces cannot
    be told apart from that separator, and those leading spaces are lost
    from the reported string. Such a deletion is still counted, so the
    cap and the refusal logic are unaffected.

Inputs: mount (required), transport (required), delete, dry_run, +1 more. Returns: object

validate_workflowA

Validate a workflow YAML file for correctness.

Checks for valid YAML syntax, correct job structure, dependency resolution,
and circular dependency detection.

Args:
    yaml_path: Path to the YAML workflow file to validate

Inputs: yaml_path (required). Returns: object

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A4/5.0

    Scored across 15 tools

    Disambiguation5/5

    Each tool targets a distinct resource and action: job submission, status, logs, and cancellation are cleanly separated, as are workflow create/validate/run/list/get. Even the closely related inspect_mount and sync_files are clearly differentiated as read-only inspection versus actual transfer.

    Naming Consistency5/5

    All tool names follow a consistent verb_noun snake_case pattern, such as list_jobs, get_job_status, submit_job, cancel_job, create_workflow, run_workflow, and sync_files. The naming conventions are predictable and make the tool surface easy to navigate.

    Tool Count5/5

    Fifteen tools is at the upper edge of the ideal range, but each tool earns its place across three coherent subdomains: SSH/resource inspection, SLURM job management, and workflow orchestration. There are no redundant or filler tools.

    Completeness4/5

    The core lifecycle is well covered: jobs can be submitted, listed, monitored, logged, and canceled; workflows can be created, validated, run, listed, and read; file sync includes both preview and mirror modes. Minor gaps exist, such as no workflow update/delete tool and no SSH profile management, but agents can work around these via file/config operations.

    Maintenance

    ActivityNo data
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • F
      license
      Not graded
      quality
      D
      maintenance
      Enables AI assistants to manage SLURM HPC clusters via SSH. Supports job submission, resource monitoring, queue management, and file operations.
      8 npm
      4
      -
    • F
      license
      B
      quality
      D
      maintenance
      Enables users to run Slurm jobs on WashU RIS Compute2 cluster by describing their intent in plain English, without requiring SSH or Slurm knowledge.
      53
      1
      -
    • A
      license
      A
      quality
      C
      maintenance
      Durable MCP server for managing long-running jobs locally, over SSH, or on Slurm clusters. Jobs survive client disconnects and return exit codes, bounded logs, and JSON artifacts.
      11
      1
      MIT