Open source · MIT · Self-hostable

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 docs
Request
curl "https://exp.3m4.net/api/eval/flags?distinct_id=user-42" \
  -H "X-Environment-Key: exp_env_…"
Response
{
  "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 }
  }
}
web-appmobile-app
  • 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.
Model Context Protocol

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 at https://exp.3m4.net/mcp with your key.
Claude Code · local (npm)
claude mcp add exp --scope user --env EXP_API_KEY=exp_live_… -- npx -y exp-mcp
Claude Code · remote (nothing to install)
claude mcp add --transport http exp https://exp.3m4.net/mcp --header "Authorization: Bearer exp_live_…"
Any MCP host (JSON)
{
  "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.

View on GitHub