Build, test, and deploy intelligent agent teams. Self-hosted. Git-backed. Production-ready.
> /plugin marketplace add cloudshipai/station> /plugin install station@cloudshipai-station
Repo: cloudshipai/station
What's inside

Build, test, and deploy intelligent agent teams. Self-hosted. Git-backed. Production-ready.
Quick Start | Real Example | Deploy | Documentation
Build multi-agent systems that coordinate like real teams. Test with realistic scenarios. Deploy on your infrastructure.
Station gives you:
stn deploySTN_CLOUDSHIP_KEY or CLOUDSHIPAI_REGISTRATION_KEYOPENAI_API_KEY - OpenAI (gpt-5-mini, gpt-5, etc.)GEMINI_API_KEY - Google GeminiANTHROPIC_API_KEY - Anthropic (claude-sonnet-4-20250514, etc.)curl -fsSL https://raw.githubusercontent.com/cloudshipai/station/main/install.sh | bash
Choose your AI provider:
Use CloudShip AI for optimized inference with Llama and Qwen models. This is the default when a registration key is available.
# Set your CloudShip registration key
export CLOUDSHIPAI_REGISTRATION_KEY="csk-..."
# Or use: export STN_CLOUDSHIP_KEY="csk-..."
stn init --provider cloudshipai --ship # defaults to cloudship/llama-3.1-70b
Available models:
cloudship/llama-3.1-70b (default) - Best balance of performance and costcloudship/llama-3.1-8b - Faster, lower costcloudship/qwen-72b - Alternative large modelโ ๏ธ DEPRECATED: Anthropic OAuth is currently unavailable.
Anthropic has restricted third-party use of OAuth tokens. This authentication method is not working until further notice.
Please use one of the following alternatives:
- OpenAI API Key (recommended)
- Google Gemini API Key
- Anthropic API Key (pay-per-token, not subscription-based)
Use your existing Claude Max or Claude Pro subscription - no API billing required.
# โ NOT WORKING - Anthropic OAuth disabled
# stn init --provider anthropic --ship
# stn auth anthropic login
export OPENAI_API_KEY="sk-..."
stn init --provider openai --ship # defaults to gpt-5-mini
export GEMINI_API_KEY="..."
stn init --provider gemini --ship
This sets up:
~/.config/station/config.yamlStart the Jaeger tracing backend for observability:
stn jaeger up
This starts Jaeger UI at http://localhost:16686 for viewing agent execution traces.
Choose your editor and add Station:
claude mcp add station -e OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318 --scope user -- stn stdio
Verify with claude mcp list.
Add to opencode.jsonc:
{
"mcp": {
"station": {
"enabled": true,
"type": "local",
"command": ["stn", "stdio"],
"environment": {
"OTEL_EXPORTER_OTLP_ENDPOINT": "http://localhost:4318"
}
}
}
}
Add to .cursor/mcp.json in your project (or ~/.cursor/mcp.json for global):
{
"mcpServers": {
"station": {
"command": "stn",
"args": ["stdio"],
"env": {
"OTEL_EXPORTER_OTLP_ENDPOINT": "http://localhost:4318"
}
}
}
}
| OS | Config Path |
|---|---|
| macOS | ~/Library/Application Support/Claude/claude_desktop_config.json |
| Windows | %APPDATA%\Claude\claude_desktop_config.json |
| Linux | ~/.config/Claude/claude_desktop_config.json |
{
"mcpServers": {
"station": {
"command": "stn",
"args": ["stdio"],
"env": {
"OTEL_EXPORTER_OTLP_ENDPOINT": "http://localhost:4318"
}
}
}
}
Optional GitOps: Point to a Git-backed workspace:
"command": ["stn", "--config", "/path/to/my-agents/config.yaml", "stdio"]
Get skills, slash commands, and enhanced documentation for your AI editor:
Adds /station commands, skills for agent creation, and MCP server config.
# Add Station marketplace and install plugin
/plugin marketplace add cloudshipai/station
/plugin install station@cloudshipai-station
Or install from local clone:
/plugin install ./station/claude-code-plugin
Adds Station CLI reference skill with agent, workflow, and deployment docs.
# Copy skill to your project
cp -r station/opencode-plugin/.opencode .
# Or install globally
cp -r station/opencode-plugin/.opencode ~/.config/opencode/
Restart OpenCode - skill auto-loads.
Restart your editor. Station provides:
http://localhost:8585 for configurationhttp://localhost:16686 for tracesTry your first command:
"Show me all Station MCP tools available"
Copy this prompt into your AI assistant for a hands-on tour:
You are my Station onboarding guide. Walk me through an interactive hands-on tutorial.
RULES:
1. Create a todo list to track progress through each section
2. At each section, STOP and let me engage before continuing
3. Use Station MCP tools to demonstrate - don't just explain, DO IT
4. Keep it fun and celebrate wins!
THE JOURNEY:
## 1. Hello World Agent
- Create a "hello-world" agent that greets users and tells a joke
- Call the agent and show the result
[STOP for me to try it]
## 2. Faker Tools & MCP Templates
- Explain Faker tools (AI-generated mock data for safe development)
- Note: Real MCP tools are added via Station UI or template.json
- Explain MCP templates - they keep credentials safe when deploying
- Create a "prometheus-metrics" faker for realistic metrics
[STOP to see the faker]
## 3. DevOps Investigation Agent
- Create a "metrics-investigator" agent using our prometheus faker
- Call it: "Check for performance issues in the last hour"
[STOP to review the investigation]
## 4. Multi-Agent Hierarchy
- Create an "incident-coordinator" that delegates to:
- metrics-investigator (existing)
- logs-investigator (new - create a logs faker)
- Show hierarchy structure in the .prompt file
- Call coordinator: "Investigate why the API is slow"
[STOP to see delegation]
## 5. Inspecting Runs
- Use inspect_run to show detailed execution
- Explain: tool calls, delegations, timing
[STOP to explore]
## 6. Workflow with Human-in-the-Loop
- Create a workflow: investigate โ switch on severity โ human_approval if high โ report
- Make it complex (switch/parallel), not sequential
- Start the workflow
[STOP for me to approve/reject]
## 7. Evaluation & Reporting
- Run evals with evaluate_benchmark
- Generate a performance report
[STOP to review]
## 8. Grand Finale
- Direct me to http://localhost:8585 (Station UI)
- Quick tour: Agents, MCP servers, Runs, Workflows
- Celebrate!
## 9. Want More? (Optional)
Briefly explain these advanced features (no demo needed):
- **Schedules**: Cron-based agent scheduling
- **Sandboxes**: Isolated code execution (Python/Node/Bash)
- **Notify Webhooks**: Send alerts to Slack, ntfy, Discord
- **Bundles**: Package and share agent teams
- **Deploy**: `stn deploy` to Fly.io, Docker, K8s
- **CloudShip**: Centralized management and team OAuth
Start now with Section 1!
stn upThe easiest way to run Station is with stn up - a single command that starts Station in a Docker container with everything configured.
stn up is designed to make it trivial to run agent bundles from your CloudShip account or the community:
# Run a bundle from CloudShip (by ID or name)
stn up --bundle finops-cost-analyzer
# Run a bundle from URL
stn up --bundle https://example.com/my-bundle.tar.gz
# Run a local bundle file
stn up --bundle ./my-custom-agents.tar.gz
This is the recommended way for most users to get started - just pick a bundle and go.
Developers can also use stn up to test their local agent configurations in an isolated container environment:
# Test your local workspace in a container
stn up --workspace ~/my-agents
# Test with a specific environment
stn up --environment production
# Test with development tools enabled
stn up --develop
This lets you validate that your agents work correctly in the same containerized environment they'll run in production.
# Start Station (interactive setup on first run)
stn up
# Start with specific AI provider
stn up --provider openai --model gpt-5
# Check status
stn status
# View logs
stn logs -f
# Stop Station
stn down
# Stop and remove all data (fresh start)
stn down --remove-volume
stn up Provides| Service | Port | Description |
|---|---|---|
| Web UI | 8585 | Configuration interface |
| MCP Server | 8586 | Main MCP endpoint for tools |
| Agent MCP | 8587 | Dynamic agent execution |
| Jaeger UI | 16686 | Distributed tracing |
See Container Lifecycle for detailed architecture.
Station supports multiple authentication methods for AI providers.
The simplest way to authenticate - set your API key as an environment variable:
# CloudShip AI (Recommended - auto-detected when registration key is set)
export CLOUDSHIPAI_REGISTRATION_KEY="csk-..."
# Or: export STN_CLOUDSHIP_KEY="csk-..."
# OpenAI
export OPENAI_API_KEY="sk-..."
# Google Gemini
export GEMINI_API_KEY="..."
# Anthropic (API billing)
export ANTHROPIC_API_KEY="sk-ant-api03-..."
โ ๏ธ DEPRECATED: Anthropic OAuth is currently unavailable.
Anthropic has restricted third-party use of OAuth tokens. This authentication method is not working until further notice.
Use these alternatives instead:
OPENAI_API_KEYfor OpenAI models (recommended)GEMINI_API_KEYfor Google Gemini modelsANTHROPIC_API_KEYfor Anthropic API (pay-per-token billing)
Use your Claude Max or Claude Pro subscription instead of pay-per-token API billing.
Setup (NOT WORKING):
# โ DEPRECATED - Anthropic OAuth disabled
# stn auth anthropic login
Authentication Priority:
| Priority | Method | Description |
|---|---|---|
| 1 | STN_AI_AUTH_TYPE=api_key | Force API key mode (override) |
stn auth anthropic login | ||
~/.claude/.credentials.json | ||
| 4 | ANTHROPIC_API_KEY env var | Standard API key (USE THIS) |
For Anthropic models, use API key authentication:
# Set Anthropic API key
export ANTHROPIC_API_KEY="sk-ant-api03-..."
# Or in Docker
docker run \
-e ANTHROPIC_API_KEY=$ANTHROPIC_API_KEY \
-e STN_AI_PROVIDER=anthropic \
station:latest
Station is driven entirely through MCP tools in your AI assistant. Natural language requests use 41+ available MCP tools.
| Category | Tools | Key Functions |
|---|---|---|
| Agent Management | 11 | create_agent, update_agent, add_agent_as_tool |
| Execution | 4 | call_agent, inspect_run, list_runs |
| Evaluation | 7 | evaluate_benchmark, batch_execute_agents |
| Reports | 4 | create_report, generate_report |
| Environments | 3 | create_environment, list_environments |
| MCP Servers | 5 | add_mcp_server_to_environment |
| Scheduling | 3 | set_schedule, remove_schedule |
| Faker/Bundles | 2 | faker_create_standalone, create_bundle |
Example interaction:
You: "Create a logs analysis agent that uses Datadog and Elasticsearch"
Claude: [Using create_agent tool...] โ
Created logs_investigator
You: "Run the incident coordinator on the API timeout issue"
Claude: [Using call_agent...] [Full investigation with multi-agent delegation]
Discover all tools: Ask your AI assistant "Show me all Station MCP tools" or see MCP Tools Reference โ
We built a complete SRE incident response team with 9 specialized agents that achieved a 7.5/10 performance score in automated testing.
incident_coordinator (Orchestrator)
โโโ logs_investigator - Analyzes error patterns in application logs
โโโ metrics_investigator - Identifies performance spikes and anomalies
โโโ traces_investigator - Examines distributed trace slowdowns
โโโ change_detective - Correlates with recent deployments
โโโ infra_sre - Checks K8s, AWS, and infrastructure
โโโ saas_dependency_analyst - Monitors external service outages
โโโ runbook_recommender - Finds relevant documentation
โโโ scribe - Generates incident reports
You say: "The checkout service is returning 503 errors and customers can't complete purchases"
Incident Coordinator responds:
I'll coordinate our SRE team to investigate this critical checkout service issue.
INITIAL ASSESSMENT:
- Service: checkout-service
- Error: HTTP 503 (Service Unavailable)
- Impact: Customers unable to complete purchases
- Severity: SEV1 - Revenue impacting
Delegating to specialist agents...
[LOGS INVESTIGATION - @logs_investigator]
โ
Found error spike starting at 14:32 UTC
- Pattern: "connection pool exhausted"
- Frequency: 847 errors/minute
- Stack trace: database connection timeout
[METRICS ANALYSIS - @metrics_investigator]
โ
Database connection pool at 100% utilization
- Normal: 40-60 connections
- Current: 200 connections (maxed out)
- Response time: 5000ms (normal: 200ms)
[DEPLOYMENT CHECK - @change_detective]
โ
Recent deployment detected:
- Service: checkout-service v2.3.0
- Deployed: 14:15 UTC (17 minutes before incident)
- Change: Added batch order processing
ROOT CAUSE IDENTIFIED:
New batch processing feature holding database connections
longer than expected, exhausting the connection pool.
RECOMMENDED ACTIONS:
1. IMMEDIATE: Increase connection pool to 400 (kubectl patch)
2. ROLLBACK: Revert to v2.2.0 if pool increase insufficient
3. LONG-TERM: Implement connection pooling in batch processor
[Screenshot needed: Web UI showing the incident coordinator agent run with delegations to specialist agents]
Agents are simple .prompt files using GenKit's dotprompt format:
Coordinator Agent (delegates to other agents):
---
metadata:
name: "incident_coordinator"
description: "Orchestrates specialist agents to investigate production incidents"
model: gpt-5-mini
max_steps: 20
agents:
- "logs_investigator" # Delegate to logs specialist
- "metrics_investigator" # Delegate to metrics specialist
- "traces_investigator" # Delegate to traces specialist
- "change_detective" # Check recent changes
- "infra_sre" # Infrastructure analysis
- "saas_dependency_analyst" # External dependencies
- "runbook_recommender" # Find solutions
- "scribe" # Generate reports
---
{{role "system"}}
You are an expert SRE incident coordinator. When presented with a production issue:
1. Assess severity and business impact
2. Delegate to relevant specialist agents using __agent_<name> tools
3. Synthesize findings into root cause
4. Provide clear remediation steps
{{role "user"}}
{{userInput}}
Specialist Agent (uses MCP tools):
---
metadata:
name: "logs_investigator"
description: "Deep dive into logs to identify error patterns"
model: gpt-5-mini
max_steps: 8
tools:
- "__logs_query" # Query Datadog/Elasticsearch logs
- "__search_query" # Search for patterns
---
{{role "system"}}
You analyze application logs to find root causes of incidents.
Focus on error patterns, stack traces, and anomalies.
{{role "user"}}
{{userInput}}
Station provides 41 MCP tools directly in your AI assistant. Here's how you use them:
Creating the team:
You: Create an incident response team with coordinator and specialist agents
Claude: I'll create the SRE incident response team for you.
[Using tool: create_agent with name="incident_coordinator"...]
โ
Created incident_coordinator agent
[Using tool: create_agent with name="logs_investigator"...]
โ
Created logs_investigator agent
[Using tool: add_agent_as_tool with parent="incident_coordinator", child="logs_investigator"...]
โ
Added logs_investigator as tool for incident_coordinator
[Continues for all 8 specialists...]
Your SRE incident response team is ready! The coordinator can now delegate to all specialists.
Running investigations:
You: There's high memory usage on the payment service
Claude: I'll have the incident coordinator investigate this.
[Using tool: call_agent with agent_id="21", task="Investigate high memory usage on payment service"...]
[Response shows full investigation with delegations to specialists]
[Screenshot needed: Claude/Cursor interface showing MCP tools being used]
Each specialist has access to production-grade tool integrations:
The Faker system generates realistic mock data during development:
datadog:
command: stn
args: ["faker", "--ai-instruction", "Generate production incident data: high CPU, memory leaks, error spikes"]
This lets you build and test without production credentials.
[Screenshot needed: Faker generating realistic Datadog metrics]
Station automatically tested this team against 100+ production scenarios:
Team Performance: 7.5/10
[Screenshot needed: Web UI showing team performance report with 7.5/10 score]
Deploy your agent team to Fly.io and expose agents as consumable MCP tools:
# Deploy the SRE team
stn deploy station-sre --target fly
โ
Building Docker image with agents
โ
Deploying to Fly.io (ord region)
โ
Configuring secrets from variables.yml
โ
Starting MCP server on port 3030
Your agents are live at:
https://station-sre.fly.dev:3030
What you get:
__agent_<name> toolYour deployed agents are now accessible as MCP tools from Claude, Cursor, or OpenCode:
Claude Desktop / Cursor configuration:
{
"mcpServers": {
"station-sre-production": {
"url": "https://station-sre.fly.dev:3030/mcp",
"headers": {
"Authorization": "Bearer YOUR_DEPLOY_TOKEN"
}
}
}
}
Available tools after connection:
__agent_incident_coordinator - Orchestrates incident response
__agent_logs_investigator - Analyzes error patterns
__agent_metrics_investigator - Identifies performance spikes
__agent_traces_investigator - Examines distributed traces
__agent_change_detective - Correlates with deployments
__agent_infra_sre - Checks K8s/AWS infrastructure
__agent_saas_dependency_analyst - Monitors external services
__agent_runbook_recommender - Finds relevant docs
__agent_scribe - Generates incident reports
Now you can call your agents from anywhere:
You: "Investigate the API timeout issue using my SRE team"
Claude: [Calling __agent_incident_coordinator...]
[Full incident investigation with multi-agent delegation]
Create Docker images to run on your own infrastructure:
Step 1: Build the image
# Build with your environment embedded
stn build env station-sre --skip-sync
# Output: station-sre:latest Docker image
Step 2: Run with your environment variables
docker run -d \
-p 3030:3030 \
-e OPENAI_API_KEY=$OPENAI_API_KEY \
-e AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID \
-e AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY \
-e PROJECT_ROOT=/workspace \
-e AWS_REGION=us-east-1 \
station-sre:latest
Environment Variables at Runtime:
OPENAI_API_KEY, GEMINI_API_KEY, etc.AWS_*, GCP_*, AZURE_* credentials{{ .VARIABLE }} from your configsDeploy anywhere:
Example: Kubernetes Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: station-sre
spec:
replicas: 2
template:
spec:
containers:
- name: station
image: your-registry/station-sre:latest
ports:
- containerPort: 3030
env:
- name: OPENAI_API_KEY
valueFrom:
secretKeyRef:
name: station-secrets
key: openai-api-key
- name: AWS_ACCESS_KEY_ID
valueFrom:
secretKeyRef:
name: aws-credentials
key: access-key-id
- name: AWS_SECRET_ACCESS_KEY
valueFrom:
secretKeyRef:
name: aws-credentials
key: secret-access-key
- name: PROJECT_ROOT
value: "/workspace"
- name: AWS_REGION
value: "us-east-1"
---
apiVersion: v1
kind: Service
metadata:
name: station-sre
spec:
type: LoadBalancer
ports:
- port: 3030
targetPort: 3030
selector:
app: station-sre
Connect to your self-hosted MCP endpoint:
{
"mcpServers": {
"station-sre-production": {
"url": "https://your-domain.com:3030/mcp",
"headers": {
"Authorization": "Bearer YOUR_TOKEN"
}
}
}
}
Custom AI Provider Configuration:
# Build with specific model configuration
stn build env station-sre \
--provider openai \
--model gpt-5-mini
# Or use environment variables at runtime
docker run -e STN_AI_PROVIDER=gemini \
-e GEMINI_API_KEY=$GEMINI_API_KEY \
station-sre:latest
Multiple Regions:
# Deploy to multiple Fly.io regions
stn deploy station-sre --target fly --region ord # Chicago
stn deploy station-sre --target fly --region syd # Sydney
stn deploy station-sre --target fly --region fra # Frankfurt
Health Checks:
# Check MCP endpoint health
curl https://station-sre.fly.dev:3030/health
# Response
{
"status": "healthy",
"agents": 9,
"mcp_servers": 3,
"uptime": "2h 15m 30s"
}
Package your agent team for distribution:
# Create a bundle from environment
stn bundle create station-sre
# Creates station-sre.tar.gz
# Share with your team or install elsewhere
stn bundle install station-sre.tar.gz
[Screenshot needed: Web UI showing bundle in registry]
Run agents on a schedule for continuous monitoring:
# Set up daily cost analysis
"Set a daily schedule for the cost analyzer agent to run at 9 AM"
# Schedule incident checks every 5 minutes
"Schedule the incident coordinator to check system health every 5 minutes"
# Weekly compliance audit
"Set up weekly compliance checks on Mondays at midnight"
Station uses cron expressions with second precision:
0 */5 * * * * - Every 5 minutes0 0 9 * * * - Daily at 9 AM0 0 0 * * 1 - Weekly on Monday midnightView scheduled agents in Web UI:
[Screenshot needed: Web UI showing scheduled agents with cron expressions]
Scheduled agents run automatically and store results in the runs history.
Trigger agent execution from external systems via HTTP webhook. Perfect for integrating with CI/CD pipelines, alerting systems, or any automation that can make HTTP requests.
Endpoint: POST http://localhost:8587/execute
# Trigger by agent name
curl -X POST http://localhost:8587/execute \
-H "Content-Type: application/json" \
-d '{"agent_name": "incident_coordinator", "task": "Investigate the API timeout alert"}'
# Trigger by agent ID
curl -X POST http://localhost:8587/execute \
-H "Content-Type: application/json" \
-d '{"agent_id": 21, "task": "Check system health"}'
# With variables for template rendering
curl -X POST http://localhost:8587/execute \
-H "Content-Type: application/json" \
-d '{
"agent_name": "cost_analyzer",
"task": "Analyze costs for project",
"variables": {"project_id": "prod-123", "region": "us-east-1"}
}'
Response (202 Accepted):
{
"run_id": 120,
"agent_id": 21,
"agent_name": "incident_coordinator",
"status": "running",
"message": "Agent execution started"
}
Integration Examples:
PagerDuty Webhook:
# Auto-investigate when PagerDuty alert fires
curl -X POST https://your-station:8587/execute \
-H "Authorization: Bearer $STN_WEBHOOK_API_KEY" \
-d '{"agent_name": "incident_coordinator", "task": "PagerDuty alert: {{alert.title}}"}'
GitHub Actions:
- name: Run deployment analyzer
run: |
curl -X POST ${{ secrets.STATION_URL }}/execute \
-H "Authorization: Bearer ${{ secrets.STATION_API_KEY }}" \
-d '{"agent_name": "deployment_analyzer", "task": "Analyze deployment ${{ github.sha }}"}'
Authentication:
STN_WEBHOOK_API_KEY environment variable for static API key authConfiguration:
# Enable/disable webhook (default: enabled)
export STN_WEBHOOK_ENABLED=true
# Set static API key for authentication
export STN_WEBHOOK_API_KEY="your-secret-key"
Simple .prompt files define intelligent behavior:
---
metadata:
name: "metrics_investigator"
description: "Analyze performance metrics and identify anomalies"
model: gpt-5-mini
max_steps: 8
tools:
- "__get_metrics" # Datadog metrics API
- "__query_time_series" # Grafana queries
- "__get_dashboards" # Dashboard snapshots
- "__list_alerts" # Active alerts
---
{{role "system"}}
You investigate performance issues by analyzing metrics and time series data.
Focus on: CPU, memory, latency, error rates, and throughput.
{{role "user"}}
{{userInput}}
Version control your entire agent infrastructure:
my-agents/
โโโ config.yaml # Station configuration
โโโ environments/
โ โโโ production/
โ โ โโโ agents/ # Production agents
โ โ โโโ template.json # MCP server configs
โ โ โโโ variables.yml # Secrets and config
โ โโโ development/
โ โโโ agents/ # Dev agents
โ โโโ template.json
โ โโโ variables.yml
โโโ reports/ # Performance evaluations
Every execution automatically traced:
[Screenshot needed: Jaeger showing multi-agent trace]
incident_coordinator (18.2s)
โโ assess_severity (0.5s)
โโ delegate_logs_investigator (4.1s)
โ โโ __get_logs (3.2s)
โโ delegate_metrics_investigator (3.8s)
โ โโ __query_time_series (2.9s)
โโ delegate_change_detective (2.4s)
โ โโ __get_recent_deployments (1.8s)
โโ synthesize_findings (1.2s)
Never hardcode credentials:
{
"mcpServers": {
"aws": {
"command": "aws-mcp",
"env": {
"AWS_REGION": "{{ .AWS_REGION }}",
"AWS_PROFILE": "{{ .AWS_PROFILE }}"
}
}
}
}
Variables resolved from variables.yml or environment.
Connect to your actual infrastructure tools:
Agents can execute Python, Node.js, or Bash code in isolated Docker containers:
Compute Mode - Ephemeral per-call (default):
---
metadata:
name: "data-processor"
sandbox: python # or: node, bash
---
Use the sandbox_run tool to process data with Python.
Code Mode - Persistent session across workflow steps:
---
metadata:
name: "code-developer"
sandbox:
mode: code
session: workflow # Share container across agents in workflow
---
Use sandbox_open, sandbox_exec, sandbox_fs_write to develop iteratively.
Why Sandbox?
| Without Sandbox | With Sandbox |
|---|---|
| LLM calculates (often wrong) | Python computes correctly |
| Large JSON in context (slow) | Python parses efficiently |
| Host execution (security risk) | Isolated container (safe) |
Enabling Sandbox:
# Compute mode (ephemeral per-call)
export STATION_SANDBOX_ENABLED=true
# Code mode (persistent sessions - requires Docker)
export STATION_SANDBOX_ENABLED=true
export STATION_SANDBOX_CODE_MODE_ENABLED=true
Ready to build your own agent team? Here's how:
Ask your AI assistant:
"Create an incident response team like the SRE example with coordinator and specialist agents"
Station will:
"The API gateway is timing out and affecting all services"
Watch as your coordinator:
"Generate a benchmark report for my incident response team"
Get detailed metrics on:
stn deploy my-team --target fly
Your agents are now available as a production MCP endpoint.
Station can automatically convert OpenAPI/Swagger specifications into MCP servers, making any REST API instantly available as agent tools.
โ ๏ธ Experimental Feature - OpenAPI to MCP conversion is currently in beta.
Turn any OpenAPI spec into MCP tools:
{
"name": "Station Management API",
"description": "Control Station via REST API",
"mcpServers": {
"station-api": {
"command": "stn",
"args": [
"openapi-runtime",
"--spec",
"environments/{{ .ENVIRONMENT_NAME }}/station-api.openapi.json"
]
}
},
"metadata": {
"openapiSpec": "station-api.openapi.json",
"variables": {
"STATION_API_URL": {
"description": "Station API endpoint URL",
"default": "http://localhost:8585/api/v1"
}
}
}
}
Template variables in OpenAPI specs:
{
"openapi": "3.0.0",
"servers": [
{
"url": "{{ .STATION_API_URL }}",
"description": "Station API endpoint"
}
]
}
Station automatically:
{{ .VAR }} from variables.yml and env varsExample: Station Admin Agent
Create an agent that manages Station itself using the Station API:
---
metadata:
name: "Station Admin"
description: "Manages Station environments, agents, and MCP servers"
model: gpt-5-mini
max_steps: 10
tools:
- "__listEnvironments" # From station-api OpenAPI spec
- "__listAgents"
- "__listMCPServers"
- "__createAgent"
- "__executeAgent"
---
{{role "system"}}
You are a Station administrator that helps manage environments, agents, and MCP servers.
Use the Station API tools to:
- List and inspect environments, agents, and MCP servers
- Create new agents from user requirements
- Execute agents and monitor their runs
- Provide comprehensive overviews of the Station deployment
{{role "user"}}
{{userInput}}
Usage:
stn agent run station-admin "Show me all environments and their agents"
The agent will use the OpenAPI-generated tools to query the Station API and provide a comprehensive overview.
Deploy Station agents to production without manual configuration. Station supports zero-config deployments that automatically:
Deploy to Docker Compose:
# Build environment container
stn build env production
# Deploy with docker-compose
docker-compose up -d
Station automatically configures:
Supported platforms:
Station includes built-in OpenTelemetry (OTEL) support for complete execution observability:
What Gets Traced:
Quick Start with Jaeger:
# Start Jaeger locally
make jaeger
# Configure Station
export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318
stn serve
# Run agent and view traces
stn agent run my-agent "Analyze costs"
open http://localhost:16686
Team Integration Examples:
Span Details Captured:
aws-cost-spike-analyzer (18.2s)
โโ generate (17ms)
โ โโ openai/gpt-5-mini (11ms) - "Analyze cost data"
โ โโ __get_cost_anomalies (0ms) - AWS Cost Explorer
โโ generate (11ms)
โ โโ __get_cost_and_usage_comparisons (0ms)
โโ db.agent_runs.create (0.1ms)
Configuration:
# Environment variable (recommended)
export OTEL_EXPORTER_OTLP_ENDPOINT=http://your-collector:4318
# Or config file
otel_endpoint: "http://your-collector:4318"
Complete OTEL Setup Guide โ - Includes Jaeger, Tempo, Datadog, Honeycomb, AWS X-Ray, New Relic, Azure Monitor examples
FinOps & Cost Optimization:
Security & Compliance:
Deployment & Operations:
Connect your Station to CloudShip for centralized management, OAuth authentication, and team collaboration.
With CloudShip OAuth enabled, only users who:
...can access your Station's agents through MCP. This lets you share powerful agents with your team while keeping them secure.
Get a Registration Key from your CloudShip dashboard at Settings > Stations
Configure your Station (config.yaml):
cloudship:
enabled: true
registration_key: "your-registration-key"
name: "my-station" # Unique name for this station
tags: ["production", "us-east-1"]
Start Station - It will automatically connect to CloudShip:
stn serve
# Output: Successfully registered with CloudShip management channel
When CloudShip OAuth is enabled, MCP clients (Claude Desktop, Cursor, etc.) authenticate through CloudShip before accessing your Station's agents.
Setup (Station Admin):
oauth.enabled: true and oauth.client_idUsage (Team Members):
How it works:
MCP Client Station CloudShip
| | |
|------ POST /mcp --------->| |
|<----- 401 Unauthorized ---| |
| WWW-Authenticate: | |
| Bearer resource_metadata="..." |
| | |
|------- [OAuth Discovery] ------------------------------>|
|<------ [Authorization Server Metadata] -----------------|
| | |
|------- [Browser Login] -------------------------------->|
|<------ [Authorization Code] ----------------------------|
| | |
|------- [Token Exchange] ------------------------------->|
|<------ [Access Token] ----------------------------------|
| | |
|------ POST /mcp --------->| |
| Authorization: Bearer |------ Validate Token ------>|
| |<------ {active: true} ------|
|<----- MCP Response -------| |
Enable OAuth (config.yaml):
cloudship:
enabled: true
registration_key: "your-key"
name: "my-station"
oauth:
enabled: true
client_id: "your-oauth-client-id" # From CloudShip OAuth Apps
MCP Client Configuration (Claude Desktop / Cursor):
{
"mcpServers": {
"my-station": {
"url": "https://my-station.example.com:8587/mcp"
}
}
}
Note: Port 8587 is the Dynamic Agent MCP server. Port 8586 is the standard MCP server.
When the MCP client connects, it will:
cloudship:
# Enable CloudShip integration
enabled: true
# Registration key from CloudShip dashboard
registration_key: "sk-..."
# Unique station name (required for multi-station support)
name: "production-us-east"
# Tags for filtering and organization
tags: ["production", "us-east-1", "sre-team"]
# CloudShip endpoints (defaults shown - usually no need to change)
endpoint: "lighthouse.cloudshipai.com:443" # TLS-secured gRPC endpoint
use_tls: true # TLS enabled by default
base_url: "https://app.cloudshipai.com"
# OAuth settings for MCP authentication
oauth:
enabled: false # Enable OAuth for MCP
client_id: "" # OAuth client ID from CloudShip
# These are auto-configured from base_url:
# auth_url: "https://app.cloudshipai.com/oauth/authorize/"
# token_url: "https://app.cloudshipai.com/oauth/token/"
# introspect_url: "https://app.cloudshipai.com/oauth/introspect/"
For local development with a local Lighthouse instance:
cloudship:
enabled: true
registration_key: "your-dev-key"
name: "dev-station"
endpoint: "localhost:50051" # Local Lighthouse (no TLS)
use_tls: false # Disable TLS for local development
base_url: "http://localhost:8000" # Local Django
oauth:
enabled: true
client_id: "your-dev-client-id"
introspect_url: "http://localhost:8000/oauth/introspect/"
For connecting to production CloudShip during development (recommended):
cloudship:
enabled: true
registration_key: "your-registration-key"
name: "dev-station"
# Uses defaults: endpoint=lighthouse.cloudshipai.com:443, use_tls=true
Station uses SQLite by default, with support for cloud databases and continuous backup for production deployments.
# Station uses local SQLite file
stn stdio
Perfect for local development, zero configuration required.
For multi-instance deployments or team collaboration, use a libsql-compatible cloud database:
# Connect to cloud database
export DATABASE_URL="libsql://your-db.example.com?authToken=your-token"
stn stdio
Benefits:
For single-instance production deployments with disaster recovery:
# Docker deployment with automatic S3 backup
docker run \
-e LITESTREAM_S3_BUCKET=my-backups \
-e LITESTREAM_S3_ACCESS_KEY_ID=xxx \
-e LITESTREAM_S3_SECRET_ACCESS_KEY=yyy \
ghcr.io/cloudshipai/station:production
Benefits:
Database Replication Guide โ
Version control your agent configurations, MCP templates, and variables in Git:
# Create a Git repository for your Station config
mkdir my-station-config
cd my-station-config
# Initialize Station in this directory
export STATION_WORKSPACE=$(pwd)
stn init
# Your agents are now in ./environments/default/agents/
# Commit to Git and share with your team!
git init
git add .
git commit -m "Initial Station configuration"
Team Workflow:
# Clone team repository
git clone git@github.com:your-team/station-config.git
cd station-config
# Run Station with this workspace
export STATION_WORKSPACE=$(pwd)
stn stdio
All agent .prompt files, MCP template.json configs, and variables.yml are version-controlled and reviewable in Pull Requests.
Make it easy for engineering teams to build and deploy infrastructure agents on their own terms.
Station puts you in control:
We believe teams should own their agentic automation, from development to production.
If you're interested in contributing to Station or understanding the internals, comprehensive architecture documentation is available in the docs/architecture/ directory:
These documents provide a complete understanding of Station's four-layer architecture, 43+ service modules, database schema, API endpoints, and execution flows.
Apache 2.0 - Free for all use, open source contributions welcome.
Station - AI Agent Orchestration Platform
Build, test, and deploy intelligent agent teams. Self-hosted. Git-backed. Production-ready.
.claude-plugin/
marketplace.json
.github/
actions/
build-bundle/
action.yml
build-image/
action.yml
README.md
setup-station/
action.yml
CICD_BUILD_CHECKLIST.md
CODEOWNERS
dependabot.yml
ISSUE_TEMPLATE/
bug_report.md
bug.md
enhancement.md
feature_request.md
feature.md
pull_request_template.md
workflows/
check-large-files.yml
ci.yml
docker.yml
docs.yml
install-script.yml
opencode-plugin-ci.yml
opencode-plugin-release.yml
release.yml
station-skill-release.yml
test-actions.yml
.gitignore
.golangci.yml
.goreleaser.yml
agents/
sre-rca.prompt
assets/
agent-edit.png
default-environment.png
env-variables.png
run.png
terraform-quality-agent.png
bundles/
demos/
aws-k8s-grafana/
agents/
aws-billing-events.prompt
aws-cost-inventory.prompt
aws-cost-spike-rca.prompt
aws-forecast-and-budget-risk.prompt
rightsizing-advisor-lite.prompt
template.json
variables.yml
aws-serverless-datadog/
agents/
lambda-forecast.prompt
lambda-spend-rca.prompt
serverless-tuning-advisor.prompt
template.json
variables.yml
aws-stripe-cogs/
agents/
cogs-rollup-no-opencost.prompt
payment-fee-optimization.prompt
stripe-billing-inventory.prompt
stripe-fee-rca.prompt
template.json
variables.yml
cicd-security/
faker-config.json
deployments-opportunities/
agents/
artifact-size-reducer.prompt
build-cache-optimizer.prompt
deployment-frequency-booster.prompt
dora-metrics-improver.prompt
rollback-safety-enhancer.prompt
test-parallelization-advisor.prompt
template.json
finops-demo/
agents/
Cost Forecaster.prompt
Cost Spike Investigator.prompt
template.json
finops-events/
agents/
anomaly-event-logger.prompt
deployment-cost-correlator.prompt
incident-cost-tracker.prompt
infrastructure-change-logger.prompt
pr-cost-impact-predictor.prompt
scaling-event-analyzer.prompt
template.json
finops-inventory/
agents/
budget-vs-actual-tracker.prompt
commitment-portfolio-tracker.prompt
cost-center-aggregator.prompt
infrastructure-drift-detector.prompt
k8s-workload-tracker.prompt
multi-cloud-resource-cataloger.prompt
template.json
finops-investigations/
agents/
aws-cost-spike-analyzer.prompt
k8s-namespace-drift-rca.prompt
multi-cloud-anomaly-explainer.prompt
service-unit-cost-rca.prompt
storage-egress-spike-rca.prompt
third-party-saas-rca.prompt
template.json
finops-opportunities/
agents/
budget-optimization-planner.prompt
ec2-rightsizing-advisor.prompt
k8s-resource-optimizer.prompt
orphaned-resource-cleaner.prompt
rds-optimization-finder.prompt
reserved-capacity-advisor.prompt
template.json
finops-projections/
agents/
commitment-expiration-planner.prompt
growth-impact-modeler.prompt
k8s-capacity-forecaster.prompt
monthly-cost-forecaster.prompt
quarterly-budget-planner.prompt
seasonal-variance-predictor.prompt
template.json
gcp-gke-bigquery-grafana/
agents/
gcp-billing-delta-rca.prompt
gcp-billing-forecast.prompt
gcp-cost-inventory.prompt
template.json
variables.yml
reliability-investigations/
agents/
capacity-exhaustion-rca.prompt
cascade-failure-rca.prompt
error-burst-rca.prompt
incident-root-cause-analyzer.prompt
latency-spike-rca.prompt
performance-regression-detector.prompt
saturation-rca.prompt
slo-breach-rca.prompt
template.json
variables.yml
security-investigations/
agents/
data-exfil-rca.prompt
guardduty-threat-analyzer.prompt
guardduty-threat-rca.prompt
privilege-escalation-rca.prompt
public-exposure-rca.prompt
runtime-incident-rca.prompt
secrets-leak-rca.prompt
vuln-exploitability-rca.prompt
vulnerability-exploitability-assessor.prompt
template.json
variables.yml
security-opportunities/
agents/
cis-hardening-recommender.prompt
iam-least-privilege-advisor.prompt
network-security-optimizer.prompt
patch-priority-planner.prompt
runtime-policy-advisor.prompt
secret-hygiene-coach.prompt
template.json
test-inventory/
agents/
budget-vs-actual-tracker.prompt
commitment-portfolio-tracker.prompt
cost-center-aggregator.prompt
infrastructure-drift-detector.prompt
k8s-workload-tracker.prompt
multi-cloud-resource-cataloger.prompt
template.json
variables.yml
test-investigations/
agents/
aws-cost-spike-analyzer.prompt
k8s-namespace-drift-rca.prompt
multi-cloud-anomaly-explainer.prompt
service-unit-cost-rca.prompt
storage-egress-spike-rca.prompt
third-party-saas-rca.prompt
template.json
variables.yml
test-opportunities/
agents/
budget-optimization-planner.prompt
ec2-rightsizing-advisor.prompt
k8s-resource-optimizer.prompt
orphaned-resource-cleaner.prompt
rds-optimization-finder.prompt
reserved-capacity-advisor.prompt
template.json
variables.yml
test-projections/
agents/
commitment-expiration-planner.prompt
growth-impact-modeler.prompt
k8s-capacity-forecaster.prompt
monthly-cost-forecaster.prompt
quarterly-budget-planner.prompt
seasonal-variance-predictor.prompt
template.json
variables.yml
examples/
deterministic-fakers/
datadog-apm.json
elasticsearch-logs.json
gcp.json
grafana-dashboards.json
kubernetes-metrics.json
pagerduty-incidents.json
prometheus-metrics.json
README.md
finops/
aws-k8s-grafana/
agents/
aws-billing-events.prompt
aws-cost-inventory.prompt
aws-cost-spike-rca.prompt
aws-forecast-and-budget-risk.prompt
rightsizing-advisor-lite.prompt
template.json
variables.yml
aws-serverless-datadog/
agents/
lambda-forecast.prompt
lambda-spend-rca.prompt
serverless-tuning-advisor.prompt
template.json
variables.yml
aws-stripe-cogs/
agents/
cogs-rollup-no-opencost.prompt
payment-fee-optimization.prompt
stripe-billing-inventory.prompt
stripe-fee-rca.prompt
template.json
variables.yml
gcp-gke-bigquery-grafana/
agents/
gcp-billing-delta-rca.prompt
gcp-billing-forecast.prompt
gcp-cost-inventory.prompt
template.json
variables.yml
lattice-demo/
orchestrator-team/
agents/
Coordinator.prompt
security-team/
agents/
NetworkAuditor.prompt
ThreatAnalyzer.prompt
VulnScanner.prompt
sre-team/
agents/
IncidentResponder.prompt
K8sHealthChecker.prompt
LogAnalyzer.prompt
schemas/
faker-config.schema.json
finops.event@1.json
finops.inventory@1.json
finops.investigation@1.json
finops.opportunity@1.json
finops.projection@1.json
CHANGELOG.md
claude-code-plugin/
claude-code-plugin-agent/
.claude-plugin/
plugin.json
agents/
station-operator.md
README.md
.claude-plugin/
plugin.json
commands/
station.md
README.md
skills/
station/
station-config/
SKILL.md
SKILL.md
CLAUDE.md
cmd/
main/
agent.go
animation.go
auth_anthropic.go
auth.go
banner.go
benchmark.go
build.go
bundle_export.go
bundle_unified.go
cli.go
commands.go
config_test.go
config.go
deploy_export.go
develop.go
down.go
faker_create_shortcut.go
faker_create.go
faker_sessions.go
faker_templates.go
faker.go
files.go
github.go
handlers/
agent/
execution.go
handlers.go
local.go
utils.go
benchmark/
handlers.go
build/
builder.go
handler.go
runtime_builder.go
common/
common.go
utils.go
deploy/
deploy.go
ansible.go
bundle.go
config.go
deploy.go
fly.go
helpers.go
kubernetes.go
secrets.go
types.go
files_handlers.go
jaeger_clean.go
jaeger.go
opencode.go
report/
handlers.go
runs_handlers.go
theme_handlers.go
harness_repl.go
lattice_adapter.go
lattice_commands.go
main.go
mock.go
model.go
openapi_runtime.go
provider_setup.go
provider.go
report.go
runs.go
secrets.go
server.go
session_commands.go
stdio.go
styles.go
sync_simple_test.go
up_unix.go
up_windows.go
up.go
workflow.go
openapi-mcp-server/
main.go
codecov.yml
CONTRIBUTING.md
deployments/
argo-workflows/
README.md
workflow.yaml
circleci/
config.yml
README.md
github-actions/
action.yml
examples/
basic-infrastructure.yml
bundle-from-url.yml
comprehensive-security.yml
multi-provider.yml
pr-review.yml
LICENSE
README.md
gitlab-ci/
.gitlab-ci.yml
README.md
jenkins/
Jenkinsfile
README.md
... 1580 moreFAQ
station is a Claude Code plugin with 4 hand-picked skills for agent orchestration work, indexed on Flowy. Install it with the command on its page. It includes station-config, station, code-review. Its skills do not fire on their own yet. Request auto-invocation to have Flowy route them as you prompt. Free and open source.