Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use Station CLI (`stn`) for AI agent orchestration - creating agents, running tasks, managing environments, and deploying agent teams. Prefer CLI for file operations and exploration; use MCP tools for programmatic agent execution and detailed queries.
.claude/skills/majiayu000-station/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 105% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 225% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 122% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 235% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 194% | 0% |
Station is a self-hosted AI agent orchestration platform. You interact with it via the stn CLI or MCP tools (41+ available via stn stdio).
| Task | Use CLI | Use MCP Tool | |------|---------|--------------| | Create/edit agent files | stn agent create, edit .prompt files | - | | Run an agent | stn agent run <name> "<task>" | call_agent | | List agents/environments | stn agent list, stn env list | list_agents, list_environments | | Add MCP servers | stn mcp add <name> | add_mcp_server_to_environment | | Sync configurations | stn sync <env> | - | | Install bundles | stn bundle install <url> | - | | Inspect runs | stn runs list | inspect_run, list_runs | | Deploy | stn deploy <env> | - | | Start services | stn serve, stn jaeger up | - |
Rule of thumb: CLI for setup, file operations, deployment. MCP tools for programmatic execution and queries within conversations.
bash# Initialize Station with AI provider stn init --provider openai --ship # OpenAI with Ship filesystem tools stn init --provider anthropic --ship # Anthropic (requires OAuth: stn auth anthropic login) stn init --provider gemini --ship # Google Gemini # Initialize in specific directory (git-backed workspace) stn init --provider openai --config ./my-workspace # Start Jaeger for observability stn jaeger up # View traces at http://localhost:16686
bash# List agents stn agent list # All agents in default environment stn agent list --env production # Agents in specific environment # Show agent details stn agent show <agent-name> # Full configuration # Run an agent stn agent run <name> "<task>" # Execute with task stn agent run incident-coordinator "High latency on API" stn agent run cost-analyzer "Analyze this week's AWS spend" --env production stn agent run my-agent "task" --tail # Follow output in real-time # Delete agent stn agent delete <name>
bash# List environments stn env list # Sync file configurations to database stn sync default # Sync default environment stn sync default --browser # Secure input for secrets (recommended for AI) stn sync default --dry-run # Preview changes stn sync default --validate # Validate only
bash# Add MCP server stn mcp add <name> --command <cmd> --args "<args>" # Examples stn mcp add filesystem --command npx --args "-y,@modelcontextprotocol/server-filesystem,/path" stn mcp add github --command npx --args "-y,@modelcontextprotocol/server-github" --env "GITHUB_TOKEN={{.TOKEN}}" stn mcp add playwright --command npx --args "-y,@playwright/mcp@latest" # Add OpenAPI spec as MCP server stn mcp add-openapi petstore --url https://petstore3.swagger.io/api/v3/openapi.json # List and manage stn mcp list # List configurations stn mcp tools # List available tools stn mcp status # Show sync status stn mcp delete <config-id> # Remove configuration
bash# Install bundle from URL or CloudShip stn bundle install <url-or-id> <environment> stn bundle install https://example.com/bundle.tar.gz my-env stn bundle install devops-security-bundle security # Create bundle from environment stn bundle create <environment> stn bundle create default --output ./my-bundle.tar.gz # Share bundle to CloudShip stn bundle share <environment> # Export required variables from bundle (for CI/CD) stn bundle export-vars ./my-bundle.tar.gz --format yaml stn bundle export-vars ./my-bundle.tar.gz --format env stn bundle export-vars <cloudship-bundle-id> --format yaml
bash# List workflows stn workflow list stn workflow list --env production # Run workflow stn workflow run <name> stn workflow run incident-response --input '{"severity": "high"}' # Manage approvals (for human-in-the-loop) stn workflow approvals list stn workflow approvals approve <approval-id> stn workflow approvals reject <approval-id> --reason "Not authorized" # Inspect and validate stn workflow inspect <run-id> stn workflow validate <name> stn workflow export <name> --output workflow.yaml
bash# Start Station server (web UI at :8585) stn serve stn serve --dev # Development mode # Docker container mode stn up # Interactive setup stn up --bundle <bundle-id> # Run specific bundle stn status # Check container status stn logs -f # Follow logs stn down # Stop container # DEPLOY TO CLOUD (3 methods) # Method 1: Local environment stn deploy <environment> --target fly # Deploy to Fly.io stn deploy production --target k8s # Deploy to Kubernetes stn deploy production --target ansible # Deploy via Ansible (SSH + Docker) # Method 2: CloudShip bundle ID (no local environment needed) stn deploy --bundle-id <uuid> --target fly stn deploy --bundle-id <uuid> --target k8s --name my-station # Method 3: Local bundle file stn deploy --bundle ./my-bundle.tar.gz --target fly stn deploy --bundle ./my-bundle.tar.gz --target k8s # Deploy flags --target fly, kubernetes/k8s, ansible (default: fly) --bundle-id CloudShip bundle UUID (uses base image) --bundle Local .tar.gz bundle file --name Custom app name --region Deployment region (default: ord) --namespace Kubernetes namespace --dry-run Generate configs only, don't deploy --auto-stop Enable idle auto-stop (Fly.io) --destroy Tear down deployment # IMPORTANT: K8s and Ansible require a container registry # Fly.io has built-in registry, no extra setup needed # Export variables for CI/CD stn deploy export-vars default --format yaml > deploy-vars.yml
bash# Run benchmarks stn benchmark run <agent-name> stn benchmark list # Generate reports stn report create <name> stn report list
bash# List runs stn runs list stn runs list --agent <name> stn runs list --limit 20 # Inspect run details (via MCP tools is more detailed)
Station stores configurations at ~/.config/station/:
~/.config/station/
├── config.yaml # Main configuration
├── station.db # SQLite database
└── environments/
└── default/
├── *.prompt # Agent definitions
├── *.json # MCP server configurations
└── variables.yml # Template variable valuesAgents are .prompt files with YAML frontmatter:
yaml--- metadata: name: "my-agent" description: "What this agent does" model: gpt-4o-mini max_steps: 8 tools: - "__tool_name" # MCP tools prefixed with __ --- {{role "system"}} You are a helpful agent that [purpose]. {{role "user"}} {{userInput}}
yaml--- metadata: name: "coordinator" description: "Orchestrates specialist agents" model: gpt-4o-mini max_steps: 20 agents: - "specialist-a" # Becomes __agent_specialist_a tool - "specialist-b" --- {{role "system"}} You coordinate specialists: - @specialist-a: handles X - @specialist-b: handles Y Delegate using __agent_<name> tools, then synthesize results. {{role "user"}} {{userInput}}
JSON files in environment directories:
json{ "mcpServers": { "server-name": { "command": "npx", "args": ["-y", "@package/mcp-server"], "env": { "API_KEY": "{{.API_KEY}}" } } } }
Template variables ({{.VAR}}) are resolved during stn sync.
bash# Create agent file cat > ~/.config/station/environments/default/my-agent.prompt << 'EOF' --- metadata: name: "my-agent" description: "Description here" model: gpt-4o-mini max_steps: 5 tools: [] --- {{role "system"}} You are a helpful agent. {{role "user"}} {{userInput}} EOF # Sync to database stn sync default # Run it stn agent run my-agent "Hello, what can you do?"
bash# Add GitHub MCP server with template variable stn mcp add github \ --command npx \ --args "-y,@modelcontextprotocol/server-github" \ --env "GITHUB_TOKEN={{.GITHUB_TOKEN}}" # Sync (will prompt for GITHUB_TOKEN) stn sync default --browser # Now agents can use __github_* tools
bash# Create specialist agents first # Edit files at ~/.config/station/environments/default/ # Create coordinator that uses them cat > ~/.config/station/environments/default/coordinator.prompt << 'EOF' --- metadata: name: "coordinator" description: "Coordinates investigation" model: gpt-4o-mini max_steps: 15 agents: - "logs-analyst" - "metrics-analyst" --- {{role "system"}} Coordinate these specialists to investigate issues. {{role "user"}} {{userInput}} EOF stn sync default stn agent run coordinator "Investigate high latency"
bash# Install SRE bundle stn bundle install https://github.com/cloudshipai/registry/releases/latest/download/sre-bundle.tar.gz sre # Sync the environment stn sync sre # List and run agents stn agent list --env sre stn agent run incident-coordinator "API returning 503 errors" --env sre
| Variable | Description | |----------|-------------| | OPENAI_API_KEY | OpenAI API key | | ANTHROPIC_API_KEY | Anthropic API key | | GEMINI_API_KEY | Google Gemini API key | | OTEL_EXPORTER_OTLP_ENDPOINT | OTLP endpoint (default: http://localhost:4318) | | STATION_CONFIG_DIR | Override config directory |
bashstn sync <environment> # Resync configurations stn mcp tools # Verify tools are loaded
bashstn mcp status # Check server status # Test command manually: npx -y @package/mcp-server
bashstn jaeger up # Start Jaeger # Open http://localhost:16686 # Search for service: station
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 16,479 | 11,328 | -31% | 1 | 1 | 0% | 1,935 | 3,965 | +105% | 0 | 0 | — |
case-02 | fail→pass | 13,285 | 13,019 | -2% | 1 | 1 | 0% | 1,369 | 4,446 | +225% | 0 | 0 | — |
case-03 | fail→pass | 16,400 | 13,826 | -16% | 1 | 1 | 0% | 2,033 | 4,513 | +122% | 0 | 0 | — |
case-04 | fail→pass | 11,741 | 10,074 | -14% | 1 | 1 | 0% | 1,108 | 3,716 | +235% | 0 | 0 | — |
case-05 | fail→fail | 17,175 | 12,287 | -28% | 1 | 1 | 0% | 1,948 | 4,246 | +118% | 0 | 0 | — |
case-06 | pass→pass | 18,567 | 17,095 | -8% | 1 | 1 | 0% | 2,109 | 4,718 | +124% | 0 | 0 | — |
case-07 | fail→pass | 12,116 | 8,340 | -31% | 1 | 1 | 0% | 1,149 | 3,382 | +194% | 0 | 0 | — |
case-08 | fail→pass | 11,858 | 8,421 | -29% | 1 | 1 | 0% | 1,151 | 3,424 | +197% | 0 | 0 | — |
case-09 | fail→pass | 15,642 | 3,090 | -80% | 1 | 1 | 0% | 1,707 | 3,307 | +94% | 0 | 0 | — |
case-10 | fail→pass | 18,584 | 7,551 | -59% | 1 | 1 | 0% | 2,287 | 3,270 | +43% | 0 | 0 | — |
case-11 | fail→pass | 15,359 | 7,896 | -49% | 1 | 1 | 0% | 1,956 | 3,422 | +75% | 0 | 0 | — |
case-12 | pass→pass | 21,164 | 7,969 | -62% | 1 | 1 | 0% | 2,610 | 3,330 | +28% | 0 | 0 | — |
case-13 | fail→pass | 8,851 | 7,555 | -15% | 1 | 1 | 0% | 1,532 | 3,313 | +116% | 0 | 0 | — |
case-14 | fail→pass | 8,193 | 8,603 | +5% | 1 | 1 | 0% | 1,228 | 3,456 | +181% | 0 | 0 | — |
case-15 | fail→pass | 14,987 | 9,336 | -38% | 1 | 1 | 0% | 1,475 | 3,562 | +141% | 0 | 0 | — |
case-16 | fail→pass | 23,291 | 2,004 | -91% | 1 | 1 | 0% | 2,945 | 3,130 | +6% | 0 | 0 | — |
case-17 | fail→pass | 11,704 | 6,892 | -41% | 1 | 1 | 0% | 969 | 3,138 | +224% | 0 | 0 | — |
case-23 | pass→pass | 14,732 | 11,645 | -21% | 1 | 1 | 0% | 2,414 | 4,057 | +68% | 0 | 0 | — |
case-18 | fail→pass | 12,270 | 7,719 | -37% | 1 | 1 | 0% | 1,145 | 3,209 | +180% | 0 | 0 | — |
case-19 | fail→pass | 13,046 | 9,994 | -23% | 1 | 1 | 0% | 1,392 | 3,759 | +170% | 0 | 0 | — |
case-20 | fail→pass | 19,316 | 7,661 | -60% | 1 | 1 | 0% | 2,246 | 3,268 | +46% | 0 | 0 | — |
case-21 | fail→pass | 28,074 | 7,530 | -73% | 1 | 1 | 0% | 1,791 | 3,276 | +83% | 0 | 0 | — |
case-22 | fail→pass | 12,555 | 7,612 | -39% | 1 | 1 | 0% | 1,210 | 3,278 | +171% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted, and 22 counted toward the lift figure. The other 1 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +83 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.