*** title: Unleash MCP Server 'og:site\_name': Unleash Documentation 'og:title': Unleash MCP Server - AI-powered feature flag management description: >- A Model Context Protocol (MCP) server that enables LLM-powered coding assistants to create and manage Unleash feature flags following best practices. keywords: >- mcp, model context protocol, ai, llm, coding assistants, claude, feature flags, automation max-toc-depth: 3 slug: integrate/mcp ------------------- The Unleash MCP server is an experimental feature. Functionality may change, and we do not yet recommend using it in production environments. To share feedback, join our [community Slack](https://www.getunleash.io/unleash-community), open an [issue on GitHub](https://github.com/Unleash/unleash-mcp/issues), or email us at **[beta@getunleash.io](mailto:beta@getunleash.io)**. A purpose-driven [Model Context Protocol](https://modelcontextprotocol.io) (MCP) server for managing [Unleash](https://www.getunleash.io/) feature flags. This server enables LLM-powered coding assistants to create and manage feature flags following Unleash best practices. ## Overview This MCP server provides tools that integrate with the [Unleash Admin API](/get-started/unleash-overview#admin-api), allowing AI coding assistants to: * **Create feature flags** with proper validation and typing. * **Detect existing flags** to prevent duplicates or encourage reuse. * **Evaluate changes** to decide when a feature flag is needed. * **Stream progress** for visibility during operations. * **Handle errors** gracefully with helpful hints. * **Follow best practices** from the [Unleash documentation](/guides/feature-flag-best-practices). ### Available tools The MCP server exposes the following tools: * `create_flag`: Creates a feature flag in Unleash. * `evaluate_change`: Scores risk and recommends feature flag usage. * `detect_flag`: Discovers existing feature flags to avoid duplicates. * `wrap_change`: Provides guidance on how to wrap a change in a feature flag. * `set_flag_rollout`: Configures rollout strategies for a feature flag (does not enable the flag). * `get_flag_state`: Surfaces a feature flag's metadata and its activation strategies. * `toggle_flag_environment`: Enables or disables a feature flag in an environment. * `remove_flag_strategy`: Deletes a feature flag's strategy from an environment. * `cleanup_flag`: Generates instructions for safely removing flagged code paths. ### Core workflow The core workflow for an AI assistant is designed to be: 1. `evaluate_change`: First, assess a code change to see if a flag is needed. 2. `detect_flag`: This is often called automatically by `evaluate_change` to prevent creating duplicate flags. 3. `create_flag`: If a new flag is required, this tool creates it in Unleash. 4. `wrap_change`: Finally, this tool provides the language-specific code to implement the new flag. See more information on the core workflow tools in the [Tool reference](#tool-reference) section. ## Prerequisites Before you can run the server, you need the following: * Node.js 18 or higher * Yarn package manager or npm * An Unleash instance (hosted or self-hosted) * A [personal access token](/concepts/api-tokens-and-client-keys#personal-access-tokens) with permissions to create feature flags ## Get started This section covers the different ways to install and run the Unleash MCP server. You can either follow a setup for [agents](#agent-setup) (such as Claude Code and Codex), run the MCP as a [standalone process](#quickstart-with-npx) using npx, or use a [local development](#local-development-setup) setup. ### Agent setup You can add the MCP server directly to Claude Code or Codex. Agent configurations are path-specific. You must run the following command from the root directory of the project where you want to use the MCP. For Claude Code: ```bash claude mcp add unleash \ --env UNLEASH_BASE_URL={{your-instance-url}} \ --env UNLEASH_PAT={{your-personal-access-token}} \ -- npx -y @unleash/mcp@latest --log-level error ``` Check out the dedicated [Claude Code integration guide](/integrate/claude-code) for additional guidance and best practices. For Codex: ```bash codex mcp add unleash \ --env UNLEASH_BASE_URL={{your-instance-url}} \ --env UNLEASH_PAT={{your-personal-access-token}} \ -- npx -y @unleash/mcp@latest --log-level error ``` For GitHub Copilot in VS Code or the Copilot CLI, check out the dedicated [Copilot integration guide](/integrate/github-copilot). ### Quickstart with npx You can run the MCP server as a standalone process without cloning the repository using `npx`. Provide configuration through environment variables or a local `.env` file in the directory where you run the command: ```bash UNLEASH_BASE_URL={{your-instance-url}} \ UNLEASH_PAT={{your-personal-access-token}} \ UNLEASH_DEFAULT_PROJECT={{default_project_id}} \ npx unleash-mcp --log-level debug ``` The CLI supports the same flags as the local build (for example, `--dry-run`, `--log-level`). ### Local development setup Follow these steps to set up the project for local development. 1. **Install dependencies** Clone the repository and install dependencies using Yarn. ```bash git clone https://github.com/Unleash/unleash-mcp.git cd unleash-mcp yarn install ``` 2. **Configure environment variables** Copy `.env.example` to `.env` and fill in your Unleash credentials: ```bash cp .env.example .env ``` Edit `.env`: ```env UNLEASH_BASE_URL={{your-instance-url}} UNLEASH_PAT={{your-personal-access-token}} UNLEASH_DEFAULT_PROJECT={{default_project_id}} # Optional: the project the MCP should use by default ``` 3. **Build the project** ```bash yarn build ``` Output will be in the `dist/` directory. 4. **(Optional) Run checks** Run type checking, linting, and tests: ```bash # Type checking and linting yarn lint # Run tests (the Vitest framework is configured, but no test suites yet) yarn test ``` #### Running the server **Development mode with hot reload** ```bash yarn dev ``` **Production mode** ```bash node dist/index.js ``` **With CLI flags** ```bash # Dry run mode (simulates API calls without actually creating flags) node dist/index.js --dry-run # Custom log level node dist/index.js --log-level debug # Combine flags node dist/index.js --dry-run --log-level debug ``` ## Tool reference This section describes each of the core tools in detail, including its purpose, parameters, and output. ### Create flag The `create_flag` tool creates a new feature flag in Unleash with comprehensive validation and progress tracking. #### When to use Use this tool when you have already determined that a feature flag is required (for example, after running `evaluate_change`) and you are ready to create it with the correct type and metadata. #### Parameters The tool accepts the following parameters: * `name` (required): Unique feature flag name within the project. * `type` (required): Feature flag type indicating lifecycle and intent. * `release`: Gradual feature rollouts to users. * `experiment`: A/B tests and experiments. * `operational`: System behavior and operational toggles. * `kill-switch`: Emergency shutdowns or circuit breakers. * `permission`: Control feature access based on user roles or entitlements. * `description` (required): Clear explanation of what the flag controls and why it exists. * `projectId` (optional): Target project (defaults to `UNLEASH_DEFAULT_PROJECT`). * `impressionData` (optional): Enable analytics tracking (defaults to false). #### Usage example **Agent prompt** ``` Use create_flag with: - name: "new-checkout-flow" - type: "release" - description: "Gradual rollout of the redesigned checkout experience" - projectId: "ecommerce" ``` **Tool payload** ```json { "name": "new-checkout-flow", "type": "release", "description": "Gradual rollout of the redesigned checkout experience with improved conversion tracking", "projectId": "ecommerce", "impressionData": true } ``` **Tool output** On success, the tool returns a JSON object containing the new feature flag's URL in the Unleash Admin UI, an MCP resource link for programmatic access, creation timestamp, and configuration details. ### Evaluate change The `evaluate_change` tool evaluates whether a code change should be behind a feature flag. It examines the structure, context, and potential risk of the change and returns a recommendation with an explanation and next steps. #### When to use Use `evaluate_change` at the beginning of a feature or modification when you want to understand whether the work requires a feature flag. This tool is also helpful when you are unsure which flag type to use or want guidance on rollout planning. #### How it works The tool returns detailed, markdown-formatted guidance for the LLM assistant based on [Unleash best practices](/guides/feature-flag-best-practices). The guidance includes: * **Parent flag detection**: Checks if code is already protected by existing flags. * **Risk assessment**: Analyzes code patterns to identify risky operations. * **Code type evaluation**: Classifies the change (for example, test, config, feature, or bug fix). * **Recommendation**: Suggests whether to create a flag, use an existing flag, or skip the flag. * **Next actions**: Provides specific instructions on what to do next. When `evaluate_change` determines a flag is needed, it provides explicit instructions to: 1. Call `create_flag` tool to create the feature flag. 2. Call `wrap_change` tool to get language-specific code wrapping guidance. 3. Implement the wrapped code following the detected patterns. **The evaluation process** The tool follows a clear evaluation process: ``` Step 1: Gather code changes (git diff, read files) ↓ Step 2: Check for parent flags (avoiding nesting) ↓ Step 3: Assess code type (test? config? feature?) ↓ Step 4: Evaluate risk (auth? payments? API changes?) ↓ Step 5: Calculate risk score ↓ Step 6: Make recommendation ↓ Step 7: Take action (create flag or proceed without) ``` **Risk assessment** The tool uses language-agnostic patterns to score risk: * **Critical risk** (Score +5): For example, auth, payments, security, and database operations. * **High risk** (Score +3): For example, API changes, external services, or new classes. * **Medium risk** (Score +2): For example, async operations or state management. * **Low risk** (Score +1): For example, bug fixes, refactors, or small changes. **Parent flag detection** The tool looks for common patterns across languages, such as: * **Conditionals**: `if (isEnabled('flag'))`, `if client.is_enabled('flag'):` * **Assignments**: `const enabled = useFlag('flag')` * **Hooks**: `const enabled = useFlag('flag')` → `{enabled && }` * **Guards**: `if (!isEnabled('flag')) return;` * **Wrappers**: `withFeatureFlag('flag', () => {...})` #### Parameters All parameters are optional, but more context leads to better recommendations: * `repository` (string): Repository name or path. * `branch` (string): Current branch name. * `files` (array): List of files being changed. * `description` (string): Description of the change. * `riskLevel` (enum): `low`, `medium`, `high`, or `critical`, as assessed by the user. * `codeContext` (string): Surrounding code for parent flag detection. #### Usage example **Agent prompt** Simple usage where you let the agent gather context: ``` Use evaluate_change to help me determine if I need a feature flag ``` Explicit instructions: ``` Use evaluate_change with: - description: "Add Stripe payment processing" - riskLevel: "high" ``` **Tool payload** ```json { "repository": "my-app", "branch": "feature/stripe-integration", "files": ["src/payments/stripe.ts"], "description": "Add Stripe payment processing", "riskLevel": "high", "codeContext": "surrounding code for parent flag detection" } ``` **Tool output** Returns a JSON object with the evaluation result, including a `needsFlag` boolean, a `recommendation` (e.g., "create\_new"), a suggested flag name, risk level, and a detailed `explanation`. ```json { "needsFlag": true, "reason": "new_feature", "recommendation": "create_new", "suggestedFlag": "stripe-payment-integration", "riskLevel": "critical", "riskScore": 5, "explanation": "This change integrates Stripe payments, which is critical risk...", "confidence": 0.9 } ``` ### Detect flag The `detect_flag` tool finds existing feature flags in the codebase so you can reuse them instead of creating duplicates. This tool is automatically integrated into the `evaluate_change` workflow but can also be used manually. #### When to use Use this tool before creating a new feature flag or during code evaluation to check for existing flags that might already cover your use case. This helps prevent flag duplication. #### How it works The tool returns comprehensive search instructions and uses multiple detection strategies: * **File-based detection**: Search in files you're modifying for existing flags. * **Git history analysis**: Look for recently added flags in commit history. * **Semantic name matching**: Match descriptions to existing flag names. * **Code context analysis**: Inspect code around the change. The tool then follows a scoring process: ``` Step 1: Execute file-based search (grep for flag patterns in target files) ↓ Step 2: Search git history for recent flag additions ↓ Step 3: Perform semantic matching (description → flag names) ↓ Step 4: Analyze code context (if provided) ↓ Step 5: Combine scores from all methods ↓ Step 6: Return best candidate with confidence score ``` **Confidence levels** The tool returns candidates with confidence scores: * High `≥0.7`: Strong match; reuse is recommended. * Medium `0.4-0.7`: Possible match; review manually. * Low `<0.4`: Weak match; likely create a new flag. #### Parameters * `description` (required): Description of the change or feature. For example, `"payment processing with Stripe"`, `"new checkout flow"`. * `files` (optional): Files being modified. For example, `["src/payments/stripe.ts", "src/checkout/flow.ts"]`. * `codeContext` (optional): Nearby code to scan for flags. #### Usage example **Agent prompt** Check for existing flags before creating a flag: ``` Use detect_flag with description "payment processing with Stripe" ``` Integrated automatically in evaluation: ``` Use evaluate_change - automatically searches for existing flags ``` **Tool payload** ```json { "description": "payment processing with Stripe", "files": ["src/payments/stripe.ts"] } ``` **Tool output** Returns a JSON object indicating if a flag was found. If `flagFound` is true, it includes a `candidate` object with the flag's name, location, confidence score, and the reason for the match. Match found: ```json { "flagFound": true, "candidate": { "name": "stripe-payment-integration", "location": "src/payments/stripe.ts:42", "context": "if (client.isEnabled('stripe-payment-integration')) {", "confidence": 0.85, "reasoning": "Found in same file you're modifying, added 2 days ago", "detectionMethod": "file-based" } } ``` No match found: ```json { "flagFound": false, "candidate": null } ``` ### Wrap change The tool `wrap_change` generates language-specific code snippets and guidance for wrapping code with feature flags. It helps LLMs and developers follow existing patterns in the codebase and use flags correctly. #### When to use Use this tool after you have created a feature flag (with `create_flag`) and need to implement it in your code. It's especially useful when you want to ensure you are following existing codebase patterns or need framework-specific examples (e.g., React, Django). #### How it works This tool is the final step in the `evaluate_change` → `create_flag` → `wrap_change` workflow. The tool provides the following guidance in its response: 1. **Search instructions**: Step-by-step guide for finding existing flag patterns in your codebase using grep. 2. **Pattern detection**: Identifies common patterns (for example, imports, client variable names, method names, or wrapping styles). 3. **Default templates**: Fallback code snippets if no patterns are found. 4. **Framework-specific examples**: Specialized patterns for React, Express, Django, and others. 5. **Multiple patterns**: If-blocks, guard clauses, hooks, decorators, middleware, and more. **Supported languages and frameworks:** * **TypeScript/JavaScript**: Node.js, React Hooks, Express middleware. * **Python**: FastAPI, Django, Flask decorators. * **Go**: Standard if-blocks, HTTP middleware. * **Ruby**: Rails controllers. * **PHP**: Laravel controllers. * **C#**: .NET/ASP.NET controllers. * **Java**: Spring Boot. * **Rust**: Actix/Rocket handlers. #### Parameters * `flagName` (required): Feature flag name to wrap the code with. For example: `"new-checkout-flow"`, or `"stripe-integration"`. * `language` (optional): Programming language (auto-detected from `fileName` if not provided). Supported: `typescript`, `javascript`, `python`, `go`, `ruby`, `php`, `csharp`, `java`, `rust` * `fileName` (optional): File name being modified (helps detect language), For example: `"checkout.ts"`, `"payment.py"`, or `"handler.go"`. * `codeContext` (optional): Surrounding code to help detect existing patterns. * `frameworkHint` (optional): Framework for specialized templates. For example, `"React"`, `"Express"`, `"Django"`, `"Rails"`, or `"Spring Boot"`. #### Usage example **Agent prompt** ``` Use wrap_change with: - flagName: "new-checkout-flow" - fileName: "src/components/checkout.ts" - frameworkHint: "React" ``` **Tool payload** ```json { "flagName": "new-checkout-flow", "fileName": "checkout.ts", "frameworkHint": "React" } ``` **Tool output** Returns a comprehensive, markdown-formatted string that guides the user on how to wrap their code. This includes a quickstart, search instructions, wrapping instructions with placeholders, all available templates for the language, and links to SDK documentation. ```markdown # Feature Flag Wrapping Guide: "new-checkout-flow" **Language:** TypeScript **Framework:** React ## Quick Start [Recommended pattern with import and usage] ## How to Search for Existing Flag Patterns [Step-by-step Grep instructions] ## How to Wrap Code with Feature Flag [Wrapping instructions with examples] ## All Available Templates [If-block, guard clause, hooks, ternary, etc.] ``` ## Architecture The server follows a focused, purpose-driven design. ### Structure ``` src/ ├── index.ts # Main server entry point ├── config.ts # Configuration loading and validation ├── context.ts # Shared runtime context ├── unleash/ │ └── client.ts # Unleash Admin API client ├── tools/ │ ├── createFlag.ts # create_flag tool │ ├── evaluateChange.ts # evaluate_change tool │ ├── detectFlag.ts # detect_flag tool │ └── wrapChange.ts # wrap_change tool ├── prompts/ │ └── promptBuilder.ts # Markdown formatting utilities ├── evaluation/ │ ├── riskPatterns.ts # Risk assessment patterns │ └── flagDetectionPatterns.ts # Parent flag detection patterns ├── detection/ │ ├── flagDiscovery.ts # Flag discovery strategies │ └── flagScoring.ts # Scoring and ranking logic ├── knowledge/ │ └── unleashBestPractices.ts # Best practices knowledge base ├── templates/ │ ├── languages.ts # Language detection and metadata │ ├── wrapperTemplates.ts # Code wrapping templates │ └── searchGuidance.ts # Pattern search instructions └── utils/ ├── errors.ts # Error normalization └── streaming.ts # Progress notifications ``` ### Design principles * **Thin surface area**: Only the endpoints needed for the core capabilities. * **Purpose-driven**: Each module serves a specific, well-defined purpose. * **Explicit validation**: Zod schemas validate all inputs before API calls. * **Error normalization**: All errors converted to `{code, message, hint}` format. * **Progress streaming**: Long-running operations provide visibility. * **Best practices integration**: Guidance from Unleash docs embedded in tool descriptions. ## Configuration This section provides a quick reference for all configuration options. **Environment variables:** * `UNLEASH_BASE_URL`: Your Unleash instance URL (required). * `UNLEASH_PAT`: Personal access token (required). * `UNLEASH_DEFAULT_PROJECT`: The default project ID the MCP should use (optional). **CLI flags:** * `--dry-run`: Simulate operations without making actual API calls. * `--log-level`: Set logging verbosity (debug, info, warn, error). ## Best practices This server encourages Unleash best practices from the [official documentation](/guides/feature-flag-best-practices): ### Flag lifecycle 1. **Create with intent**: Choose the right flag type to signal purpose. 2. **Document clearly**: Write descriptions that explain the "why". 3. **Plan for cleanup**: Feature flags are temporary; plan their removal. 4. **Monitor usage**: Enable impression data for important flags. ### Flag types * **Release flags**: For gradual feature rollouts (remove after full rollout). * **Experiment flags**: For A/B tests (remove after analysis). * **Operational flags**: For system behavior (longer-lived, review periodically). * **Kill switches**: For emergency controls (maintain until feature is stable). * **Permission flags**: For access control (longer-lived, review permissions). ### Naming conventions * Use kebab-case: `new-checkout-flow` * Be descriptive: `enable-ai-recommendations` not `flag1`. * Include scope when needed: `mobile-push-notifications`. ## API reference This server uses the Unleash Admin API. For complete API documentation, see: * [Unleash Admin API OpenAPI Spec](https://app.unleash-hosted.com/hosted/docs/openapi.json) * [Unleash API Documentation](/api) ### Endpoints used * `POST /api/admin/projects/{projectId}/features` - Create feature flag ## Troubleshooting ### Configuration issues **Error: "UNLEASH\_BASE\_URL must be a valid URL"**: Ensure your base URL is complete, including protocol. For example, `https://app.unleash-hosted.com/instance`. Remove any trailing slashes. **Error: "UNLEASH\_PAT is required"**: Check that your `.env` file exists and contains `UNLEASH_PAT={{your-personal-access-token}}`. Verify that the token is valid in Unleash. ### API issues **Error: "HTTP\_401"**: Your personal access token may be invalid or expired. Generate a new token under **Profile > View Profile settings > Personal API tokens > New token**. **Error: "HTTP\_403"**: Your token doesn't have permission to create flags in this project. Review your role and permissions in Unleash. **Error: "HTTP\_404"**: The project ID doesn't exist. Confirm the project ID in Unleash Admin UI. **Error: "HTTP\_409"**: A flag with this name already exists in the project. Use a different name or reuse the existing flag. ## License MIT ## Contributing This is a purpose-driven project with a focused scope. Contributions should: * Align with the three core capabilities (create, evaluate, wrap). * Maintain the thin, purpose-driven architecture. * Follow Unleash best practices. * Include clear documentation.