The CLI + MCP that provisions, wires, and operates every service.
you are here“Stack my backend.”
One prompt. 39 providers, real accounts, every key vaulted, .env + .mcp.json wired. In under a minute.
stack add does for it.Get Stack into Claude. Then never leave chat again.
Pick the path that matches where you are. Each one ends with Claude able to call /stack:add, provision upstream services, vault every key in Phantom, and write .env + .mcp.json — without you touching a terminal.
Just tell Claude.
Paste this into any Claude Code session. The agent reads /llms.txt + ai-plugin.json, discovers Stack, and installs itself.
Install the plugin.
Adds /stack:add,
/stack:doctor,
/stack:list,
/stack:status
— first-class slash commands.
Wire the MCP server.
Drop this into
.mcp.json
(or your editor's MCP settings). Exposes all 19 Stack tools to any agent.
{
"mcpServers": {
"ashlr-stack": {
"command": "npx",
"args": ["-y", "ashlr-stack-mcp"]
}
}
} Forty-five minutes. Or four seconds.
Wiring a single service the old way vs. stack add supabase. Scroll through the delta.
1. Create Supabase project (browser)
2. Paste keys into .env.local
3. Install client
4. Wire up MCP server by hand
5. Generate personal access token (browser)
6. Lint your .env out of git history (just in case)
7. Restart Claude Code, pray MCP attaches
8. Realize you forgot to add Sentry, Resend, PostHog …
Try it live.
Not a recording. Scripted boot-up, then the prompt unlocks — type any stack command (try stack recommend "b2b saas with auth" or stack add supabase posthog) and see the real output the CLI would print, driven by the same provider catalog the binary ships with.
Pick your stack. See the recipe — live.
Click any provider to inspect the real stack add invocation, every env var it writes, and — where present — the MCP entry Stack drops into .mcp.json. Tick as many as you want and export the whole recipe.
- MCPSupabase· OAuthPostgres + Auth + Storageinspect →
- MCPNeon· PATServerless Postgresinspect →
- Turso· PATEdge SQLite (libSQL)inspect →
- keyConvex· API keyReactive backend-as-a-serviceinspect →
- keyUpstash· API keyServerless Redis + Kafkainspect →
- keyFirebase· Service keyRealtime DB + Authinspect →
- MCPVercel· PATFrontend platforminspect →
- keyRailway· API keyInfra from a repoinspect →
- keyFly.io· API keyVMs at the edgeinspect →
- MCPCloudflare· PATWorkers, R2, D1inspect →
- keyRender· API keyZero-config hostinginspect →
- keyModal· API keyServerless GPU + sandboxinspect →
- keyAWS· API keyS3, Lambda, RDSinspect →
- keyGCP· API keyGoogle Cloud Platforminspect →
- keyDigitalOcean· PATDroplets, Kubernetes, managed DBsinspect →
- keyHetzner· API keyAffordable European cloud serversinspect →
- keyOpenAI· API keyGPT, Realtime, embeddingsinspect →
- keyAnthropic· API keyClaude models + MCPinspect →
- keyxAI· API keyGrok + tool useinspect →
- keyDeepSeek· API keyOpen-weight modelsinspect →
- keyReplicate· PATOSS model inferenceinspect →
- keyBraintrust· API keyLLM evals + observabilityinspect →
- MCPkeyPostHog· API keyProduct analytics + flagsinspect →
- keyMixpanel· API keyProduct analyticsinspect →
- PLkeyPlausible· API keyPrivacy-friendly web analyticsinspect →
- keyDatadog· API keyMetrics, traces, logsinspect →
- keyGrafana· PATDashboards + alertinginspect →
- MCPSentry· PATError + performance trackinginspect →
- MCPkeyStripe· API keyBilling, subscriptions, taxinspect →
- MCPGitHub· DeviceRepos, Actions, OAuthinspect →
- MCPkeyLinear· API keyIssues, projects, cyclesinspect →
- keyResend· API keyTransactional + React emailinspect →
- keySendGrid· API keyHigh-volume transactional mailinspect →
- keyMailgun· API keyAPI-first email + routinginspect →
- POkeyPostmark· API keyDeliverability-focused transactionalinspect →
- keyClerk· API keyDrop-in auth + usersinspect →
- keyAuth0· API keyIdentity platforminspect →
- WOkeyWorkOS· API keyEnterprise SSO + Directory Syncinspect →
- LAkeyLaunchDarkly· API keyFeature flags + experimentationinspect →
Brand marks provided by simple-icons and used for identification. All trademarks are property of their respective owners. Secret values never leave your machine — Phantom resolves phantom:// slots locally at read-time.
Three surfaces, one source of truth.
Stack coordinates the CLI, the vault, and your project files so every developer on a repo — and every agent with access — sees an identical stack. Click a step to pause the auto-walkthrough.
What it looks like in your Claude Code session.
Four canonical moments: a fresh SaaS scaffold, adding analytics to an existing
app, rotating a leaked token, and picking a provider from the catalog. Each
shows the actual chat turn, the stack
command Claude invokes, and the terminal output your agent will see.
Spin up a new SaaS — zero to deployable
Start a new SaaS: auth, Postgres, product analytics, error tracking, transactional email. Wire everything so I can `bun dev` in one minute.
5 providers provisioned, 11 env vars in Phantom, 3 MCP servers wired. `.env.local` + `.mcp.json` are ready. Claude Code can now query the DB + tail Sentry without copy-paste.
Opinionated starters, wired end-to-end.
Each template is a real stack — not a boilerplate dump. Pick one; see the exact
stack add invocations,
every env var that lands in .env,
and the .mcp.json your
Claude Code session will see.
Next.js + Supabase + PostHog
App Router, Supabase Auth + Postgres, PostHog events from server actions.
# Vercel — Personal access token VERCEL_TOKEN=<phantom://vercel/VERCEL_TOKEN> # Supabase — OAuth (PKCE) SUPABASE_URL=<phantom://supabase/SUPABASE_URL> SUPABASE_ANON_KEY=<phantom://supabase/SUPABASE_ANON_KEY> SUPABASE_SERVICE_ROLE_KEY=<phantom://supabase/SUPABASE_SERVICE_ROLE_KEY> # PostHog — API key POSTHOG_PERSONAL_API_KEY=<phantom://posthog/POSTHOG_PERSONAL_API_KEY>
{
"mcpServers": {
"vercel": {
"command": "stack",
"args": [
"mcp",
"run",
"vercel"
],
"env": {
"VERCEL_TOKEN": "<phantom://vercel/VERCEL_TOKEN>"
}
},
"supabase": {
"command": "stack",
"args": [
"mcp",
"run",
"supabase"
],
"env": {
"SUPABASE_URL": "<phantom://supabase/SUPABASE_URL>",
"SUPABASE_ANON_KEY": "<phantom://supabase/SUPABASE_ANON_KEY>",
"SUPABASE_SERVICE_ROLE_KEY": "<phantom://supabase/SUPABASE_SERVICE_ROLE_KEY>"
}
},
"posthog": {
"command": "stack",
"args": [
"mcp",
"run",
"posthog"
],
"env": {
"POSTHOG_PERSONAL_API_KEY": "<phantom://posthog/POSTHOG_PERSONAL_API_KEY>"
}
}
}
}stack init opens an interactive picker — tick providers, stack provisions them.
Your agent can run Stack directly.
Stack ships as an MCP server + a first-party Claude Code plugin. From chat,
call /stack:add and Claude
provisions the upstream resource, stores every secret in Phantom, and re-wires
.mcp.json — zero copy-paste.
- MCP-nativeEvery CLI command is exposed as an MCP tool.
- Plugin commands/stack:add · /stack:doctor · /stack:open live in chat.
- Phantom-gatedThe agent sees a slot name, never a key.
Every MCP-capable agent, out of the box.
Stack's MCP server drops into Claude Code, Cursor, Windsurf, Codex, or ashlrcode with
the same stack mcp serve
entry point. Click a client to see the exact config Stack writes — path + JSON.
Four tools. One coherent platform.
Stack is the control plane. Phantom is the vault. ashlr-plugin is the context compressor. ashlrcode is the multi-model runtime. They compose — none of them require the others, but together they're load-bearing. Hover a satellite to highlight the relationship.
.stack.toml → ashlrcode respects the same secret slots Questions — answered.
The honest objections first. If a question isn't here, open one on GitHub Discussions — I'll add it here.
No — .env is the last step. Stack owns everything before: the provider-side OAuth, the upstream resource creation, the secret rotation surface. .env is where Stack *publishes* the result, but the secret value lives only in Phantom's E2E-encrypted vault. If you rotate a key in Phantom, every consumer (your dev server, your agent, CI) sees the new value on the next read — no file edits, no commits.
Stack holds slot names (phantom://supabase/SUPABASE_URL), not values. The CLI shells out to the Phantom binary whenever a value needs to be materialised, and the materialisation is scoped to a single subprocess call (stack exec -- …). The agent-facing MCP server is configured with the slot names; values are fetched per-tool-call, never cached. Stack's own code has no code path that can leak a secret outside the subprocess that asked for it.
Those are pure secret managers. Stack is a thin coordinator on top of one: you use Phantom for storage, Stack for the provisioning + wiring workflow. Stack can provision a new Supabase project, a new Vercel token, a new Sentry DSN — not just store one you already have. The MCP integration is also specific: Stack wires .mcp.json so your Claude Code session sees a consistent stack without manual copy-paste.
Claude Code is the primary surface (first-party plugin + MCP server). Anything that reads a standard .mcp.json — Cursor, Windsurf, Zed's AI panel, the Codex CLI, any Anthropic SDK client — picks up the same configuration. The .env side is framework-agnostic: Next.js, Bun, Deno, Rails, Django all read it the same way.
Your .env.local and .mcp.json are normal files. If you delete Stack, those files keep working — you'll just have raw phantom:// slots in .env that your shell won't resolve. Running `phantom export > .env.local` materialises every slot into literal values, at which point you can walk away with a conventional .env file and no trace of Stack left. Stack writes a managed block with `# Ashlr Stack — managed block` markers so unmanaged lines are never touched.
v0.1: the 39 providers in the catalog above, the CLI (26 commands), the Claude Code plugin, the MCP server, 5 starter templates. Full OAuth provisioning ships for Supabase + GitHub + Vercel + Cloudflare; the rest are API-key paste flows. Roadmap: Stripe Connect, AWS IAM role-chaining, an Ashlr-hosted control plane for team sync. Everything is MIT-licensed on GitHub.
Stack is free and MIT-licensed. Phantom has a free tier for local-only vaults; Phantom Cloud (the team-sync surface) is paid but not required. Every underlying provider is billed by the provider — Stack doesn't mark anything up. The hosted control plane (coming soon) will have a free tier for solo developers.
Yes. Provider adapters live in packages/core/src/providers/*.ts and are a single file each — three exports: authKind, secrets[], and provision(ctx). The README walks through adding a new one in under 50 lines. PRs welcome.