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)
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"
Extract the archive:
tar -xzf seristack_VERSION_linux_ARCH.tar.gz
Move to your PATH and set permissions:
sudo mv seristack /usr/local/bin/
sudo chmod +x /usr/local/bin/seristack
Verify installation:
seristack --help
Windows (Release Archive)
Download the latest release from GitHub:
# Download from https://github.com/TechXploreLabs/seristack/releases
# Look for: seristack_VERSION_windows_ARCH.zip
Extract the zip file (Right click → Extract all, or use 7-Zip)
Move seristack.exe to a folder in your %PATH% (e.g., C:\Windows or a custom tools folder)
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.
requiredallowed_valuedenied_valueallowed_regexdenied_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.