Featureflip
NPM · @FEATUREFLIP/MCP
Manage Featureflip feature flags, targeting and rollouts from AI agents and editors.
Available components
Last scanned (3 hours ago)
Scores higher than 82% of npm servers
Category Developer Tools
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security100
- No malware found by supply-chain analysis.Pass
- No known CVEs affecting this package version or its production dependencies.Pass
- No install/post-install scripts declared.Pass
- 0 of 3 dependencies flagged as unhealthy. View diagnostics → Pass
Provenance & Transparency48
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
- Clear OSI-approved license (Apache-2.0).Pass
- Actively maintained (last published 1 days ago).Pass
- Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability68
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 5681 tokens (~162/item across 35 items; 35 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
- No destabilizing schema changes in the last 30 days.Pass
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
- Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- All 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
- An AI judge read all 35 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a current MCP spec version (2026-07-28).Pass
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 4 Nov 26 +11
- Known CVEs: unverified → pass ▲ security
- Dependency health: unverified → 1.00 ▲ functional
- 3 Nov 26 −11
- Known CVEs: pass → unverified ▼ security
- Dependency health: 1.00 → unverified ▼ functional
- Package version: 0.5.0 → 0.6.0 functional
- 2 Nov 26 +1
- Security disclosure: unverified → pass ▲ functional
- 1 Nov 26 −1
- Security disclosure: pass → unverified ▼ functional
- 31 Oct 26 +15
- Malware scan: unverified → pass ▲ security
- 30 Oct 26 −15
- Malware scan: pass → unverified ▼ security
- Package version: 0.4.0 → 0.5.0 functional
- 28 Oct 26 +15
- Malware scan: unverified → pass ▲ security
- 27 Oct 26 −15
- Malware scan: pass → unverified ▼ security
- Package version: 0.3.0 → 0.4.0 functional
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 5 Nov 2026 · Analysed npm/@featureflip/mcp@0.6.0
Provenance No attestation
The registry publishes no build provenance for this version, so there is nothing to verify.
| Result | No attestation |
|---|---|
| Ecosystem | npm |
Background: How many MCP packages publish verified provenance →
Dependencies 3 packages
| Packages resolved | 3 |
|---|---|
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
archive_flag Archive feature flag ~184
Archive a flag (soft-hide, evaluation stops serving it). Reversible with restore_flag. Archive dependents first: refused with FLAG_HAS_DEPENDENTS while another live flag lists this one as a prerequisite, so archive those flags (blockedBy in find_stale_flags / list_removal_candidates) first. Refused with FLAG_RECENTLY_EVALUATED while live traffic is still evaluating the flag, because archiving makes every caller fall back to its own hardcoded default — normally that means the code removal has merged but not deployed yet, and the refusal clears itself once it has.
| Name | Type | Req | Description |
|---|---|---|---|
| flag | string | yes | Flag key or id |
| force | boolean | – | Archive even though traffic is still evaluating the flag. Only for clients that can never be updated (old mobile app versions), where traffic will never drain on its own. |
| project | string | yes | Project key |
| Name | Type | Req | Description |
|---|---|---|---|
| archived | boolean | yes | – |
| flag | string | yes | – |
No examples provided.
create_flag Create feature flag ~341
Create a feature flag. type is one of Boolean|String|Number|Json. Boolean flags get true/false variations automatically; for other types pass initialVariations. The flag is created in every environment of the project (disabled).
| Name | Type | Req | Description |
|---|---|---|---|
| clientSideVisible | boolean | – | Expose to client-side SDKs (browser/mobile) |
| description | string | – | What the flag controls |
| expiresAtUtc | string | – | Optional date (YYYY-MM-DD, end of that UTC day) or ISO-8601 timestamp the flag is expected to be removed by (see set_flag_expiry) |
| idempotency_key | string | – | Idempotency-Key header for safe retries |
| initialVariations | array | – | Variations for a String, Number or Json flag (Boolean flags get true/false automatically) |
| isPermanent | boolean | – | Mark the flag permanent: a kill switch, ops toggle or entitlement gate that is meant to stay. Permanent flags are never listed as removal candidates or by find_stale_flags. Cannot be combined with ex… |
| key | string | yes | Unique flag key, e.g. checkout-v2 |
| name | string | yes | Display name |
| ownerEmail | string | – | Optional owner: the email of an active member (Pro plan and above, see set_flag_owner). Omitted, a personal access token makes its own user the owner and a service token leaves the flag unowned |
| project | string | yes | Project key |
| tags | array | – | Tags for filtering, e.g. team or area |
| type | string | yes | Value type; Boolean gets true/false variations automatically |
| Name | Type | Req | Description |
|---|---|---|---|
| _actions | object|null | – | Capability hints: which operations the authenticated caller may perform on this resource, each with allowed + optional reason. Computed from the caller's role and the resource's state. Injected at ru… |
| clientSideVisible | boolean|null | – | – |
| createdAt | string|null | – | – |
| description | string|null | – | – |
| effectiveExpiresAtUtc | string|null | – | – |
| expiresAtUtc | string|null | – | – |
| expirySource | string|null | – | – |
| id | string|null | – | – |
| isArchived | boolean|null | – | – |
| isPermanent | boolean|null | – | – |
| key | string|null | – | – |
| name | string|null | – | – |
| owner | – | – | – |
| removalPrUrl | string|null | – | – |
| tags | array|null | – | – |
| type | string|null | – | Allowed values: Boolean, String, Number, Json. |
| updatedAt | string|null | – | – |
| variations | array|null | – | – |
No examples provided.
delete_flag Delete feature flag ~67
PERMANENTLY delete a flag across all environments. Fails with FLAG_HAS_DEPENDENTS if other flags use it as a prerequisite. Prefer archive_flag unless the flag must be fully removed.
| Name | Type | Req | Description |
|---|---|---|---|
| flag | string | yes | Flag key or id |
| project | string | yes | Project key |
| Name | Type | Req | Description |
|---|---|---|---|
| deleted | string | yes | – |
No examples provided.
deliver_webhook Send a test event or redeliver ~156
action=test queues one synthetic flag.toggled event to this subscription alone; action=redeliver (deliveryId from list_webhook_deliveries) re-sends a finished delivery, restarting its retry schedule. Delivery is asynchronous: read list_webhook_deliveries for the outcome. Both are refused for a disabled subscription, and redeliver for a delivery that is still Pending. Requires an Admin token. A 404 on every webhook call means webhooks are not enabled for the organization.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | test sends a synthetic event; redeliver re-sends deliveryId |
| deliveryId | string | – | Required for redeliver |
| id | string | yes | Subscription id (from list_webhooks) |
Structured output declared, but exposes no named fields.
No examples provided.
find_stale_flags Find stale flags ~412
Find flags that look ready for code cleanup: not updated in N days AND either enabled in every environment (verify rollout is complete before removing — per-rule percentage ramps are not inspected) or disabled in every environment (dead — remove flag and code path). A flag whose expiry date (set_flag_expiry) has passed is always a candidate, however recently it was edited; if it is on in some environments and off in others its reason is past-expiry, meaning the owner has to decide which way to fold it. A project can give its temporary flags a default lifetime, so a flag with no date of its own can still be past expiry. Every result carries expiresAtUtc (the date set on the flag), effectiveExpiresAtUtc (the date in effect, from the flag or its project default), expirySource (explicit, project-default, or null), expired and owner (null when unowned). Flags marked permanent (kill switches, ops toggles) are never listed. Pass owner to see one person's stale flags ("me" for your own) or "none" for the unowned ones. Every result also carries blockedBy: the live flags that still list it as a prerequisite, which have to be removed and archived before it ([] when none). blockedBy is null when the server did not classify the flag as a removal candidate, which means unknown, not unblocked. A flag that other live flags list as a prerequisite has to be removed LAST, dependents first: archiving it while a dependent still names it makes that dependent fail its prerequisite check and serve its off variation, so archive_flag refuses it with FLAG_HAS_DEPENDENTS. Checks at most 50 candidates per call, expired flags first.
| Name | Type | Req | Description |
|---|---|---|---|
| days | integer | – | Minimum age in days since last update |
| owner | string | – | Only flags with this owner: an email, "me" for the token's own user, or "none" for unowned flags |
| project | string | yes | Project key |
| Name | Type | Req | Description |
|---|---|---|---|
| blockedByNote | string | – | – |
| checked | integer | yes | – |
| note | string | – | – |
| olderThanDays | integer | yes | – |
| owner | string | – | – |
| project | string | yes | – |
| stale | array | yes | – |
| truncated | boolean | yes | – |
No examples provided.
flag_evaluations Flag evaluations in environment ~234
What a flag actually served in ONE environment over the last 7, 30 or 90 days: total evaluations, the split by variation, and which rule (or fallthrough, off, prerequisite, error) served what. Percentage-rollout rules include their configured weights and a sample-ratio check; rollout.flagged=true means the served split is statistically off the configured weights. A live rollout rule is always listed, with count 0 and no variations when it served nothing. rollout.unreached is set when a live rollout rule got no evaluations while the flag's rules got 100 or more: usually the context lacks rollout.bucketBy, or an earlier rule or the conditions catch the traffic. These are evaluation counts, NOT unique users. Counts come from SDK-reported events, so zero means no evaluations were reported, not necessarily no traffic.
| Name | Type | Req | Description |
|---|---|---|---|
| days | – | – | Window in UTC days: 7 (default), 30 or 90 |
| environment | string | yes | Environment key, e.g. production |
| flag | string | yes | Flag key or id |
| project | string | yes | Project key |
| Name | Type | Req | Description |
|---|---|---|---|
| days | integer|null | – | The window requested: 7, 30 or 90. |
| environmentKey | string|null | – | The environment's key. |
| fromUtc | string|null | – | Start of the window: UTC midnight `days - 1` days ago, or the flag's creation day if later. |
| lastEvaluatedAtUtc | string|null | – | The last reported evaluation, or null if none was reported. |
| sources | array|null | – | Evaluations per part of the targeting that served them: live rules in evaluation order, then deleted rules, then fallthrough, off, prerequisite, error, notFound and unknown. A live percentage-rollout… |
| toUtc | string|null | – | When the counts were read. |
| totalCount | integer|null | – | Evaluations in the window. Evaluation counts, not unique users. |
| variations | array|null | – | Evaluations per variation over the window. |
No examples provided.
flag_status Flag status across environments ~50
Compact cross-environment view of one flag: enabled state, strategy, default variation, and prerequisites per environment.
| Name | Type | Req | Description |
|---|---|---|---|
| flag | string | yes | Flag key or id |
| project | string | yes | Project key |
| Name | Type | Req | Description |
|---|---|---|---|
| archived | boolean | yes | – |
| environments | array | yes | – |
| key | string|null | yes | – |
| name | string|null | yes | – |
| type | string|null | yes | – |
| updatedAt | string|null | yes | – |
No examples provided.
get_flag Get feature flag ~54
Get one feature flag with its variations and metadata, including its owner (null when unowned). Address by flag key or id.
| Name | Type | Req | Description |
|---|---|---|---|
| flag | string | yes | Flag key or id |
| project | string | yes | Project key |
| Name | Type | Req | Description |
|---|---|---|---|
| _actions | object|null | – | Capability hints: which operations the authenticated caller may perform on this resource, each with allowed + optional reason. Computed from the caller's role and the resource's state. Injected at ru… |
| clientSideVisible | boolean|null | – | – |
| createdAt | string|null | – | – |
| description | string|null | – | – |
| effectiveExpiresAtUtc | string|null | – | – |
| etag | string | – | ETag of what was read. Pass it as ifMatch on the matching update so the write is refused (412) instead of overwriting a change made since. |
| expiresAtUtc | string|null | – | – |
| expirySource | string|null | – | – |
| id | string|null | – | – |
| isArchived | boolean|null | – | – |
| isPermanent | boolean|null | – | – |
| key | string|null | – | – |
| name | string|null | – | – |
| owner | – | – | – |
| removalPrUrl | string|null | – | – |
| tags | array|null | – | – |
| type | string|null | – | Allowed values: Boolean, String, Number, Json. |
| updatedAt | string|null | – | – |
| variations | array|null | – | – |
No examples provided.
get_segment Get user segment ~46
Get one user segment (its conditions, id, and metadata) by key or id.
| Name | Type | Req | Description |
|---|---|---|---|
| project | string | yes | Project key |
| segment | string | yes | Segment key or id |
| Name | Type | Req | Description |
|---|---|---|---|
| _actions | object|null | – | Capability hints: which operations the authenticated caller may perform on this resource, each with allowed + optional reason. Computed from the caller's role and the resource's state. Injected at ru… |
| conditions | array|null | – | – |
| createdAt | string|null | – | – |
| description | string|null | – | – |
| etag | string | – | ETag of what was read. Pass it as ifMatch on the matching update so the write is refused (412) instead of overwriting a change made since. |
| id | string|null | – | – |
| key | string|null | – | – |
| name | string|null | – | – |
| updatedAt | string|null | – | – |
No examples provided.
get_targeting Get targeting rules ~61
Get a flag's current targeting configuration (enabled flag + ordered rules) in one environment.
| Name | Type | Req | Description |
|---|---|---|---|
| environment | string | yes | Environment key, e.g. production |
| flag | string | yes | Flag key or id |
| project | string | yes | Project key |
| Name | Type | Req | Description |
|---|---|---|---|
| _actions | object|null | – | Capability hints: which operations the authenticated caller may perform on this resource, each with allowed + optional reason. Computed from the caller's role and the resource's state. Injected at ru… |
| etag | string | – | ETag of what was read. Pass it as ifMatch on the matching update so the write is refused (412) instead of overwriting a change made since. |
| isEnabled | boolean|null | – | – |
| rules | array|null | – | – |
No examples provided.
list_environments List environments ~60
List the environments of a project (e.g. development, staging, production).
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | – | next_cursor from a previous response |
| limit | integer | – | Page size (default 20) |
| project | string | yes | Project key |
| Name | Type | Req | Description |
|---|---|---|---|
| _actions | object|null | – | Capability hints: which operations the authenticated caller may perform on this resource, each with allowed + optional reason. Computed from the caller's role and the resource's state. Injected at ru… |
| items | array|null | – | – |
| next_cursor | string|null | – | – |
No examples provided.
list_flags List feature flags ~178
List feature flags in a project. Filter with search (key/name substring), tag, type, archived, owner. Each flag carries its owner ({id, email, name}, or null when unowned). Paginated via cursor.
| Name | Type | Req | Description |
|---|---|---|---|
| archived | boolean | – | true = only archived, false = only active |
| cursor | string | – | next_cursor from a previous response |
| limit | integer | – | Page size (default 20) |
| owner | string | – | Only flags with this owner: an email, "me" for the token's own user, or "none" for unowned flags |
| project | string | yes | Project key |
| search | string | – | Substring of the flag key or name |
| tag | string | – | Only flags carrying this tag |
| type | string | – | Only flags of this type |
| Name | Type | Req | Description |
|---|---|---|---|
| _actions | object|null | – | Capability hints: which operations the authenticated caller may perform on this resource, each with allowed + optional reason. Computed from the caller's role and the resource's state. Injected at ru… |
| items | array|null | – | – |
| next_cursor | string|null | – | – |
No examples provided.
list_projects List projects ~53
List projects in the Featureflip organization. Paginated: pass cursor from next_cursor to continue.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | – | next_cursor from a previous response |
| limit | integer | – | Page size (default 20) |
| Name | Type | Req | Description |
|---|---|---|---|
| _actions | object|null | – | Capability hints: which operations the authenticated caller may perform on this resource, each with allowed + optional reason. Computed from the caller's role and the resource's state. Injected at ru… |
| items | array|null | – | – |
| next_cursor | string|null | – | – |
No examples provided.
list_removal_candidates List removal candidates ~232
List the flags the server is confident can be removed from code, the same list the Featureflip flag cleanup GitHub Action works from. Each item has key, reason, status (Dead or Stale), treatment (true = keep the on-branch, false = keep the off-branch) and blockedBy: the live flags that still list it as a prerequisite. Only remove a flag whose blockedBy is empty. A flag that other live flags list as a prerequisite has to be removed LAST, dependents first: archiving it while a dependent still names it makes that dependent fail its prerequisite check and serve its off variation, so archive_flag refuses it with FLAG_HAS_DEPENDENTS. staleness "dead" (the default) returns only dead flags, "stale" adds stale ones. Paginated via cursor.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | – | next_cursor from a previous response |
| limit | integer | – | Page size (default 20) |
| project | string | yes | Project key |
| staleness | string | – | Minimum staleness tier: dead (default) or stale |
| Name | Type | Req | Description |
|---|---|---|---|
| items | array|null | – | – |
| next_cursor | string|null | – | – |
No examples provided.
list_sdk_keys List SDK keys ~101
List the SDK keys of one environment: id, name, type, last four characters, and whether each is active. The full key is never listed; it is shown once, when manage_sdk_key creates it.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | – | next_cursor from a previous response |
| environment | string | yes | Environment key, e.g. production |
| limit | integer | – | Page size (default 20) |
| project | string | yes | Project key |
| Name | Type | Req | Description |
|---|---|---|---|
| _actions | object|null | – | Capability hints: which operations the authenticated caller may perform on this resource, each with allowed + optional reason. Computed from the caller's role and the resource's state. Injected at ru… |
| items | array|null | – | – |
| next_cursor | string|null | – | – |
No examples provided.
list_segments List user segments ~63
List reusable user segments in a project. Segments are referenced from targeting rules via userSegmentId.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | – | next_cursor from a previous response |
| limit | integer | – | Page size (default 20) |
| project | string | yes | Project key |
| Name | Type | Req | Description |
|---|---|---|---|
| _actions | object|null | – | Capability hints: which operations the authenticated caller may perform on this resource, each with allowed + optional reason. Computed from the caller's role and the resource's state. Injected at ru… |
| items | array|null | – | – |
| next_cursor | string|null | – | – |
No examples provided.
list_webhook_deliveries List webhook deliveries ~124
List one subscription's delivery attempts, most recent first. status is Pending (awaiting an attempt, backing off, or in flight), Succeeded or DeadLettered; lastResponseStatusCode and lastError explain a failure. Paginated via cursor. Requires an Admin token. A 404 on every webhook call means webhooks are not enabled for the organization.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | – | next_cursor from a previous response |
| id | string | yes | Subscription id (from list_webhooks) |
| limit | integer | – | Page size (default 20) |
| Name | Type | Req | Description |
|---|---|---|---|
| items | array|null | – | – |
| next_cursor | string|null | – | – |
No examples provided.
list_webhooks List webhook subscriptions ~111
List the organization's outbound webhook subscriptions (url, event/project/environment filters, enabled state, failure count, signing secret ids — never secret values), plus availableEventTypes: the event types a subscription can filter on. Empty filter lists mean "all". Paginated via cursor. Requires an Admin token. A 404 on every webhook call means webhooks are not enabled for the organization.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | – | next_cursor from a previous response |
| limit | integer | – | Page size (default 20) |
| Name | Type | Req | Description |
|---|---|---|---|
| _actions | object|null | – | Capability hints: which operations the authenticated caller may perform on this resource, each with allowed + optional reason. Computed from the caller's role and the resource's state. Injected at ru… |
| availableEventTypes | array | – | Event types a subscription can filter on |
| items | array|null | – | – |
| next_cursor | string|null | – | – |
No examples provided.
manage_environment Create or update an environment ~182
Create an environment in a project, or change its name, color or sort order. action=create needs key + name; action=update needs environment and changes only the fields you pass. The key is immutable. Environments cannot be deleted from here. A new environment needs an SDK key before apps can use it (manage_sdk_key).
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | create needs key + name; update needs environment |
| color | string | – | Hex color shown in the dashboard, e.g. #22c55e |
| environment | string | – | Environment key to update; required for update |
| key | string | – | New environment key, required for create; immutable afterwards |
| name | string | – | Display name; required for create |
| project | string | yes | Project key |
| sortOrder | integer | – | Position in environment lists, lowest first |
Structured output declared, but exposes no named fields.
No examples provided.
manage_project Create or update a project ~134
Create a project, or change its name/description. action=create needs key + name; action=update needs project and changes only the fields you pass (description: "" clears it). The key is immutable. Projects cannot be deleted from here.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | create needs key + name; update needs project |
| description | string | – | What the project is for; "" clears it |
| key | string | – | New project key, required for create; immutable afterwards |
| name | string | – | Display name; required for create |
| project | string | – | Project key to update; required for update |
Structured output declared, but exposes no named fields.
No examples provided.
manage_sdk_key Create, rename, or revoke an SDK key ~214
Manage an environment's SDK keys. action=create needs name + type and returns the full key ONCE (ServerSide for backend SDKs, ClientSide for browser/mobile). action=rename needs sdkKey and changes only the fields you pass. action=revoke needs sdkKey and stops the key working immediately; apps still using it lose flag updates. To rotate: create a new key, deploy it, then revoke the old one.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | create needs name + type; rename and revoke need sdkKey |
| description | string | – | What the key is used for; "" clears it |
| environment | string | yes | Environment key, e.g. production |
| name | string | – | Key name; required for create |
| project | string | yes | Project key |
| sdkKey | string | – | SDK key id (see list_sdk_keys); required for rename and revoke |
| type | string | – | Required for create: ServerSide for backend SDKs, ClientSide for browser/mobile SDKs |
Structured output declared, but exposes no named fields.
No examples provided.
manage_segment Create, update, or delete a user segment ~261
Manage reusable user segments, which targeting rules reference by userSegmentId. action=create needs key + name (+ conditions); action=update needs segment and changes only the fields you pass (conditions replaces the whole list; description: "" clears it); action=delete needs segment. On update, pass ifMatch (the etag from get_segment) so a change someone made since you read it is not overwritten. ifMatch is rejected on create and delete: the API cannot make those conditional.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | create needs key + name; update and delete need segment |
| conditions | array | – | Conditions a user must match to be in the segment; on update, replaces the whole list |
| description | string | – | What the segment means; "" clears it |
| ifMatch | string | – | etag from get_segment. The write is refused with 412 if the resource changed since that read; re-read and re-apply. Omit to write unconditionally. |
| key | string | – | New segment key, required for create; immutable afterwards |
| name | string | – | Display name; required for create |
| project | string | yes | Project key |
| segment | string | – | Segment key or id; required for update and delete |
Structured output declared, but exposes no named fields.
No examples provided.
manage_targeting_rule Add, update, remove, or reorder one targeting rule ~223
Edit a single targeting rule instead of replacing them all with update_targeting. action=add needs rule (appended last); action=update needs ruleId + rule and changes only the fields you pass (conditionGroups replaces the rule's groups; to clear rolloutPercentage or userSegmentId use update_targeting); action=remove needs ruleId; action=reorder needs ruleIds, every existing rule id exactly once, in the new order. Rule ids come from get_targeting.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | add needs rule; update needs ruleId + rule; remove needs ruleId; reorder needs ruleIds |
| environment | string | yes | Environment key, e.g. production |
| flag | string | yes | Flag key or id |
| project | string | yes | Project key |
| rule | object | – | Rule fields; required for add and update |
| ruleId | string | – | Rule id from get_targeting; required for update and remove |
| ruleIds | array | – | Every rule id exactly once, in evaluation order; required for reorder |
Structured output declared, but exposes no named fields.
No examples provided.
manage_variation Add, update, or remove a variation ~157
Manage a flag's variations. action=add requires key + value; action=update/remove require variationId (get ids via get_flag). Removing a variation fails with VARIATION_HAS_DEPENDENTS if other flags depend on it.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | add needs key + value; update and remove need variationId |
| description | string | – | What this variation means |
| flag | string | yes | Flag key or id |
| key | string | – | Required for add; immutable afterwards |
| name | string | – | Display name |
| project | string | yes | Project key |
| value | string | – | Variation value serialized as a string; required for add |
| variationId | string | – | Required for update/remove |
Structured output declared, but exposes no named fields.
No examples provided.
manage_webhook Create, update, or delete a webhook subscription, or rotate its secret ~464
action=create requires name + url and returns the signing secret. action=update/delete/rotate_secret/retire_secret require id. provider (create only, default GenericHttp) is the destination type: a Slack incoming webhook URL (https://hooks.slack.com/services/...) needs provider: "Slack", which posts readable channel messages; a subscription's provider can never change. update changes only the fields you pass and keeps the rest; pass an empty list to widen that filter back to "all". projects take project keys or ids; environments take "<project>/<environment>" keys (e.g. "web/production") or ids. eventTypes come from list_webhooks → availableEventTypes. create and rotate_secret return a secret that is NEVER shown again: relay it to the user verbatim so they can store it. Slack doesn't verify signatures, so a Slack subscription's secret is unused and rotate_secret is refused for one. rotate_secret adds a new active secret while the old one keeps signing; retire_secret (secretId from list_webhooks) removes one and is refused for the last active secret. A project-restricted service token must list at least one project, all in its scope. Requires an Admin token. A 404 on every webhook call means webhooks are not enabled for the organization.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | What to do; every action except create needs id |
| enabled | boolean | – | update only; subscriptions are created enabled |
| environments | array | – | "<project>/<environment>" keys or environment ids; empty or omitted on create = all |
| eventTypes | array | – | Event types to send; empty or omitted = all |
| id | string | – | Subscription id; required for everything except create |
| idempotency_key | string | – | Idempotency-Key header for create / rotate_secret |
| name | string | – | Required for create |
| projects | array | – | Project keys or ids to cover; empty or omitted on create = all |
| provider | string | – | create only. Slack for a hooks.slack.com/services/ URL; GenericHttp (default) for your own endpoint |
| secretId | string | – | Required for retire_secret |
| url | string | – | Receiver URL; required for create |
Structured output declared, but exposes no named fields.
No examples provided.
restore_flag Restore archived flag ~34
Restore a previously archived flag.
| Name | Type | Req | Description |
|---|---|---|---|
| flag | string | yes | Flag key or id |
| project | string | yes | Project key |
| Name | Type | Req | Description |
|---|---|---|---|
| archived | boolean | yes | – |
| flag | string | yes | – |
No examples provided.
set_default_flag_lifetime Set or remove a project's default flag lifetime ~152
Set how many days a temporary flag with no expiry date of its own lives before it counts as expired, or pass days: null to remove the default. Advisory only: evaluation never changes. Pass preview: true first to see how many flags would newly be, or stop being, past expiry without changing anything. Setting a value is refused with FEATURE_NOT_ENABLED when the organization's plan lacks it; removal is always allowed. The current value is defaultFlagLifetimeDays in list_projects.
| Name | Type | Req | Description |
|---|---|---|---|
| days | – | yes | Lifetime in days (1–3650), or null to remove the default |
| preview | boolean | – | true: only report the impact; nothing is changed |
| project | string | yes | Project key |
| Name | Type | Req | Description |
|---|---|---|---|
| applied | boolean | yes | false for a preview |
| defaultFlagLifetimeDays | integer|null | yes | – |
| newlyPastExpiry | integer | yes | Flags this would put past expiry |
| noLongerPastExpiry | integer | yes | Flags this would take back out of expiry |
| project | string | yes | – |
No examples provided.
set_flag_expiry Set or clear flag expiry ~226
Set the date a flag is expected to be removed by, or pass expiresAtUtc: null to clear it. Expiry is advisory: evaluation never changes. Once the date passes, find_stale_flags reports the flag as expired. expiresAtUtc takes a date (2026-12-31), which means the end of that day in UTC, the same as picking it in the dashboard, or a full ISO-8601 timestamp, which is stored exactly. Refused with EXPIRY_IN_PAST for a time that has already passed (today's date is allowed), with FEATURE_NOT_ENABLED while flag expiration is not enabled for the organization, and with PERMANENT_FLAG_HAS_EXPIRY on a permanent flag (make it temporary first with set_flag_permanent). Clearing is always allowed.
| Name | Type | Req | Description |
|---|---|---|---|
| expiresAtUtc | string|null | yes | Date (YYYY-MM-DD, end of that UTC day) or ISO-8601 timestamp, or null to clear the expiry |
| flag | string | yes | Flag key or id |
| project | string | yes | Project key |
| Name | Type | Req | Description |
|---|---|---|---|
| expiresAtUtc | string|null | yes | – |
| flag | string | yes | – |
| project | string | yes | – |
No examples provided.
set_flag_owner Set or clear flag owner ~154
Name the person responsible for a flag, or pass owner: null to leave it unowned. owner is the email of an active member of the organization, or "me" for the token's own user (needs a personal access token). The owner gets the flag's cleanup notices; evaluation never changes. Refused with OWNER_NOT_MEMBER for an email that is not an active member, and with PLAN_FEATURE_UNAVAILABLE below the Pro plan. Clearing is always allowed.
| Name | Type | Req | Description |
|---|---|---|---|
| flag | string | yes | Flag key or id |
| owner | string|null | yes | Owner email, "me" for the token's own user, or null (or "none") to clear the owner |
| project | string | yes | Project key |
| Name | Type | Req | Description |
|---|---|---|---|
| flag | string | yes | – |
| owner | string|null | yes | Owner email now set, or null when unowned |
| project | string | yes | – |
No examples provided.
set_flag_permanent Mark a flag permanent or temporary ~163
Mark a flag permanent (a kill switch, ops toggle or entitlement gate that is meant to stay), or pass permanent: false to make it temporary again. Permanent flags are never listed as removal candidates or by find_stale_flags; evaluation never changes. Marking is refused with PERMANENT_FLAG_HAS_EXPIRY while the flag has an expiry date (clear it first with set_flag_expiry and expiresAtUtc: null), with FEATURE_NOT_ENABLED while permanent flags are not enabled for the organization, and on an archived flag. Making a flag temporary is always allowed.
| Name | Type | Req | Description |
|---|---|---|---|
| flag | string | yes | Flag key or id |
| permanent | boolean | yes | true to mark the flag permanent, false to make it temporary |
| project | string | yes | Project key |
| Name | Type | Req | Description |
|---|---|---|---|
| flag | string | yes | – |
| permanent | boolean | yes | – |
| project | string | yes | – |
No examples provided.
toggle_flag Toggle flag in environment ~84
Enable or disable a flag in ONE environment. Affects live evaluation immediately — double-check the environment.
| Name | Type | Req | Description |
|---|---|---|---|
| enabled | boolean | yes | true to turn the flag on in this environment, false to turn it off |
| environment | string | yes | Environment key, e.g. production |
| flag | string | yes | Flag key or id |
| project | string | yes | Project key |
| Name | Type | Req | Description |
|---|---|---|---|
| enabled | boolean | yes | – |
| environment | string | yes | – |
| flag | string | yes | – |
| project | string | yes | – |
No examples provided.
update_flag Update feature flag metadata ~204
Update flag name/description/tags/clientSideVisible. Changes only the fields you pass and keeps the rest; pass description: "" to clear it. Key and type are immutable. Use toggle_flag / update_targeting for behavior changes. Pass ifMatch (the etag from get_flag) to refuse the write if the flag changed since you read it.
| Name | Type | Req | Description |
|---|---|---|---|
| clientSideVisible | boolean | – | Expose to client-side SDKs (browser/mobile); false hides the flag from them entirely |
| description | string | – | New description; "" clears it |
| flag | string | yes | Flag key or id |
| ifMatch | string | – | etag from get_flag. The write is refused with 412 if the resource changed since that read; re-read and re-apply. Omit to write unconditionally. |
| name | string | – | New display name |
| project | string | yes | Project key |
| tags | array | – | Replaces the whole tag list |
| Name | Type | Req | Description |
|---|---|---|---|
| etag | string | – | ETag of what this write left behind. Pass it as ifMatch on the next update to chain writes without re-reading. Absent when the API sent none; read the resource again before the next conditional write. |
| flag | string | yes | – |
| project | string | yes | – |
| updated | boolean | yes | – |
No examples provided.
update_flag_environment_config Update flag environment config ~183
Update a flag's per-environment serving config: defaultVariationId (served on fallthrough, required), strategy (SingleVariation | PercentageRollout | TargetedRollout — only SingleVariation is currently supported at the environment level), and prerequisites. Percentage rollouts are configured on targeting rules via update_targeting.
| Name | Type | Req | Description |
|---|---|---|---|
| defaultVariationId | string | yes | Variation id to serve on fallthrough — required by the API |
| environment | string | yes | Environment key, e.g. production |
| flag | string | yes | Flag key or id |
| prerequisites | array | – | Flags that must evaluate to the expected variation before this flag serves. Omit to leave existing prerequisites untouched; pass a list (possibly empty) to replace them wholesale. |
| project | string | yes | Project key |
| strategy | string | – | Serving strategy; only SingleVariation is currently supported here |
| Name | Type | Req | Description |
|---|---|---|---|
| defaultVariationId | string | yes | – |
| environment | string | yes | – |
| flag | string | yes | – |
| prerequisites | array | – | – |
| project | string | yes | – |
| strategy | string | – | – |
No examples provided.
update_targeting Replace targeting rules ~163
REPLACE all targeting rules of a flag in one environment (full PUT — rules not included are removed). Rules are evaluated in order. Get the current rules first with get_targeting. Pass ifMatch (the etag from get_targeting) so rules someone else changed meanwhile are not overwritten.
| Name | Type | Req | Description |
|---|---|---|---|
| environment | string | yes | Environment key, e.g. production |
| flag | string | yes | Flag key or id |
| ifMatch | string | – | etag from get_targeting. The write is refused with 412 if the resource changed since that read; re-read and re-apply. Omit to write unconditionally. |
| project | string | yes | Project key |
| rules | array | yes | The complete ordered rule list; rules left out are deleted |
| Name | Type | Req | Description |
|---|---|---|---|
| environment | string | yes | – |
| etag | string | – | ETag of what this write left behind. Pass it as ifMatch on the next update to chain writes without re-reading. Absent when the API sent none; read the resource again before the next conditional write. |
| flag | string | yes | – |
| project | string | yes | – |
| rulesReplaced | integer | yes | – |
No examples provided.
wrap_feature Wrap a feature in a new flag ~156
Create a Boolean feature flag and get back the SDK code snippet to guard the new code path with it. Returns the snippet only — apply the edit yourself. The flag starts DISABLED in every environment; enable it with toggle_flag when ready.
| Name | Type | Req | Description |
|---|---|---|---|
| description | string | – | What this flag guards |
| idempotency_key | string | – | Idempotency-Key header for safe retries |
| key | string | yes | Flag key, e.g. new-checkout |
| language | string | yes | SDK language of the codebase being edited |
| name | string | – | Display name; defaults to the key |
| project | string | yes | Project key |
| tags | array | – | Tags for filtering, e.g. team or area |
| Name | Type | Req | Description |
|---|---|---|---|
| flag | – | yes | – |
| integration | object | yes | – |
| next_steps | array | yes | – |
No examples provided.
How do I install the Featureflip MCP server?
Featureflip runs locally as an npm package, launched with npx -y @featureflip/mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
npm · @featureflip/mcp
claude mcp add canopy-labs-featureflip -- npx -y @featureflip/mcp
What is the Featureflip MCP server?
Featureflip is an MCP server listed in the public MCP registry as io.github.canopy-labs/featureflip. Manage Featureflip feature flags, targeting and rollouts from AI agents and editors. This page covers its npm package (@featureflip/mcp).
Is the Featureflip MCP server safe to use?
Featureflip scores 84 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 5 November 2026. It declares no install or post-install scripts. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the Featureflip MCP server expose?
Featureflip exposes 35 tools: list_projects, manage_project, set_default_flag_lifetime, list_environments, manage_environment, and 30 more. Their descriptions and schemas cost roughly 5,681 tokens of context every time the server is loaded.
Is the Featureflip MCP server still maintained?
Featureflip is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the Featureflip MCP server under?
Featureflip declares the Apache-2.0 licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.