seristack

Run shell workflows via CLI, HTTP, or MCP integrations.

Seristack is a lightweight automation engine designed to bridge the gap between local task execution and remote triggers. Define your stacks in YAML, manage dependencies, and expose your automation via a built-in HTTP server.

Features

  • Run multiple command stacks from a single config
  • Repeat stacks with serial or concurrent execution
  • Define dependencies between stacks
  • Variable substitution using templates
  • Share output between stacks
  • Expose stacks as HTTP endpoints
  • Run as an MCP server for IDE integrations
  • Works with Bash, sh, and PowerShell

Installation

Mac and Linux (Homebrew)

brew install TechXploreLabs/tap/seristack

Linux (Release Archive)

STEP 1

Download the latest release from GitHub:

# Download from https://github.com/TechXploreLabs/seristack/releases # Look for: seristack_VERSION_linux_ARCH.tar.gz
STEP 2

Extract the archive:

tar -xzf seristack_VERSION_linux_ARCH.tar.gz
STEP 3

Move to your PATH and set permissions:

sudo mv seristack /usr/local/bin/ sudo chmod +x /usr/local/bin/seristack
STEP 4

Verify installation:

seristack --help

Windows (Release Archive)

STEP 1

Download the latest release from GitHub:

# Download from https://github.com/TechXploreLabs/seristack/releases # Look for: seristack_VERSION_windows_ARCH.zip
STEP 2

Extract the zip file (Right click → Extract all, or use 7-Zip)

STEP 3

Move seristack.exe to a folder in your %PATH% (e.g., C:\Windows or a custom tools folder)

STEP 4

Verify installation in PowerShell:

seristack --help

Configuration

Sample YAML Configuration

# description about seristack # config.yaml stacks: - name: stack1 # name of the stack (REQUIRED) workDir: ./ # working directory to execute the cmds. default is "./" description: Used for printing welcome message # used for adding the stack as tool in mcp server, if descrption is empty then # it won't be added method: GET # Http methods needs to be added for http server urlPath: /show # Optional, If not provided stack name will be added as path, ex /stack1 continueOnError: false # if cmds has error, true will not stop execution, false will stop. default is false count: 3 # count = 0 will not run cmds, count = 3 runs entire cmds three times. default is 0 executionMode: PARALLEL # if count = 3 and executionMode is PARALLEL, then all three iterations of list # cmds execute parallellely . Valid options are, [PARALLEL/STAGE/PIPELINE/SEQUENTIAL]. # STAGE = execute all iterations conncurrently, list of cmds execeuted serially # PIPELINE = execute all iterations serially, list of cmds executed concurrently # SEQUENTIAL = execute all iterations and theirs cmds serially. default is PARALLEL vars: # vars take key=value pair of variables. default is empty samplekey: samplevalue shell: bash # shell takes sh as default for linux, darwin and powershell for windows shellArg: -c # shellArg takes -c as default for linux, darwin and -Command for windows dependsOn: [] # dependsOn takes list of stacks to start after them. default is [] cmds: # cmds takes list of shell commands (linux, powershell) - | export samplekey={{.Vars.samplekey}} # to use vars for substitution echo $samplekey echo "count={{.Count.index}}" # index of count iterations echo "Hey i'm seristack!" - name: stack2 workDir: ./ continueOnError: false count: 3 executionMode: SEQUENTIAL vars: # vars take key=value pair of variables. default is empty env: Dev dependsOn: [stack1] # runs after stack1 completes cmds: - | # Command 1: Produces metadata echo "{\"index\": {{.Count.index}}, \"step\": \"metadata\", \"status\": \"ok\"}" - | # Command 2: Produces metric data echo "{\"index\": {{.Count.index}}, \"step\": \"metrics\", \"value\": $((RANDOM % 100))}" output: | # for aggregating outputs from the cmds echo "--- Aggregation Summary ---" # We use 'grep' to find JSON lines and 'jq' to format them into an array echo '{{.Self.result}}' | grep "^{\"" | jq -s '{ total_records: length, environment: "{{.Vars.env}}", results: . }' - name: stack3 workDir: ./ count: 1 vars: invite: hello engineers cmds: - | echo "Current date and time:" echo `date`

Running Stacks

1. Trigger entire stacks

Run all stacks defined in the config file (default: config.yaml)

seristack trigger -c config.yaml # or simply: seristack trigger

2. Run a specific stack

Execute only a particular stack by name

seristack trigger -c config.yaml -s stack3

3. Start HTTP server

Initialize the HTTP server with defined endpoints (Ctrl+C to stop)

seristack run -c config.yaml

4. Launch MCP server

Expose stacks to IDEs and MCP-enabled clients (Ctrl+C to stop)

seristack mcp -t streamableHTTP