Feature flags for projects, people and AI agents
exp gives every project its own environments and flags: toggle, roll out to a percentage, or serve typed values. Read them from your app with one request, and manage them from the dashboard, the REST API or an MCP server.
Early access: every account gets full access, free. Plans come later, with notice.
How it works
1. Create a project
Each project comes with production, staging and development environments, each with its own client key.
2. Add flags
Boolean, string, number or JSON flags. Set enabled, value and rollout percentage per environment.
3. Evaluate from your app
One GET with the environment key returns every flag resolved for a user. Deterministic rollouts, no SDK required.
A tiny evaluation API
No SDK, no polling library: your app sends the environment client key and an optional distinct_id, and gets back every flag already resolved. Rollouts hash the flag key and the user id, so the same user always lands on the same side.
Environment keys only evaluate — they can never change a flag.
Read the docscurl "https://exp.3m4.net/api/eval/flags?distinct_id=user-42" \
-H "X-Environment-Key: exp_env_…"{
"environment": { "key": "production" },
"distinct_id": "user-42",
"flags": {
"new-checkout": { "kind": "boolean", "enabled": true, "value": true },
"banner-text": { "kind": "string", "enabled": true, "value": "Spring sale" },
"max-items": { "kind": "number", "enabled": false, "value": null }
}
}- new-checkoutcopied
- banner-textoverwritten
- max-itemscopied
- legacy-footerskipped
Copy flags between projects
Spinning up a second app, a white-label client or a new region? Copy the flag definitions — and optionally their per-environment states — from one project to another in one transaction.
- Pick all flags or just a few.
- States land on the environment with the same key; missing ones get the default state.
- Choose skip or overwrite on conflicts, and see exactly what was copied.
Let your AI agent manage flags
exp ships an MCP server. Connect it to Claude Code, Claude Desktop, Cursor or any MCP host and ask things like “enable new-checkout for 25% of staging” or “copy the flags from web-app to mobile-app”
- Role-scoped keys. A viewer key never even sees the delete tool; editor and admin unlock more. Enforced by the API too.
- Human in the loop. Destructive actions ask you to confirm before anything happens.
- Audit trail. Every change and every refused call is logged, server-side and agent-side.
- Local or remote. Run it over stdio with
npx exp-mcp(npm) or point your host athttps://exp.3m4.net/mcpwith your key.
claude mcp add exp --scope user --env EXP_API_KEY=exp_live_… -- npx -y exp-mcpclaude mcp add --transport http exp https://exp.3m4.net/mcp --header "Authorization: Bearer exp_live_…"{
"mcpServers": {
"exp": {
"command": "npx",
"args": ["-y", "exp-mcp"],
"env": { "EXP_API_KEY": "exp_live_…" }
}
}
}Create a key with the role you want under Dashboard → API keys.
Ship behind a flag today
Create a project, grab an environment key and evaluate your first flag in under five minutes.
Early access. Every account has full access at no cost right now. Plans and limits will be introduced later, with notice before anything changes.
Self-host it (MIT, open source)
The entire stack — Flask API, MCP server and this Qwik app — is MIT-licensed. Run it on your own VPS with onedocker compose up. No billing code, no limits beyond what you configure.