seristack

Turn shell workflows into CLI commands, HTTP APIs, and MCP tools.

Seristack is a lightweight YAML-driven automation engine for DevOps, platform, and AI-agent workflows. Define stacks once, run them locally, expose them as REST-style endpoints, or publish them as MCP tools for IDEs and agent clients.

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
  • Validate inputs with required, allowed, denied, and regex rules
  • Per-command timeouts using Go duration syntax
  • Works with mvdan shell (default), Bash, sh, and PowerShell

Why Seristack?

One stack, three interfaces

Use the same YAML stack as a local CLI command, an internal HTTP API, or an MCP tool for AI-enabled clients.

Script-to-API without a backend

Wrap existing shell scripts and runbooks without writing a Flask, FastAPI, Express, or Go service for each operation.

MCP-native automation

Create AI-callable tools from YAML instead of hand-coding a custom MCP server for every internal operation.

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 VERSION=v0.3.5 ARCH=amd64 # amd64 | arm64 curl -LO "https://github.com/TechXploreLabs/seristack/releases/download/${VERSION}/seristack_${VERSION#v}_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

# config.yaml stacks: - name: greet-api description: Greets a user from CLI, HTTP, or MCP method: GET urlPath: /greet workDir: ./ count: 1 timeouts: 30s executionMode: SEQUENTIAL vars: - name: name value: engineer required: true allowed_regex: regex("^[a-zA-Z0-9_-]+$") - name: env value: dev allowed_value: [dev, stage, prod] cmds: - | echo "Hello {{.Vars.name}} from {{.Vars.env}}" - name: collect-metadata description: Produces JSON metadata for aggregation dependsOn: [greet-api] count: 2 timeouts: 5m executionMode: SEQUENTIAL vars: - name: env value: dev cmds: - | echo "{\"index\": {{.Count.index}}, \"env\": \"{{.Vars.env}}\", \"status\": \"ok\"}" output: | echo '{{.Self.result}}' | grep "^{" | jq -s '{records: ., total: length}' - name: cleanup-output dependsOn: [collect-metadata] discardOutput: [greet-api] count: 1 timeouts: 10s cmds: - echo "discarded greet-api output from memory"

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

2a. Pass variables at runtime

Use repeated --vars or a single --vars-json payload for multiple values

seristack trigger -c config.yaml -s stack1 \ --vars name=alice \ --vars 'payload={"team":"platform"}' seristack trigger -c config.yaml -s stack1 \ --vars-json '{"name":"alice","env":"dev","payload":{"team":"platform"}}'

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

Production Security

Seristack can execute shell commands, so do not expose it directly to the public internet. The recommended production setup is to bind Seristack to 127.0.0.1 or a private network and place Nginx or Caddy in front of it.

Use the reverse proxy for TLS, authentication, authorization, IP allowlists, rate limiting, request body limits, and access logging.

HTTP API

Run the HTTP server locally and expose selected endpoints through a protected reverse proxy.

seristack run --config config.yaml --addr 127.0.0.1 --port 8080

MCP server

Treat MCP endpoints with the same security posture as the HTTP API because MCP clients can trigger stack tools.

seristack mcp --type streamableHTTP --addr 127.0.0.1 --port 8080

Input Validation and Timeouts

Variable rules

Restrict incoming CLI, HTTP, and MCP inputs before commands run.

  • required
  • allowed_value
  • denied_value
  • allowed_regex
  • denied_regex

Command timeouts

Each stack can define a per-command timeout using Go duration syntax. Default is 1h.

timeouts: 500ms timeouts: 30s timeouts: 5m timeouts: 1h timeouts: 1h30m timeouts: 2.5h

Support the Project

Support the project

If Seristack saves you from building custom internal automation APIs or MCP servers, consider starring the repository, sharing feedback, opening issues, or sponsoring future development.