srunx
The srunx server provides a comprehensive toolkit for managing SLURM jobs, workflows, and cluster resources via CLI, Python API, web dashboard, and MCP server integration.
Job Management
Submit jobs with full resource control (GPUs, CPUs, memory, time limit, partition, conda/venv, containers, env vars)
List, query status, cancel jobs, and retrieve stdout/stderr logs
Workflow Orchestration
Create, validate, and run multi-step YAML pipelines with DAG dependencies, Jinja2 templating, inter-job data passing, parameter sweeps, retries, partial/dry-run execution
List and inspect workflow YAML files
Cluster Resources & Configuration
Check real-time GPU and node availability across partitions
Retrieve srunx configuration (resource defaults, environment settings)
List and manage SSH connection profiles for remote clusters
Remote Cluster Support
Transparently dispatch all operations to remote SLURM clusters over SSH
Sync files between local and remote via rsync (by mount point or explicit paths)
Additional Features
Web dashboard for visual job and workflow management
Slack notifications on job completion
MCP server integration for AI agents (e.g., Claude Code) to submit jobs and run workflows programmatically
Sends notifications about job state changes and GPU availability to Slack channels.
srunx
A unified CLI, web dashboard, and Python API for SLURM job management.
Stop juggling sbatch scripts, squeue loops, and SSH sessions.
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 knowContainer-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 pipThe 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 20Or describe the whole pipeline once and let srunx drive it:
srunx flow run workflow.yamlSame 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 dgxsrunx 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 |
| SLURM | Submit a SLURM job |
| SLURM | Cancel a job |
Status & accounting
Command | Type | Description |
| SLURM | List active jobs (use |
| SLURM | Partition / state / nodelist listing (native-sinfo parity) |
| SLURM | Real SLURM |
| srunx | srunx's own submission history (SQLite-backed) |
| srunx | GPU aggregate summary across partitions |
| srunx | View / stream job logs |
| srunx | Watch for state changes / resource availability |
Workflows & sweeps
Command | Type | Description |
| srunx | Run / validate YAML workflows |
| srunx | Override workflow |
| srunx | Ad-hoc matrix parameter sweep |
Environment & tooling
Command | Type | Description |
| srunx | Manage SSH profiles (add / list / sync / test) — remote execution itself is |
| srunx | Manage configuration |
| srunx | Manage job templates |
| 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 portJobs
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:
argswith 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 —
evaluateblocks ontrain; 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 executionRetry 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: 1Run 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.yamlSweeps 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_WEBHOOKFull 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, submitSSH 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 --slackMCP 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-mcpOnce 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 mindRun 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 finishesDocumentation
Full docs (Diátaxis-structured) at ksterx.github.io/srunx:
Tutorials (learn by doing) — Installation · Quickstart · Web UI · MCP setup
How-to guides (solve specific tasks) — User guide · Workflows & sweeps · Monitoring · SSH sync · Web UI · Explorer · MCP usage · Settings · Smoke-test notifications
Reference (look up exact API) — Python API · Web API · MCP tools
Explanation (how it works under the hood) — Architecture · MCP architecture
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 toolscancel_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
Scored across 15 tools
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.
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.
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.
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
Related MCP Connectors
Run isolated code and manage apps, databases and deployments on Lizard (lizard.build).
On-demand GPU nodes for agents: create nodes, run commands, and submit jobs, billed by the minute.
Dispatch and track Alchemist Cloud tickets, watch deploys, read logs, and query your project DB.
Your agents' cloud for individuals and teams. Search, execute, packages, jobs, and credentials.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables AI assistants to manage SLURM HPC clusters via SSH. Supports job submission, resource monitoring, queue management, and file operations.8 npm4-
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants to manage SLURM cluster jobs with safety guardrails, including file transfer, job submission, log reading, and remote command execution.1MIT
- FlicenseBqualityDmaintenanceEnables users to run Slurm jobs on WashU RIS Compute2 cluster by describing their intent in plain English, without requiring SSH or Slurm knowledge.531-
- AlicenseAqualityCmaintenanceDurable 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.111MIT