---
name: sleipner
description: Operate a Sleipner stack via MCP — add the server, whoami, init, deploy, status+loopback, env, set_secret (human pastes), logs. Teardown is a human click. Use when the human wants a hosted stack with minted Postgres. Do not invent keys. Do not paste secret values into tools.
---

# Sleipner

Sleipner is the landlord. The human has one account. You drive the stack. They click teardown in the browser.

## First steps

1. Add the MCP: `claude mcp add sleipner --transport http https://api.sleipner.ai/mcp`. Entire POST /mcp is 401 until OAuth. First call 401s. Show `login_url`. A session on `app.sleipner.ai` is not the MCP token — Claude OAuth PKCE is.
2. Call `sleipner_whoami`. Unauth GET `https://api.sleipner.ai/v1/whoami` returns `{authenticated:false, login_url}`. Do not invent keys. Do not paste secret values into tools.
3. `sleipner_init` with name+slug. Free: one stack, placeholder image, Postgres `DATABASE_URL` we mint, `APP_URL`, `AUTH_SECRET`.
4. `sleipner_deploy` with stack_id and optional artifact_id/image.
5. `sleipner_wait` then `sleipner_status`. Public `https://{slug}.sites.sleipner.ai` is not live yet (no *.sites DNS/TLS). Verify with: `curl -H 'Host: {slug}.sites.sleipner.ai' http://127.0.0.1:8787/healthz`. Do not tell the human a friend can open the HTTPS URL.
6. `sleipner_env` to list. `sleipner_set_secret` takes a name only and returns a dashboard URL — the human pastes the value there. `sleipner_unset_secret` to remove.
7. `sleipner_logs` when something breaks.
8. `sleipner_teardown` does not delete. It returns a dashboard URL. Human clicks.

## Rules

- Do not invent keys. Do not paste secret values into tools.
- Do not tell the human a friend can open `https://{slug}.sites.sleipner.ai`.
- Tenant legal starters (privacy / terms / delete-my-data) live in the control-plane repo `templates/legal/`. Copy into their app. Not an MCP tool.
