Skip to main content
Glama
canopy-labs

Featureflip

Official

@featureflip/mcp

Servidor MCP (Model Context Protocol) para Featureflip — gestiona feature flags desde asistentes de codificación con IA (Claude Code, Cursor, Copilot, Cline) y agentes autónomos.

Instalación

  1. Crea un token de API en el panel de Featureflip:

    • Token personal (ffp_...): Ajustes → Tokens de API — actúa en tu nombre, para uso interactivo en el editor.

    • Token de servicio (ffs_...): Ajustes de organización → Tokens de servicio — identidad de máquina con ámbito limitado para CI/agentes.

  2. Añade el servidor a tu cliente MCP:

Claude Code

claude mcp add featureflip -e FEATUREFLIP_TOKEN=ffp_your_token -- npx -y @featureflip/mcp

Cursor / Cline / configuración JSON genérica

{
  "mcpServers": {
    "featureflip": {
      "command": "npx",
      "args": ["-y", "@featureflip/mcp"],
      "env": { "FEATUREFLIP_TOKEN": "ffp_your_token" }
    }
  }
}

Related MCP server: Featureflow MCP Server

Configuración

Variable de entorno

Requerida

Por defecto

Propósito

FEATUREFLIP_TOKEN

sí

—

Token de API ffp_/ffs_

FEATUREFLIP_API_URL

no

https://api.featureflip.io

URL base de la API

FEATUREFLIP_ORG

no

auto

Slug de la organización (solo necesario para tokens personales de múltiples organizaciones)

Herramientas

CRUD: list_projects, list_environments, list_flags, get_flag, create_flag, update_flag, delete_flag, archive_flag, restore_flag, toggle_flag, update_flag_environment_config, get_targeting, update_targeting, manage_variation, list_segments, get_segment

Flujos de trabajo: flag_status (vista entre entornos), find_stale_flags (candidatos a limpieza), wrap_feature (crear flag + obtener el snippet del SDK para tu lenguaje)

Referencia completa: https://featureflip.io/docs/integrations/mcp/

Notas

  • La evaluación de flags no está expuesta a través de MCP — usa los SDK de lenguaje en el código de la aplicación.

  • Cada mutación se registra en el log de auditoría y se atribuye al token.

Licencia

Apache-2.0

Available Tools

34 tools
archive_flagArchive feature flagA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
flagYesFlag key or id
forceNoArchive 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.
projectYesProject key

Output Schema

ParametersJSON Schema
NameRequiredDescription
flagYes
archivedYes

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only carry destructiveHint=true, and the description adds substantial non-obvious behavior: the operation is reversible, it is refused under two named conditions, and archiving causes every caller to fall back to its own hardcoded default. The explanation of why FLAG_RECENTLY_EVALUATED fires and when it self-clears is exactly the kind of context annotations cannot provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and free of filler; every sentence carries error-handling or workflow information. It is delivered as one dense run-on paragraph, so error codes and the dependents workflow are harder to scan than they could be.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema exists so return values need no explanation, and the description still covers the mutation's semantics, reversal, both refusal conditions and their resolution, and the prerequisite-tool workflow. Nothing an agent needs to invoke this correctly in the right order is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so both 'project' and 'flag' plus the 'force' override are already documented in the schema. The description corroborates the 'force' rationale (traffic that will never drain) but adds no syntax or format detail beyond it, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (archive) and resource (flag) and immediately defines the semantics with 'soft-hide, evaluation stops serving it', which distinguishes it from delete_flag and restore_flag. An agent can tell exactly what state change this performs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete when-not conditions (FLAG_HAS_DEPENDENTS, FLAG_RECENTLY_EVALUATED) and points to the exact sibling tools to run first (find_stale_flags / list_removal_candidates via blockedBy) and the reversal path (restore_flag). It does not explicitly contrast archive vs delete_flag, which is the one obvious alternative left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_flagCreate feature flagA

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesUnique flag key, e.g. checkout-v2
nameYesDisplay name
tagsNoTags for filtering, e.g. team or area
typeYesValue type; Boolean gets true/false variations automatically
projectYesProject key
ownerEmailNoOptional 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
descriptionNoWhat the flag controls
isPermanentNoMark 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 expiresAtUtc
expiresAtUtcNoOptional 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_keyNoIdempotency-Key header for safe retries
clientSideVisibleNoExpose to client-side SDKs (browser/mobile)
initialVariationsNoVariations for a String, Number or Json flag (Boolean flags get true/false automatically)

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
keyNo
nameNo
tagsNo
typeNoAllowed values: Boolean, String, Number, Json.
ownerNo
_actionsNoCapability 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 runtime; safe to ignore. Present only on top-level resource responses — nested occurrences (e.g. a rule inside a targeting-config response) do not carry it.
createdAtNo
updatedAtNo
isArchivedNo
variationsNo
descriptionNo
isPermanentNo
expiresAtUtcNo
expirySourceNo
removalPrUrlNo
clientSideVisibleNo
effectiveExpiresAtUtcNo

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare destructiveHint=false, so the description carries the behavioral load and does add real context: the flag is created in every environment of the project and starts disabled, and Boolean flags auto-generate true/false variations. It omits permission/auth requirements and rate-limit behavior, but the environment-wide disabled-by-default trait is a genuinely useful disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with the core action, and each sentence earns its place by conveying type rules or creation scope. No filler or restated title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation. For a 12-param creation tool the description covers scope and variation semantics well; the main omission is any note on authorization or idempotency behavior, though idempotency_key is documented in the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all 12 parameters are already documented, giving a baseline of 3. The description reinforces the type enum and the Boolean-vs-initialVariations relationship, but adds no syntax or format detail beyond what the schema already states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource ("Create a feature flag"), which is inherently distinguishable from sibling mutators like update_flag, delete_flag, and archive_flag. It stops short of naming any sibling explicitly, but the create semantics are unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use vs when-not guidance. It never points the agent to update_flag, manage_variation, or set_flag_owner for follow-up work, nor states prerequisites. The type/variation rules are parameter mechanics, not usage routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_flagDelete feature flagA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
flagYesFlag key or id
projectYesProject key

Output Schema

ParametersJSON Schema
NameRequiredDescription
deletedYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, so the safety bar is partly covered; the description goes further by disclosing cross-environment blast radius and a concrete failure condition with its error code (FLAG_HAS_DEPENDENTS if used as a prerequisite). It stops short of covering permissions/auth requirements or whether the deletion is reversible/recoverable via restore_flag.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, no redundancy: the destructive action and scope lead, the failure mode follows, and the alternative is last. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter destructive tool with an output schema present (so return values need no explanation), the description covers scope, irreversibility framing, failure mode, and the preferred alternative. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Both parameters ('project', 'flag') carry schema descriptions at 100% coverage, so the schema does the heavy lifting. The description adds no syntax or format detail beyond what the schema already documents, making the baseline 3 appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('delete a flag') plus a critical scope qualifier ('PERMANENTLY ... across all environments'), which sharply differentiates it from archive_flag and restore_flag in the sibling list. An agent can select it without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names the alternative ('Prefer archive_flag') and states the condition that selects this tool instead ('unless the flag must be fully removed'). Both the when and the when-not are present.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

deliver_webhookSend a test event or redeliverA

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesSubscription id (from list_webhooks)
actionYestest sends a synthetic event; redeliver re-sends deliveryId
deliveryIdNoRequired for redeliver

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only cover openWorldHint and destructiveHint=false, but the description adds substantial operational context: asynchronous delivery, need to read list_webhook_deliveries for the result, Admin-token requirement, refusal conditions, and the 404-means-webhooks-disabled signal.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the action semantics, then layers async behavior, failure conditions, and auth. Every clause carries information; no filler despite the density.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return format needn't be explained, and the description covers auth, refusal states, async outcome polling, and the org-level 404 case. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% so the baseline is 3, but the description adds real value by identifying the source of deliveryId (list_webhook_deliveries) and clarifying that test targets this subscription alone. It reinforces rather than merely repeats the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource and disambiguates the two action modes ('test queues one synthetic flag.toggled event to this subscription alone'; 'redeliver ... re-sends a finished delivery'). An agent can tell exactly what each call does and how it differs from siblings like list_webhook_deliveries.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly maps each action value to its use case and prerequisite (deliveryId from list_webhook_deliveries for redeliver), names the sibling to poll for outcomes, and gives when-not conditions (refused for disabled subscriptions; redeliver refused while delivery is Pending).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

find_stale_flagsFind stale flagsA
Read-only

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNoMinimum age in days since last update
ownerNoOnly flags with this owner: an email, "me" for the token's own user, or "none" for unowned flags
projectYesProject key

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
ownerNo
staleYes
checkedYes
projectYes
truncatedYes
blockedByNoteNo
olderThanDaysYes

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=true, but the description adds substantial behavior: permanent flags (kill switches, ops toggles) are never listed, at most 50 candidates are checked per call with expired flags first, and blockedBy=null means 'unknown, not unblocked'. It also discloses the downstream failure mode (archive_flag fails with FLAG_HAS_DEPENDENTS if a dependent still names the flag), which is exactly the kind of cross-tool behavior an agent needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose and core criteria are front-loaded, which is good, but the body is a dense single paragraph, and a sizeable chunk enumerates result fields (expiresAtUtc, effectiveExpiresAtUtc, expirySource, expired, owner) that the output schema already defines. Those sentences do not earn their place as strongly as the criteria, cap, and dependency-ordering content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex triage tool, the description covers the stale predicate, expiry and project-default lifetime rules, permanent-flag exclusion, owner filtering, the 50-candidate cap and ordering, and the prerequisite/dependency constraint that governs follow-up archival. With an output schema handling return values and annotations covering safety, nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all three parameters. The description restates them at the same level of detail ('not updated in N days', owner 'me'/'none', project key) without adding syntax, format, or edge-case meaning. Baseline 3 is appropriate when the schema carries the parameter burden.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence names a specific verb and resource ('Find flags that look ready for code cleanup') and then defines the exact predicate that makes a flag stale: N days without update AND either on in every environment or off in every environment, plus the overrides for expired flags. An agent can tell precisely what this tool returns without opening the schema, though it does not explicitly contrast itself with the nearby list_removal_candidates sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear operative context: run this to identify cleanup candidates, filter with owner ('me'/'none'), and it warns to verify rollout is complete before removing. It also explains the removal workflow ordering versus archive_flag (dependents first, FLAG_HAS_DEPENDENTS otherwise), which steers correct usage. However, it never states when NOT to use it or names an alternative tool for overlapping needs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

flag_statusFlag status across environmentsA
Read-only

Compact cross-environment view of one flag: enabled state, strategy, default variation, and prerequisites per environment.

ParametersJSON Schema
NameRequiredDescriptionDefault
flagYesFlag key or id
projectYesProject key

Output Schema

ParametersJSON Schema
NameRequiredDescription
keyYes
nameYes
typeYes
archivedYes
updatedAtYes
environmentsYes

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds the useful detail that the view is 'compact' and lists which facets are returned, but says nothing about auth requirements, environment coverage limits, or pagination behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single tight sentence that front-loads the scope ('cross-environment view') before enumerating returned fields. No wasted words, though it is a sentence fragment rather than full prose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need no elaboration, and the readOnly annotation covers safety. Parameters are fully described in the schema, so the description is nearly complete; only routing guidance versus get_flag is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% (both 'flag' and 'project' documented), so the baseline is 3. The description adds no format or identifier-syntax detail beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific resource (one flag) and a specific scope (cross-environment), with the returned facets named: enabled state, strategy, default variation, prerequisites. This distinguishes it from the single-environment get_flag sibling, though it never names that sibling explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'cross-environment view of one flag' implies the use case (comparing a single flag's configuration across environments), but there is no explicit when-to-use, when-not-to-use, or named alternative such as get_flag or update_flag_environment_config.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_flagGet feature flagA
Read-only

Get one feature flag with its variations and metadata, including its owner (null when unowned). Address by flag key or id.

ParametersJSON Schema
NameRequiredDescriptionDefault
flagYesFlag key or id
projectYesProject key

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
keyNo
etagNoETag 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.
nameNo
tagsNo
typeNoAllowed values: Boolean, String, Number, Json.
ownerNo
_actionsNoCapability 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 runtime; safe to ignore. Present only on top-level resource responses — nested occurrences (e.g. a rule inside a targeting-config response) do not carry it.
createdAtNo
updatedAtNo
isArchivedNo
variationsNo
descriptionNo
isPermanentNo
expiresAtUtcNo
expirySourceNo
removalPrUrlNo
clientSideVisibleNo
effectiveExpiresAtUtcNo

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the safe-read profile is covered. The description adds the nuance that owner is null when unowned, which is genuinely useful, but otherwise restates the return shape that the output schema already defines. No error/not-found behavior is disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single tight sentence with the resource and return contents front-loaded and no filler. Every clause carries information (what is returned, owner semantics, addressing mode).

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only getter with an output schema covering return values and annotations covering safety, the description supplies everything else an agent needs. Nothing material is missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters (flag, project) are already documented. 'Address by flag key or id' merely repeats the schema's own 'Flag key or id' text and adds no new format or constraint detail, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get one feature flag') plus the payload it returns (variations, metadata, owner). The word 'one' implicitly contrasts with list_flags, but no sibling is named explicitly, so differentiation is inferred rather than stated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by 'Address by flag key or id' — the agent can infer this is the single-flag lookup rather than a list or mutation. However, there is no explicit when-to-use statement, no mention of when to prefer list_flags or flag_status, and no prerequisites (e.g. needing a valid project key).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_segmentGet user segmentB
Read-only

Get one user segment (its conditions, id, and metadata) by key or id.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectYesProject key
segmentYesSegment key or id

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
keyNo
etagNoETag 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.
nameNo
_actionsNoCapability 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 runtime; safe to ignore. Present only on top-level resource responses — nested occurrences (e.g. a rule inside a targeting-config response) do not carry it.
createdAtNo
updatedAtNo
conditionsNo
descriptionNo

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

readOnlyHint=true already tells the agent this is a safe read, so the bar is lower. The description adds that the response covers conditions, id, and metadata, which is mild value, but says nothing about not-found behavior or required permissions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence, front-loaded with the verb and resource, with the lookup keys trailing. No filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter read tool with a full output schema and readOnly annotation, the description covers purpose and lookup keys adequately; return values need not be explained. Only error/not-found handling is unaddressed, a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and both parameters are documented ('Project key', 'Segment key or id'). The description's 'by key or id' merely restates the schema's own wording rather than adding new meaning, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get one user segment') with singular scope and the lookup keys, which implicitly separates it from list_segments and manage_segment. It does not explicitly name or contrast a sibling, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no when-to-use guidance, no exclusions, and never mentions the alternative list_segments or manage_segment. An agent must infer from the tool name alone that this is the single-item read path.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_targetingGet targeting rulesA
Read-only

Get a flag's current targeting configuration (enabled flag + ordered rules) in one environment.

ParametersJSON Schema
NameRequiredDescriptionDefault
flagYesFlag key or id
projectYesProject key
environmentYesEnvironment key, e.g. production

Output Schema

ParametersJSON Schema
NameRequiredDescription
etagNoETag 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.
rulesNo
_actionsNoCapability 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 runtime; safe to ignore. Present only on top-level resource responses — nested occurrences (e.g. a rule inside a targeting-config response) do not carry it.
isEnabledNo

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

readOnlyHint=true already tells the agent this is a safe read. The description adds the useful scope detail that it returns the enabled flag plus ordered rules for a single environment, but it does not cover return format or whether ordering is significant beyond what the schema/output schema implies.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler, immediately stating the verb, resource, and returned content. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description needn't explain return values, and the three required params are covered by the schema. It is complete enough for an agent to call correctly, though it lacks explicit routing context versus targeting siblings.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all three parameters (project, flag, environment) are documented in the schema, meeting the baseline of 3. The description's phrase 'in one environment' reinforces the environment scoping but adds no format or syntax detail beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Get) and resource (a flag's targeting configuration), and clarifies the scope: enabled flag plus ordered rules, in one environment. This clearly distinguishes it from write siblings like update_targeting and manage_targeting_rule.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no when-to-use guidance and names no alternatives. It neither says when to prefer update_targeting to modify rules nor states any prerequisites, so the agent must infer the read-only inspection use case from the verb alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_environmentsList environmentsB
Read-only

List the environments of a project (e.g. development, staging, production).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoPage size (default 20)
cursorNonext_cursor from a previous response
projectYesProject key

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsNo
_actionsNoCapability 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 runtime; safe to ignore. Present only on top-level resource responses — nested occurrences (e.g. a rule inside a targeting-config response) do not carry it.
next_cursorNo

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds the project-scoping constraint and illustrative environment names, but says nothing about pagination despite limit/cursor params, so it adds modest value.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single short sentence with the purpose and scope front-loaded. Zero waste; no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be described, and full schema coverage handles params. For a simple read-only list tool this is nearly complete, lacking only the pagination/usage context an agent might want.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents project, limit, and cursor. The description adds no syntax or format details beyond the schema and only clarifies the concept of an environment via examples; baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (List) and resource (environments) scoped to a project, with parenthetical examples clarifying what an environment is. It implicitly differentiates from the sibling manage_environment, though it never names or contrasts with it explicitly, keeping it just short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description says what the tool does but gives no when-to-use guidance, no prerequisites, and does not mention or contrast with the sibling manage_environment. Usage is only implied by the verb 'List'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_flagsList feature flagsA
Read-only

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagNoOnly flags carrying this tag
typeNoOnly flags of this type
limitNoPage size (default 20)
ownerNoOnly flags with this owner: an email, "me" for the token's own user, or "none" for unowned flags
cursorNonext_cursor from a previous response
searchNoSubstring of the flag key or name
projectYesProject key
archivedNotrue = only archived, false = only active

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsNo
_actionsNoCapability 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 runtime; safe to ignore. Present only on top-level resource responses — nested occurrences (e.g. a rule inside a targeting-config response) do not carry it.
next_cursorNo

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only cover read-only safety, and the description goes beyond them by disclosing pagination mechanics ('Paginated via cursor') and the shape of the embedded owner object (including the null-when-unowned case). It does not mention default page size, rate limits, or ordering, but the pagination and payload notes are meaningful additions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with purpose and no filler. The owner-shape sentence is arguably closer to return-value documentation than parameter guidance, but it is compact enough to earn its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description needn't explain return values, and it nonetheless covers pagination and owner embedding. Combined with full schema coverage and read-only annotations, an agent has everything needed to call the tool; only ordering and default-limit behavior are unstated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description restates the filter names and adds that search matches key/name substrings, but the field-level syntax (owner accepting 'me'/'none', the type enum, the limit cap) is all left to the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List feature flags in a project') plus the filterable surface, so it's clearly a paginated collection read rather than the singular get_flag. It does not distinguish itself from siblings like find_stale_flags or list_removal_candidates, which also return flag collections.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied by the enumeration of filters; there is no statement of when to prefer this over get_flag or the specialized flag-listing siblings. An agent can infer the retrieval intent, but no alternative is named or excluded.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_projectsList projectsA
Read-only

List projects in the Featureflip organization. Paginated: pass cursor from next_cursor to continue.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoPage size (default 20)
cursorNonext_cursor from a previous response

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsNo
_actionsNoCapability 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 runtime; safe to ignore. Present only on top-level resource responses — nested occurrences (e.g. a rule inside a targeting-config response) do not carry it.
next_cursorNo

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation already establishes this as a safe read operation, lowering the burden on the description. The description adds the pagination trait, but the cursor-to-next_cursor mechanics largely restate what the schema already documents, and it says nothing about ordering, rate limits, or result shape. It adds some context but not rich behavioral detail.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, with the core purpose front-loaded and pagination second. It is well-sized and wastes little, though the pagination sentence partly repeats the cursor parameter's schema description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and read-only annotations cover the safety profile. The description covers the one behavior an agent must know (pagination). Minor gaps remain around ordering and whether results are filtered, but nothing essential to invoking it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents both limit (default 20, max 100) and cursor. The description's cursor note duplicates rather than extends the schema's 'next_cursor from a previous response' text, and it adds no syntax or default details. Baseline 3 is appropriate when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb (List) and resource (projects) and scopes it to the Featureflip organization, so an agent can tell it apart from manage_project by the read-only verb. It stops short of naming sibling alternatives or clarifying what distinguishes it from other list_* tools, but the purpose itself is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides concrete usage guidance for iteration (pass cursor from next_cursor to continue), which tells the agent how to page through results. However, there is no when-to-use guidance relative to siblings such as manage_project, and no exclusions or prerequisites are stated. Usage is implied rather than explicitly framed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_removal_candidatesList removal candidatesA
Read-only

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoPage size (default 20)
cursorNonext_cursor from a previous response
projectYesProject key
stalenessNoMinimum staleness tier: dead (default) or stale

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsNo
next_cursorNo

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=true; the description adds substantive behavior beyond that — the semantic contract of each returned field, the blockedBy dependency signal, and why archive_flag will refuse a still-depended-on flag. This is real context an agent cannot get from the safety hint alone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well front-loaded: the purpose and alternative-context come first, then item shape, then the critical removal rule. It is somewhat long and the treatment-field gloss leans on output-schema territory, but no sentence is pure filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given a read-only, paginated list tool with a rich output schema and a non-obvious dependency-removal hazard, the description covers purpose, ordering, error behavior, and pagination. An agent has everything needed to list and safely act on results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds meaning by clarifying the tiered semantics of staleness ("dead" returns only dead flags, "stale" adds stale ones) and noting cursor pagination. This nudges above the schema-only baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource ("List the flags the server is confident can be removed from code") and pins the exact item shape (key, reason, status, treatment, blockedBy), clearly distinguishing this removal-oriented list from siblings like list_flags and find_stale_flags.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states the operative rule ("Only remove a flag whose blockedBy is empty"), the ordering constraint (dependents first, prerequisites last), and the consequence of violating it, including the cross-tool interaction with archive_flag and its FLAG_HAS_DEPENDENTS error. This is explicit when/when-not guidance tied to a sibling tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_sdk_keysList SDK keysA
Read-only

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoPage size (default 20)
cursorNonext_cursor from a previous response
projectYesProject key
environmentYesEnvironment key, e.g. production

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsNo
_actionsNoCapability 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 runtime; safe to ignore. Present only on top-level resource responses — nested occurrences (e.g. a rule inside a targeting-config response) do not carry it.
next_cursorNo

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so safety is covered. The description adds a genuine behavioral fact beyond the annotations and schema: the full key is never returned and is visible only once at creation time. That is meaningful security-relevant context an agent needs before reporting results to a user.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences: the first front-loads what is listed, the second carries the security caveat. No filler, no restatement of the tool name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no prose explanation. Between the scope statement, the field enumeration, and the full-key caveat, nothing an agent needs to call and interpret this tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so project, environment, limit, and cursor are already documented in the schema. The description adds no extra syntax or format detail about those parameters, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (List) and resource (SDK keys), scopes it to "one environment", and enumerates the returned fields (id, name, type, last four characters, active status). It also names the sibling manage_sdk_key, so an agent can distinguish listing from creation without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description scopes usage clearly to a single environment and explains the relationship with manage_sdk_key (the only place the full key appears). It does not spell out when-not to use this tool or mention pagination trade-offs, but the context is unambiguous for a list operation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_segmentsList user segmentsA
Read-only

List reusable user segments in a project. Segments are referenced from targeting rules via userSegmentId.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoPage size (default 20)
cursorNonext_cursor from a previous response
projectYesProject key

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsNo
_actionsNoCapability 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 runtime; safe to ignore. Present only on top-level resource responses — nested occurrences (e.g. a rule inside a targeting-config response) do not carry it.
next_cursorNo

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation already declares this a safe read, so the description carries a lower burden. It adds the domain relationship (segments feed targeting rules via userSegmentId), which is useful context, but says nothing about pagination or result size beyond what the schema's limit/cursor already imply.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with zero filler; the purpose (what is listed and where) is front-loaded before the secondary 'why it matters' clause. Nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With readOnlyHint annotations and a present output schema, the return values and safety profile are already covered, so the description does not need to explain them. It is complete for a simple three-parameter list tool, with only the absence of alternative-routing guidance keeping it from a 5.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so limit, cursor, and project are already fully documented in the schema, giving a baseline of 3. The description adds a small amount of meaning by framing segments as reusable and project-scoped, reinforcing the required project parameter, but adds no parameter syntax details.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (List), resource (reusable user segments), and scope (in a project), which distinguishes it from get_segment and manage_segment by the list-vs-single-vs-mutate verb. The second sentence adds conceptual context about how segments connect to targeting rules, though it never names the siblings explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit when-to-use or when-not-to-use guidance; usage is only implied by the word 'List' and the note that segments are referenced from targeting rules. An agent can infer this is a discovery/enumeration call, but nothing tells it to prefer this over get_segment or when listing is appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_webhook_deliveriesList webhook deliveriesA
Read-only

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesSubscription id (from list_webhooks)
limitNoPage size (default 20)
cursorNonext_cursor from a previous response

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsNo
next_cursorNo

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint annotation, it discloses the auth requirement (Admin token), the meaning of the status values including the ambiguous 'Pending' case (awaiting, backing off, in flight), how to interpret failures via lastResponseStatusCode/lastError, and an org-level 404 troubleshooting rule. This is substantive behavioral context an agent cannot get from annotations or schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short, dense sentences with no filler: scope/ordering first, then status semantics, then pagination, then auth and the 404 diagnostic. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-field documentation is not required here; the description still covers the operational essentials (ordering, pagination, auth, failure interpretation, 404 troubleshooting). Nothing an agent needs to invoke this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description adds a little by confirming cursor-based pagination flow and framing id as scoping to a single subscription. It adds no new syntax or format detail for limit or cursor beyond the schema, so it stays near baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List one subscription's delivery attempts') plus ordering ('most recent first'), which cleanly separates it from the sibling list_webhooks (which lists subscriptions, not deliveries). An agent can pick this tool without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear context for when this is the right call — per-subscription delivery history — and adds operational guidance (Admin token required; a 404 across webhook calls means webhooks are disabled for the org). It never names an alternative such as list_webhooks or deliver_webhook, so the routing guidance is implied rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_webhooksList webhook subscriptionsA
Read-only

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoPage size (default 20)
cursorNonext_cursor from a previous response

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsNo
_actionsNoCapability 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 runtime; safe to ignore. Present only on top-level resource responses — nested occurrences (e.g. a rule inside a targeting-config response) do not carry it.
next_cursorNo
availableEventTypesNoEvent types a subscription can filter on

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=true, but the description adds substantial behavioral context beyond that: the Admin token auth requirement, cursor-based pagination, the 'never secret values' security guarantee, the empty-filter-means-all semantics, and how to interpret a 404. These are exactly the operational traits an agent needs and none are in the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and returned fields, and every clause (auth, pagination, 404 handling, secret redaction) carries information. The single dense run-on sentence with multiple parentheticals is slightly heavy, costing it the top score.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema already covers return values, so the description correctly focuses on the things structured data doesn't convey: auth requirements, pagination mechanics, the 404/not-enabled condition, and the meaning of empty filter lists. Nothing an agent needs to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so both limit and cursor are already documented, making 3 the baseline. The description adds a small amount by confirming cursor pagination ties the two parameters together, but it introduces no new syntax or defaults beyond the schema's own 'next_cursor from a previous response'.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('List the organization's outbound webhook subscriptions') and enumerates the returned fields (url, filters, enabled state, failure count, signing secret ids) plus the availableEventTypes payload. This clearly separates it from list_webhook_deliveries (delivery history) and manage_webhook (CRUD), though no sibling is named explicitly, which keeps it just below a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives prerequisites (Admin token required) and a diagnostic rule (a 404 on every webhook call means webhooks are not enabled), which implies usage context. However, it never states when to reach for this versus list_webhook_deliveries or manage_webhook, so routing guidance is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manage_environmentCreate or update an environmentA
Destructive

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
keyNoNew environment key, required for create; immutable afterwards
nameNoDisplay name; required for create
colorNoHex color shown in the dashboard, e.g. #22c55e
actionYescreate needs key + name; update needs environment
projectYesProject key
sortOrderNoPosition in environment lists, lowest first
environmentNoEnvironment key to update; required for update

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With destructiveHint=true already declared, the description adds real context: the key is immutable after creation, the operation is a partial update rather than a replace, deletion is out of scope, and a new environment is inert until an SDK key is created. It does not mention permission/auth requirements, so it falls short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short sentences, each carrying distinct information, with the create/update contract front-loaded and constraints and next-step routing appended. No filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need no explanation, and the description covers mode selection, prerequisites, immutability, and the SDK-key dependency. The only soft spot is that 'changes only the fields you pass' implies a changes object while the schema exposes flat top-level properties.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description goes beyond per-field docs by stating the cross-parameter coupling for each action and calling out that update only touches supplied fields, which tells the agent it may omit name/color/sortOrder. It does not clarify format expectations (e.g. hex color, sortOrder semantics) beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence names a specific verb+resource (create/change an environment in a project) and enumerates exactly which attributes are mutable (name, color, sort order). It is immediately distinguishable from siblings like list_environments or manage_sdk_key.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states the prerequisite per mode ('action=create needs key + name; action=update needs environment'), notes update is partial ('changes only the fields you pass'), and routes the agent to manage_sdk_key for the follow-up step. It also excludes an option the agent might otherwise try ('cannot be deleted from here').

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manage_projectCreate or update a projectA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyNoNew project key, required for create; immutable afterwards
nameNoDisplay name; required for create
actionYescreate needs key + name; update needs project
projectNoProject key to update; required for update
descriptionNoWhat the project is for; "" clears it

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The destructiveHint=true annotation is potentially over-broad for an update that 'only changes fields you pass,' but the description adds genuinely useful behavior beyond the annotation: key immutability, partial-update semantics, and that description: "" clears the field. This disclosure materially helps an agent avoid unintended overwrites, though it doesn't mention permissions or reversibility.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four dense sentences with zero filler, front-loaded with the create-vs-update split before the finer semantics. Every clause carries actionable information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and the description covers both action modes, their required params, and key immutability. It stops short of stating permission requirements or what happens to unspecified fields on update in edge cases.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents each parameter's role and required-for-create/update status. The description's parameter notes (key immutable, "" clears description) largely mirror the schema text, adding only the partial-update framing.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource (create/update a project) and immediately splits the two modes via the action enum values. It also bounds scope up front with 'Projects cannot be deleted from here,' which lets an agent distinguish it from a hypothetical delete/archive sibling. No sibling name is cited, but the create/update framing is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit preconditions for each mode: action=create needs key + name, action=update needs project and only the passed fields change. It also rules out one capability (no deletion here). What's missing is routing to alternatives (e.g., list_projects for reads, or where deletion actually happens).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manage_sdk_keyCreate, rename, or revoke an SDK keyA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoKey name; required for create
typeNoRequired for create: ServerSide for backend SDKs, ClientSide for browser/mobile SDKs
actionYescreate needs name + type; rename and revoke need sdkKey
sdkKeyNoSDK key id (see list_sdk_keys); required for rename and revoke
projectYesProject key
descriptionNoWhat the key is used for; "" clears it
environmentYesEnvironment key, e.g. production

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses key behavioral traits annotations don't: create returns the full key ONCE (critical irreversibility), revoke takes effect immediately and causes apps to lose flag updates, and rename only changes passed fields. These are exactly the mutation consequences an agent must know.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Five tight sentences front-loaded with scope, each action paired with its consequence, ending with the rotation workflow. No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers create/rename/revoke behavior and rotation thoroughly; output schema exists so return values needn't be explained. Minor gap: doesn't mention listing keys to obtain sdkKey, though the schema notes list_sdk_keys.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Adds meaning by tying params to actions (name+type for create, sdkKey for rename/revoke) and explaining type semantics. With 100% schema coverage this is somewhat redundant, but the action-param coupling adds value beyond schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Manage an environment's SDK keys') and itemizes each action (create/rename/revoke) with its effect. Clearly distinguished from list_sdk_keys (read) among siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly maps each action to required params and gives a rotation recipe ('create a new key, deploy it, then revoke the old one'), telling the agent when to combine actions rather than revoke directly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manage_segmentCreate, update, or delete a user segmentA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyNoNew segment key, required for create; immutable afterwards
nameNoDisplay name; required for create
actionYescreate needs key + name; update and delete need segment
ifMatchNoetag 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.
projectYesProject key
segmentNoSegment key or id; required for update and delete
conditionsNoConditions a user must match to be in the segment; on update, replaces the whole list
descriptionNoWhat the segment means; "" clears it

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With only destructiveHint=true provided, the description carries real weight: it explains conditional writes via ifMatch (412 on concurrent modification, re-read and re-apply), that ifMatch is rejected on create/delete, that conditions replaces the entire list, and that an empty description string clears the field. These are non-obvious API behaviors beyond what annotations declare.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but every clause earns its place: action requirements first, then the concurrency/etag rule, then the negative constraint on ifMatch. No filler and the most decision-relevant content is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema exists so return values need not be described. For an 8-parameter mutation tool with destructiveHint, the description covers the mutation surface, per-action parameter requirements, destructive replacement semantics, and optimistic-concurrency error handling.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds cross-parameter meaning the schema cannot: which parameters are required per action value, and the create/update/delete-specific rejection of ifMatch. It also reinforces the replace-whole-list semantics of conditions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource ('Manage reusable user segments') and immediately distinguishes it from siblings by noting segments are referenced by userSegmentId by targeting rules. The title and description together make clear this is the write/mutation counterpart to list_segments/get_segment.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit per-action requirements (create needs key+name; update needs segment+changes; delete needs segment) and routes the agent to get_segment for the etag used by ifMatch. It stops short of saying when to prefer this tool over alternatives in a workflow sense, but the action-level routing is clear and actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manage_targeting_ruleAdd, update, remove, or reorder one targeting ruleA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
flagYesFlag key or id
ruleNoRule fields; required for add and update
actionYesadd needs rule; update needs ruleId + rule; remove needs ruleId; reorder needs ruleIds
ruleIdNoRule id from get_targeting; required for update and remove
projectYesProject key
ruleIdsNoEvery rule id exactly once, in evaluation order; required for reorder
environmentYesEnvironment key, e.g. production

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations supply only destructiveHint=true; the description carries the rest and does so meaningfully — update is a partial patch ('changes only the fields you pass'), conditionGroups is a full replace rather than a merge, and clearing a field is impossible here. That merge-vs-replace distinction is exactly the kind of behavioral detail annotations cannot convey. It stops short of permissions/auth or failure behavior, so not a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single dense paragraph, but front-loaded with the core purpose and then ordered by action, so it is scannable. Every clause carries a constraint or an alternative; little waste, though the action-specific clauses could be broken into a list for faster lookup.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive mutation tool with a rich nested schema and an output schema, the description covers the mutation semantics, per-action requirements, and the escape hatch to a sibling tool. Return values are rightly omitted since an output schema exists. Only permission/error behavior remains unstated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds cross-parameter conditionality the schema does not: which params are required per action, that ruleIds must contain every existing rule id exactly once in evaluation order, and that conditionGroups overwrites groups. This is real semantic value beyond the per-field descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Edit a single targeting rule') and immediately scopes it against the sibling that replaces everything ('instead of replacing them all with update_targeting'). An agent can distinguish this from update_targeting and get_targeting without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit per-action routing: what each action value needs (rule, ruleId, ruleIds) and even when to fall back to a different tool (clearing rolloutPercentage or userSegmentId requires update_targeting). It also names get_targeting as the source of rule ids, so the agent knows the prerequisite call.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manage_variationAdd, update, or remove a variationA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyNoRequired for add; immutable afterwards
flagYesFlag key or id
nameNoDisplay name
valueNoVariation value serialized as a string; required for add
actionYesadd needs key + value; update and remove need variationId
projectYesProject key
descriptionNoWhat this variation means
variationIdNoRequired for update/remove

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the destructiveHint=true annotation, the description discloses a concrete failure mode: removal fails with VARIATION_HAS_DEPENDENTS when other flags depend on it. That is useful operational context an agent could not infer from annotations or schema. It does not cover permission or rate-limit behavior, but destructive semantics are already signalled by the annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three compact sentences with zero filler. The core operation is stated first, then per-action parameter needs, then the notable failure mode — a well front-loaded structure.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need not be described, and the description covers action semantics and the dependency-failure case adequately. It omits what 'update' can modify versus the immutable key and how dependent flags should be handled, which are minor gaps for an 8-parameter tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the action property already documents 'add needs key + value; update and remove need variationId', so the description's conditional mapping is largely redundant with structured data. The only added value is the pointer to get_flag as the source of variationId, which is marginal. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific resource (a flag's variations) and enumerates the three operations the tool spans, matching the title. It is clearly distinguishable from siblings like create_flag, get_flag, or update_flag_environment_config. The generic verb 'manage' with a multi-action enum keeps it from a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives action-conditional guidance ('action=add requires key + value; action=update/remove require variationId') and routes the agent to get_flag to obtain ids, which is genuine cross-tool usage guidance. It stops short of explicit when-not-to-use or alternatives to this tool for variation editing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manage_webhookCreate, update, or delete a webhook subscription, or rotate its secretA
Destructive

action=create requires name + url and returns the signing secret. action=update/delete/rotate_secret/retire_secret require id. 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 "/" 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. 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoSubscription id; required for everything except create
urlNoReceiver URL; required for create
nameNoRequired for create
actionYesWhat to do; every action except create needs id
enabledNoupdate only; subscriptions are created enabled
projectsNoProject keys or ids to cover; empty or omitted on create = all
secretIdNoRequired for retire_secret
eventTypesNoEvent types to send; empty or omitted = all
environmentsNo"<project>/<environment>" keys or environment ids; empty or omitted on create = all
idempotency_keyNoIdempotency-Key header for create / rotate_secret

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the destructiveHint annotation, it discloses critical behavior: the secret is NEVER shown again and must be relayed verbatim, update changes only passed fields and empty lists widen filters back to 'all', an Admin token is required, project-restricted service tokens must list in-scope projects, and a 404 on every call means webhooks are disabled for the org. This is exactly the non-obvious context annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is a single dense paragraph front-loaded with action requirements, and every sentence carries actionable information. It is slightly run-on and could be bulleted per action, but there is no filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 10-parameter multi-action mutation tool with an output schema, the description covers auth requirements, secret-return handling, action-specific prerequisites, edge cases (last active secret, 404/disabled org), and cross-tool references. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents parameters. The description still adds meaning: environment keys use '<project>/<environment>' format with an example, eventTypes originate from list_webhooks → availableEventTypes, and update's partial-update/empty-list-widens-to-all semantics are not in the schema. It repeats some schema content (empty = all) but the additions are genuine.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The title and description state the exact verb+resource for each of the five actions (create/update/delete/rotate_secret/retire_secret) and their required inputs, so an agent can tell immediately what the tool does. It is clearly distinguishable from siblings like list_webhooks and deliver_webhook.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives per-action routing rules (create needs name+url; everything else needs id) and explicitly distinguishes the two secret actions: rotate_secret adds a new active secret while the old keeps signing, retire_secret removes one and is refused for the last active secret. It also points to list_webhooks for availableEventTypes and secretId, naming the alternative source.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

restore_flagRestore archived flagC

Restore a previously archived flag.

ParametersJSON Schema
NameRequiredDescriptionDefault
flagYesFlag key or id
projectYesProject key

Output Schema

ParametersJSON Schema
NameRequiredDescription
flagYes
archivedYes

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare destructiveHint=false, so the description carries most of the behavioral burden. It does not say whether targeting/config is preserved on restore, whether the call is idempotent, what error occurs if the flag is not archived, or what permissions are required.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single short sentence with no filler, front-loaded with the action. It is efficient but nearly identical to the title, so brevity comes at the cost of substance rather than through tight editing of rich content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need not be described, but for a state-mutating tool with only a destructiveHint annotation the description omits the effects of restoration, error conditions, and prerequisites. That leaves the agent under-informed about calling it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% (flag: 'Flag key or id'; project: 'Project key'), so the schema already documents both parameters. The description adds no meaning beyond the schema, which puts it at the baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb (restore) and resource (a previously archived flag), making the inverse relation to archive_flag inferable. However it adds nothing beyond the title and does not explicitly name the sibling it complements or the state transition it performs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this versus archive_flag, delete_flag, or get_flag, nor any stated prerequisite such as the flag actually being archived. Usage must be inferred entirely from the name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_default_flag_lifetimeSet or remove a project's default flag lifetimeA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysYesLifetime in days (1–3650), or null to remove the default
previewNotrue: only report the impact; nothing is changed
projectYesProject key

Output Schema

ParametersJSON Schema
NameRequiredDescription
appliedYesfalse for a preview
projectYes
newlyPastExpiryYesFlags this would put past expiry
noLongerPastExpiryYesFlags this would take back out of expiry
defaultFlagLifetimeDaysYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the idempotentHint/destructiveHint annotations by disclosing that the setting is advisory only (evaluation never changes), that preview reports impact without mutation, and that setting can be refused with FEATURE_NOT_ENABLED when the plan lacks it while removal never is. These are exactly the behavioral traits an agent needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, then preview behavior, then error semantics, then a pointer to the current value. Dense but every sentence carries distinct, load-bearing information with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 3-param mutation tool with an output schema, the description is near-complete: it covers the effect, preview, error condition, and where to read the current value. It slightly under-describes the preview output shape, though the output schema covers return values.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and already documents days, null, and preview, so the baseline is 3. The description still adds semantic value: null means removal, and preview means counting flags that would newly be or stop being past expiry without changing anything, which clarifies intent beyond the schema wording.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Set how many days a temporary flag with no expiry date of its own lives before it counts as expired') and explicitly covers the inverse operation ('pass days: null to remove the default'). An agent can distinguish this from set_flag_expiry and set_flag_permanent without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear operational guidance: preview first to see the impact before committing, and notes removal is always allowed while setting may be refused. It does not name sibling tools or an explicit 'when not to use', so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_flag_expirySet or clear flag expiryA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
flagYesFlag key or id
projectYesProject key
expiresAtUtcYesDate (YYYY-MM-DD, end of that UTC day) or ISO-8601 timestamp, or null to clear the expiry

Output Schema

ParametersJSON Schema
NameRequiredDescription
flagYes
projectYes
expiresAtUtcYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the idempotentHint/destructiveHint annotations: expiry is advisory and never changes evaluation, find_stale_flags surfaces it once passed, and three named refusal codes (EXPIRY_IN_PAST, FEATURE_NOT_ENABLED, PERMANENT_FLAG_HAS_EXPIRY) are documented. Clearing-always-allowed is a genuinely useful behavioral guarantee.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core action and the null-clearing alternative, then layers semantics and error conditions in a tight sequence. Dense but every sentence carries operational information; nothing is padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need no explanation, and the description covers formats, failure modes, and the interaction with set_flag_permanent. Nothing an agent needs to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100%, but the description adds meaning: a bare date resolves to end-of-day UTC (matching the dashboard), while a full ISO-8601 timestamp is stored exactly. This disambiguates the two accepted formats beyond the schema's terser note.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb+resource ('Set the date a flag is expected to be removed by'), plus the clearing variant via null. It is clearly distinguishable from siblings like set_flag_permanent and set_default_flag_lifetime because it names the exact field (expiresAtUtc) and scope (this flag).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explains the two modes (set vs. clear with null) and routing conditions, including that a permanent flag must first be made temporary with set_flag_permanent. It does not explicitly say when to prefer this over set_default_flag_lifetime, but the context is clear enough for correct selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_flag_ownerSet or clear flag ownerA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
flagYesFlag key or id
ownerYesOwner email, "me" for the token's own user, or null (or "none") to clear the owner
projectYesProject key

Output Schema

ParametersJSON Schema
NameRequiredDescription
flagYes
ownerYesOwner email now set, or null when unowned
projectYes

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations only declare idempotentHint and destructiveHint=false. The description adds important, non-obvious behavior: who receives cleanup notices, that evaluation is unaffected, the specific error codes, and the plan-gating rule. That goes well beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is front-loaded: the main action and the clear behavior come first, then value constraints, then errors. The information is dense but mostly earns its place. Slightly more could be compressed, but it's efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 3-parameter mutation tool with an output schema, the description covers ownership semantics, constraints, errors, and plan gating. It doesn't explain the return value, but an output schema exists. It is nearly complete, missing only explicit guidance on alternatives.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds meaning to the owner value: it accepts an email, 'me', or null, and 'me' requires a personal access token. It also clarifies that evaluation is separate. It doesn't explain the project or flag keys, but those are already clear from the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Name the person responsible for a flag, or pass owner: null to leave it unowned.' This distinguishes it clearly from siblings like update_flag or toggle_flag, which affect different aspects of a flag.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explains the clear-vs-set behavior and the two acceptable owner value forms, and it states the refusal conditions (OWNER_NOT_MEMBER, PLAN_FEATURE_UNAVAILABLE). It also notes that clearing is always allowed. However, it doesn't point to an alternative tool for cases where the goal is bulk cleanup or planning, so it doesn't fully cover alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_flag_permanentMark a flag permanent or temporaryA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
flagYesFlag key or id
projectYesProject key
permanentYestrue to mark the flag permanent, false to make it temporary

Output Schema

ParametersJSON Schema
NameRequiredDescription
flagYes
projectYes
permanentYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare idempotentHint and destructiveHint, so the description carries the real behavioral burden and does so well: permanent flags are excluded from removal candidates and find_stale_flags, evaluation never changes, and the specific refusal codes (PERMANENT_FLAG_HAS_EXPIRY, FEATURE_NOT_ENABLED, archived flag) are enumerated. It also notes that making a flag temporary is always allowed, defining the asymmetric failure modes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two dense sentences, front-loaded with the positive case and the permanent:false escape hatch before the failure conditions. Every clause (exclusion from find_stale_flags, refusal codes, always-allowed revert) adds distinct, actionable information with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema already present, the description need not explain return values, and it instead covers the preconditions, error conditions, and downstream effects an agent needs. For a 3-param mutation with clear annotations, nothing material is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema by explaining the effect of permanent: false (reverts to temporary) and the cross-parameter interaction with set_flag_expiry's expiresAtUtc: null. It adds semantic value without needing to restate key types already in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (mark a flag permanent/temporary) and immediately scopes what "permanent" means: a kill switch, ops toggle or entitlement gate. It is distinguishable from adjacent siblings like set_flag_expiry, which it explicitly references for the expiry-clearing prerequisite.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear context for when to use it (flags meant to stay) and explicitly routes the dependency to set_flag_expiry with expiresAtUtc: null when an expiry blocks the change. It lacks an explicit 'when not to use vs alternatives' framing, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

toggle_flagToggle flag in environmentA
Destructive

Enable or disable a flag in ONE environment. Affects live evaluation immediately — double-check the environment.

ParametersJSON Schema
NameRequiredDescriptionDefault
flagYesFlag key or id
enabledYestrue to turn the flag on in this environment, false to turn it off
projectYesProject key
environmentYesEnvironment key, e.g. production

Output Schema

ParametersJSON Schema
NameRequiredDescription
flagYes
enabledYes
projectYes
environmentYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotation already declares destructiveHint=true, so the description need only add context. It does so by stating the change affects live evaluation immediately, which is a valuable behavioral trait beyond the annotation and reinforces why the warning matters.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loading the core action and appending the critical warning. Every sentence earns its place with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with annotations and an output schema, the description covers the action and its immediate live-evaluation impact. It lacks a note on prerequisites or whether changes are reversible, but the destructive annotation and output schema fill much of that gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema documents all four parameters fully. The description adds only the single-environment constraint, which is minor against the schema baseline of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb (enable/disable) and resource (flag in one environment), and flags the scope as a single environment. It is clearly distinguishable from siblings like update_flag or update_flag_environment_config.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It implies usage for toggling a flag in an environment but gives no explicit when-to-use vs. alternatives such as update_flag or update_flag_environment_config. The caution to double-check the environment is a usage note, not a comparison.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_flagUpdate feature flag metadataA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
flagYesFlag key or id
nameNoNew display name
tagsNoReplaces the whole tag list
ifMatchNoetag 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.
projectYesProject key
descriptionNoNew description; "" clears it
clientSideVisibleNoExpose to client-side SDKs (browser/mobile); false hides the flag from them entirely

Output Schema

ParametersJSON Schema
NameRequiredDescription
etagNoETag 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.
flagYes
projectYes
updatedYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only supply destructiveHint=true; the description carries the real behavioral load, disclosing partial-update semantics ('changes only the fields you pass'), the empty-string clear convention, field immutability, and optimistic-concurrency behavior (refused write / etag from get_flag). This is well beyond what the annotation states.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four dense sentences, each doing distinct work: field list, merge/clear semantics, immutability, alternative tools, then concurrency control. No filler and the mutable-field list is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive partial-update tool with an output schema already documenting returns, the description covers everything needed to call it correctly: scope, merge behavior, immutability constraints, concurrency guard, and sibling alternatives.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description adds genuine meaning the schema lacks: merge semantics ('changes only the fields you pass and keeps the rest') and the description:"" clearing convention. The ifMatch semantics largely restate the schema's own text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (update) plus resource (flag metadata) and enumerates exactly which fields are mutable (name/description/tags/clientSideVisible). It also explicitly separates itself from sibling tools that change behavior (toggle_flag, update_targeting), so an agent can route correctly without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use-this vs when-to-use-something-else: behavior changes go to toggle_flag / update_targeting, and key/type are declared immutable. The conditional ifMatch guidance ('pass ... to refuse the write if the flag changed') tells the agent when to include a parameter.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_flag_environment_configUpdate flag environment configA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
flagYesFlag key or id
projectYesProject key
strategyNoServing strategy; only SingleVariation is currently supported here
environmentYesEnvironment key, e.g. production
prerequisitesNoFlags 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.
defaultVariationIdYesVariation id to serve on fallthrough — required by the API

Output Schema

ParametersJSON Schema
NameRequiredDescription
flagYes
projectYes
strategyNo
environmentYes
prerequisitesNo
defaultVariationIdYes

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, so the mutation profile is known. The description adds the useful constraint that only SingleVariation is supported at this level, but does not say whether changes take effect immediately for live traffic, whether prerequisites are replaced or merged (that lives only in the schema), or what permissions are needed. Value-add beyond annotations is modest.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single dense sentence that front-loads the operation and its field list, with the alternative-tool note at the end. The nested parentheticals are slightly heavy but every clause carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation, and the required parameter plus the strategy limitation are covered. What's missing is the blast radius — whether the update is immediate, partial, or wholesale for prerequisites — which matters for a destructive-flagged mutation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all six parameters are already documented, including the prerequisite replace-vs-omit semantics and the fallthrough meaning of defaultVariationId. The description largely restates those schema notes rather than adding new meaning, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb and resource — 'Update a flag's per-environment serving config' — and enumerates the exact settings affected (defaultVariationId, strategy, prerequisites). This is clearly distinguishable from siblings like update_flag (flag-level) and update_targeting (rule-level).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes percentage rollout work away from this tool: 'Percentage rollouts are configured on targeting rules via update_targeting.' That is a concrete alternative with a condition. It doesn't cover when to prefer this over update_flag or toggle_flag, so not a full 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_targetingReplace targeting rulesA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
flagYesFlag key or id
rulesYesThe complete ordered rule list; rules left out are deleted
ifMatchNoetag 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.
projectYesProject key
environmentYesEnvironment key, e.g. production

Output Schema

ParametersJSON Schema
NameRequiredDescription
etagNoETag 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.
flagYes
projectYes
environmentYes
rulesReplacedYes

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare destructiveHint=true, but the description discloses the crucial destructive semantics (rules omitted from the payload are deleted), rule evaluation order, and the optimistic-concurrency contract including the 412 refusal behavior. These are exactly the traits an agent needs and that annotations cannot express.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four tight sentences with zero filler, and the most consequential fact — full replacement with deletion of omitted rules — is front-loaded in the first sentence.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive, concurrency-sensitive mutation the description covers destruction scope, ordering, prerequisite read, and conflict handling; with an output schema present it correctly omits return-shape detail. Nothing essential for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so baseline is 3; the schema already documents ifMatch's 412 behavior and the 'rules left out are deleted' semantics. The description reiterates rather than extends the per-parameter documentation, adding only the ordering note.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb (REPLACE) with the resource (all targeting rules of a flag) and the scope (one environment), and the parenthetical clarifies the full-PUT semantics. This distinguishes it cleanly from get_targeting and manage_targeting_rule without needing to open either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly prescribes the read-before-write workflow: call get_targeting first, then pass the etag as ifMatch. The condition that selects the alternative (single-rule edits via manage_targeting_rule) is only implied by the 'REPLACE all' framing rather than named, which keeps it just short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

wrap_featureWrap a feature in a new flagA

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesFlag key, e.g. new-checkout
nameNoDisplay name; defaults to the key
tagsNoTags for filtering, e.g. team or area
projectYesProject key
languageYesSDK language of the codebase being edited
descriptionNoWhat this flag guards
idempotency_keyNoIdempotency-Key header for safe retries

Output Schema

ParametersJSON Schema
NameRequiredDescription
flagYes
next_stepsYes
integrationYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only supply destructiveHint=false, so the description carries most of the burden and does well: it discloses that the tool does not edit code ('apply the edit yourself') and that the new flag defaults to DISABLED in every environment. It omits retry/auth behavior and the significance of the idempotency_key parameter, but the state and scope disclosures are genuinely useful.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the primary action and result, followed by the non-obvious constraint (snippet only) and the lifecycle default. Every sentence adds distinct information with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so the snippet return value needn't be described. Combined with full schema coverage, the description's coverage of scope (no code edit), default state (disabled everywhere), and next step (toggle_flag) makes it complete for this tool's complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% with 7 well-documented parameters, so the schema does the heavy lifting. The description adds no parameter-level meaning such as expected key format or language implications, making 3 the correct baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb+resource pair (create a Boolean feature flag) plus the distinctive side effect (return an SDK snippet for guarding a code path). It implicitly differentiates itself from the plain create_flag sibling by noting the snippet return, but never names that sibling or contrasts the two explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear context for when this tool fits — wrapping a new code path — and names the natural follow-up tool (toggle_flag) with the condition 'when ready.' It stops short of stating when to prefer the sibling create_flag instead, so the routing guidance is incomplete rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 34 tool updatesv0.3.0
    • Changedarchive_flag3 fields changed
      • addedInput schema / properties / flag / description
        Added value: +"Flag key or id"
      • addedInput schema / properties / project / description
        Added value: +"Project key"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "archived": {
        +      "type": "boolean"
        +    },
        +    "flag": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "flag",
        +    "archived"
        +  ],
        +  "type": "object"
        +}
    • Changedcreate_flag7 fields changed
      • addedInput schema / properties / description / description
        Added value: +"What the flag controls"
      • addedInput schema / properties / initialVariations / description
        Added value: +"Variations for a String, Number or Json flag (Boolean flags get true/false automatically)"
      • addedInput schema / properties / isPermanent
        Added value: +{
        +  "description": "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 expiresAtUtc",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / name / description
        Added value: +"Display name"
      • addedInput schema / properties / tags / description
        Added value: +"Tags for filtering, e.g. team or area"
      • addedInput schema / properties / type / description
        Added value: +"Value type; Boolean gets true/false variations automatically"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$defs": {
        +    "ActionCapability": {
        +      "description": "One entry in a resource's `_actions` block: may the caller perform it, and if not, why.",
        +      "properties": {
        +        "allowed": {
        +          "type": [
        +            "boolean",
        +            "null"
        +          ]
        +        },
        +        "reason": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    },
        +    "PublicFlagOwner": {
        +      "description": "A flag's owner as returned on flag reads. Null means the flag is unowned.",
        +      "properties": {
        +        "email": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "id": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "name": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    },
        +    "PublicVariationResponse": {
        +      "description": "A single variation on a flag, as returned in Variations.",
        +      "properties": {
        +        "_actions": {
        +          "additionalProperties": {
        +            "anyOf": [
        +              {
        +                "$ref": "#/$defs/ActionCapability"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          },
        +          "description": "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 runtime; safe to ignore. Present only on top-level resource responses — nested occurrences (e.g. a rule inside a targeting-config response) do not carry it.",
        +          "type": [
        +            "object",
        +            "null"
        +          ]
        +        },
        +        "description": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "id": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "key": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "name": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "value": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    }
        +  },
        +  "description": "Public detail representation of a feature flag, returned by\n`GET .../flags/{flag}` and the body of a successful create. Drops internal/dashboard-only\nfields present on FeatureFlagDto — notably `ProjectId` (implicit in the\nroute) and `Staleness` (an internal analytics signal, not part of the public contract).\nEffectiveExpiresAtUtc is when the flag counts as past expiry, from its own ExpiresAtUtc\nor its project's default lifetime; ExpirySource says which (`explicit` / `project-default`),\nboth null when neither applies.",
        +  "properties": {
        +    "_actions": {
        +      "additionalProperties": {
        +        "anyOf": [
        +          {
        +            "$ref": "#/$defs/ActionCapability"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "description": "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 runtime; safe to ignore. Present only on top-level resource responses — nested occurrences (e.g. a rule inside a targeting-config response) do not carry it.",
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    },
        +    "clientSideVisible": {
        +      "type": [
        +        "boolean",
        +        "null"
        +      ]
        +    },
        +    "createdAt": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "description": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "effectiveExpiresAtUtc": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "expiresAtUtc": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "expirySource": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "id": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "isArchived": {
        +      "type": [
        +        "boolean",
        +        "null"
        +      ]
        +    },
        +    "isPermanent": {
        +      "type": [
        +        "boolean",
        +        "null"
        +      ]
        +    },
        +    "key": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "name": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "owner": {
        +      "anyOf": [
        +        {
        +          "$ref": "#/$defs/PublicFlagOwner"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "removalPrUrl": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "tags": {
        +      "items": {
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "type": [
        +        "array",
        +        "null"
        +      ]
        +    },
        +    "type": {
        +      "description": "Allowed values: Boolean, String, Number, Json.",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "updatedAt": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "variations": {
        +      "items": {
        +        "anyOf": [
        +          {
        +            "$ref": "#/$defs/PublicVariationResponse"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "type": [
        +        "array",
        +        "null"
        +      ]
        +    }
        +  },
        +  "type": "object"
        +}
    • Changeddelete_flag2 fields changed
      • addedInput schema / properties / project / description
        Added value: +"Project key"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "deleted": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "deleted"
        +  ],
        +  "type": "object"
        +}
    • Changeddeliver_webhook2 fields changed
      • addedInput schema / properties / action / description
        Added value: +"test sends a synthetic event; redeliver re-sends deliveryId"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$defs": {
        +    "PublicTestWebhookSubscriptionResponse": {
        +      "description": "The queued test event and its delivery. Poll the delivery log for the outcome.",
        +      "properties": {
        +        "webhookDeliveryId": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "webhookEventId": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    }
        +  },
        +  "anyOf": [
        +    {
        +      "$ref": "#/$defs/PublicTestWebhookSubscriptionResponse"
        +    },
        +    {
        +      "properties": {
        +        "id": {
        +          "type": "string"
        +        },
        +        "redelivered": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "id",
        +        "redelivered"
        +      ],
        +      "type": "object"
        +    }
        +  ],
        +  "type": "object"
        +}
    • Changedfind_stale_flags2 fields changed
      • addedInput schema / properties / project / description
        Added value: +"Project key"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$defs": {
        +    "PublicFlagOwner": {
        +      "description": "A flag's owner as returned on flag reads. Null means the flag is unowned.",
        +      "properties": {
        +        "email": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "id": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "name": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    }
        +  },
        +  "properties": {
        +    "blockedByNote": {
        +      "type": "string"
        +    },
        +    "checked": {
        +      "type": "integer"
        +    },
        +    "note": {
        +      "type": "string"
        +    },
        +    "olderThanDays": {
        +      "type": "integer"
        +    },
        +    "owner": {
        +      "type": "string"
        +    },
        +    "project": {
        +      "type": "string"
        +    },
        +    "stale": {
        +      "items": {
        +        "properties": {
        +          "blockedBy": {
        +            "description": "null means unknown, not unblocked",
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": [
        +              "array",
        +              "null"
        +            ]
        +          },
        +          "effectiveExpiresAtUtc": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "environments": {
        +            "type": "integer"
        +          },
        +          "expired": {
        +            "type": "boolean"
        +          },
        +          "expiresAtUtc": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "expirySource": {
        +            "description": "explicit, project-default, or null",
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "key": {
        +            "type": "string"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "owner": {
        +            "anyOf": [
        +              {
        +                "$ref": "#/$defs/PublicFlagOwner"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          },
        +          "reason": {
        +            "description": "enabled-everywhere, disabled-everywhere or past-expiry",
        +            "type": "string"
        +          },
        +          "updatedAt": {
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "truncated": {
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "project",
        +    "olderThanDays",
        +    "checked",
        +    "truncated",
        +    "stale"
        +  ],
        +  "type": "object"
        +}
    • Changedflag_status3 fields changed
      • addedInput schema / properties / flag / description
        Added value: +"Flag key or id"
      • addedInput schema / properties / project / description
        Added value: +"Project key"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "archived": {
        +      "type": "boolean"
        +    },
        +    "environments": {
        +      "items": {
        +        "properties": {
        +          "defaultVariation": {
        +            "description": "Variation key served on fallthrough",
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "enabled": {
        +            "type": "boolean"
        +          },
        +          "environment": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "prerequisites": {
        +            "type": "array"
        +          },
        +          "strategy": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "key": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "name": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "type": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "updatedAt": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "required": [
        +    "key",
        +    "name",
        +    "type",
        +    "archived",
        +    "updatedAt",
        +    "environments"
        +  ],
        +  "type": "object"
        +}
    • Changedget_flag1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$defs": {
        +    "ActionCapability": {
        +      "description": "One entry in a resource's `_actions` block: may the caller perform it, and if not, why.",
        +      "properties": {
        +        "allowed": {
        +          "type": [
        +            "boolean",
        +            "null"
        +          ]
        +        },
        +        "reason": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    },
        +    "PublicFlagOwner": {
        +      "description": "A flag's owner as returned on flag reads. Null means the flag is unowned.",
        +      "properties": {
        +        "email": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "id": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "name": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    },
        +    "PublicVariationResponse": {
        +      "description": "A single variation on a flag, as returned in Variations.",
        +      "properties": {
        +        "_actions": {
        +          "additionalProperties": {
        +            "anyOf": [
        +              {
        +                "$ref": "#/$defs/ActionCapability"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          },
        +          "description": "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 runtime; safe to ignore. Present only on top-level resource responses — nested occurrences (e.g. a rule inside a targeting-config response) do not carry it.",
        +          "type": [
        +            "object",
        +            "null"
        +          ]
        +        },
        +        "description": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "id": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "key": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "name": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "value": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    }
        +  },
        +  "description": "Public detail representation of a feature flag, returned by\n`GET .../flags/{flag}` and the body of a successful create. Drops internal/dashboard-only\nfields present on FeatureFlagDto — notably `ProjectId` (implicit in the\nroute) and `Staleness` (an internal analytics signal, not part of the public contract).\nEffectiveExpiresAtUtc is when the flag counts as past expiry, from its own ExpiresAtUtc\nor its project's default lifetime; ExpirySource says which (`explicit` / `project-default`),\nboth null when neither applies.",
        +  "properties": {
        +    "_actions": {
        +      "additionalProperties": {
        +        "anyOf": [
        +          {
        +            "$ref": "#/$defs/ActionCapability"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "description": "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 runtime; safe to ignore. Present only on top-level resource responses — nested occurrences (e.g. a rule inside a targeting-config response) do not carry it.",
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    },
        +    "clientSideVisible": {
        +      "type": [
        +        "boolean",
        +        "null"
        +      ]
        +    },
        +    "createdAt": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "description": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "effectiveExpiresAtUtc": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "etag": {
        +      "description": "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.",
        +      "type": "string"
        +    },
        +    "expiresAtUtc": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "expirySource": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "id": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "isArchived": {
        +      "type": [
        +        "boolean",
        +        "null"
        +      ]
        +    },
        +    "isPermanent": {
        +      "type": [
        +        "boolean",
        +        "null"
        +      ]
        +    },
        +    "key": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "name": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "owner": {
        +      "anyOf": [
        +        {
        +          "$ref": "#/$defs/PublicFlagOwner"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "removalPrUrl": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "tags": {
        +      "items": {
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "type": [
        +        "array",
        +        "null"
        +      ]
        +    },
        +    "type": {
        +      "description": "Allowed values: Boolean, String, Number, Json.",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "updatedAt": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "variations": {
        +      "items": {
        +        "anyOf": [
        +          {
        +            "$ref": "#/$defs/PublicVariationResponse"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "type": [
        +        "array",
        +        "null"
        +      ]
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedget_segment1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$defs": {
        +    "ActionCapability": {
        +      "description": "One entry in a resource's `_actions` block: may the caller perform it, and if not, why.",
        +      "properties": {
        +        "allowed": {
        +          "type": [
        +            "boolean",
        +            "null"
        +          ]
        +        },
        +        "reason": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    },
        +    "PublicSegmentConditionDto": {
        +      "description": "A single targeting condition on a segment, used both as input (create/update) and output\n(Conditions). Operator is a bare string on\nboth sides of the wire — on write it's parsed to\nOperatorType by `SegmentsController` (an unknown\nvalue fails closed with a 400, never silently dropped or defaulted); on read it's mapped\nstraight through from Operator, which is already a string.",
        +      "properties": {
        +        "attribute": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "negate": {
        +          "type": [
        +            "boolean",
        +            "null"
        +          ]
        +        },
        +        "operator": {
        +          "description": "Allowed values: Equals, NotEquals, Contains, NotContains, GreaterThan, LessThan, GreaterThanOrEqual, LessThanOrEqual, In, NotIn, MatchesRegex, StartsWith, EndsWith, Before, After, SemverEquals, SemverGreaterThan, SemverGreaterThanOrEqual, SemverLessThan, SemverLessThanOrEqual.",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "values": {
        +          "items": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "type": [
        +            "array",
        +            "null"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    }
        +  },
        +  "description": "Public representation of a user segment, returned by `GET .../segments`,\n`GET .../segments/{segment}`, and the body of a successful create.",
        +  "properties": {
        +    "_actions": {
        +      "additionalProperties": {
        +        "anyOf": [
        +          {
        +            "$ref": "#/$defs/ActionCapability"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "description": "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 runtime; safe to ignore. Present only on top-level resource responses — nested occurrences (e.g. a rule inside a targeting-config response) do not carry it.",
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    },
        +    "conditions": {
        +      "items": {
        +        "anyOf": [
        +          {
        +            "$ref": "#/$defs/PublicSegmentConditionDto"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "type": [
        +        "array",
        +        "null"
        +      ]
        +    },
        +    "createdAt": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "description": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "etag": {
        +      "description": "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.",
        +      "type": "string"
        +    },
        +    "id": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "key": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "name": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "updatedAt": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedget_targeting4 fields changed
      • addedInput schema / properties / environment / description
        Added value: +"Environment key, e.g. production"
      • addedInput schema / properties / flag / description
        Added value: +"Flag key or id"
      • addedInput schema / properties / project / description
        Added value: +"Project key"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$defs": {
        +    "ActionCapability": {
        +      "description": "One entry in a resource's `_actions` block: may the caller perform it, and if not, why.",
        +      "properties": {
        +        "allowed": {
        +          "type": [
        +            "boolean",
        +            "null"
        +          ]
        +        },
        +        "reason": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    },
        +    "PublicConditionGroupResponse": {
        +      "description": "A condition group within a PublicTargetingRuleResponse. Maps 1:1 onto\nConditionGroupDto. Operator is a bare wire string naming one of\nthe `ConditionGroupOperator` members (`\"And\"`/`\"Or\"`) —\ngroups are ANDed together at the rule level; within a group, its conditions combine using\nthis operator.",
        +      "properties": {
        +        "conditions": {
        +          "items": {
        +            "anyOf": [
        +              {
        +                "$ref": "#/$defs/PublicConditionResponse"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          },
        +          "type": [
        +            "array",
        +            "null"
        +          ]
        +        },
        +        "operator": {
        +          "description": "Allowed values: And, Or.",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    },
        +    "PublicConditionResponse": {
        +      "description": "A single condition within a PublicConditionGroupResponse. Maps 1:1 onto\nConditionDto. Operator is a bare wire string naming one of the\n`OperatorType` members (e.g. `\"Equals\"`, `\"In\"`).",
        +      "properties": {
        +        "attribute": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "negate": {
        +          "type": [
        +            "boolean",
        +            "null"
        +          ]
        +        },
        +        "operator": {
        +          "description": "Allowed values: Equals, NotEquals, Contains, NotContains, GreaterThan, LessThan, GreaterThanOrEqual, LessThanOrEqual, In, NotIn, MatchesRegex, StartsWith, EndsWith, Before, After, SemverEquals, SemverGreaterThan, SemverGreaterThanOrEqual, SemverLessThan, SemverLessThanOrEqual.",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "values": {
        +          "items": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "type": [
        +            "array",
        +            "null"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    },
        +    "PublicTargetingRuleResponse": {
        +      "description": "A single targeting rule, returned by `GET .../rules/{ruleId}`,\n`POST .../rules` (201 body), and nested within PublicTargetingConfigResponse.\nMaps 1:1 onto TargetingRuleDto, dropping nothing — every field on the\nApplication DTO is part of the public contract.",
        +      "properties": {
        +        "_actions": {
        +          "additionalProperties": {
        +            "anyOf": [
        +              {
        +                "$ref": "#/$defs/ActionCapability"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          },
        +          "description": "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 runtime; safe to ignore. Present only on top-level resource responses — nested occurrences (e.g. a rule inside a targeting-config response) do not carry it.",
        +          "type": [
        +            "object",
        +            "null"
        +          ]
        +        },
        +        "conditionGroups": {
        +          "items": {
        +            "anyOf": [
        +              {
        +                "$ref": "#/$defs/PublicConditionGroupResponse"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          },
        +          "type": [
        +            "array",
        +            "null"
        +          ]
        +        },
        +        "description": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "id": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "priority": {
        +          "type": [
        +            "integer",
        +            "null"
        +          ]
        +        },
        +        "rolloutPercentage": {
        +          "type": [
        +            "integer",
        +            "null"
        +          ]
        +        },
        +        "userSegmentId": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "variationId": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    }
        +  },
        +  "description": "The full targeting configuration for a flag in a single environment, returned by\n`GET .../targeting`. Maps 1:1 onto TargetingConfigurationDto — including\nits IsEnabled field, which reflects the parent\n`FlagEnvironmentConfiguration.IsEnabled` (whether the flag is on in this environment at\nall), not anything specific to targeting itself.",
        +  "properties": {
        +    "_actions": {
        +      "additionalProperties": {
        +        "anyOf": [
        +          {
        +            "$ref": "#/$defs/ActionCapability"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "description": "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 runtime; safe to ignore. Present only on top-level resource responses — nested occurrences (e.g. a rule inside a targeting-config response) do not carry it.",
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    },
        +    "etag": {
        +      "description": "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.",
        +      "type": "string"
        +    },
        +    "isEnabled": {
        +      "type": [
        +        "boolean",
        +        "null"
        +      ]
        +    },
        +    "rules": {
        +      "items": {
        +        "anyOf": [
        +          {
        +            "$ref": "#/$defs/PublicTargetingRuleResponse"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "type": [
        +        "array",
        +        "null"
        +      ]
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedlist_environments3 fields changed
      • addedInput schema / properties / cursor / description
        Added value: +"next_cursor from a previous response"
      • addedInput schema / properties / limit / description
        Added value: +"Page size (default 20)"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$defs": {
        +    "ActionCapability": {
        +      "description": "One entry in a resource's `_actions` block: may the caller perform it, and if not, why.",
        +      "properties": {
        +        "allowed": {
        +          "type": [
        +            "boolean",
        +            "null"
        +          ]
        +        },
        +        "reason": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    },
        +    "PublicEnvironmentResponse": {
        +      "description": "Public representation of an environment, returned by\n`GET /api/v1/orgs/{org}/projects/{project}/environments` (list),\n`GET .../environments/{env}` (detail), and the body of a successful create/update. Drops\ninternal fields (e.g. `ProjectId` is implicit in the route) — mirrors\n`ProjectResponse`'s minimal shape. Named `PublicEnvironmentResponse` rather than\n`EnvironmentResponse` (unlike the sibling `ProjectResponse`, which didn't collide)\nbecause the dashboard already has its own\n`EnvironmentResponse` — see\nPublicCreateEnvironmentRequest for the schemaId-collision rationale.",
        +      "properties": {
        +        "_actions": {
        +          "additionalProperties": {
        +            "anyOf": [
        +              {
        +                "$ref": "#/$defs/ActionCapability"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          },
        +          "description": "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 runtime; safe to ignore. Present only on top-level resource responses — nested occurrences (e.g. a rule inside a targeting-config response) do not carry it.",
        +          "type": [
        +            "object",
        +            "null"
        +          ]
        +        },
        +        "color": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "id": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "key": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "name": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "sortOrder": {
        +          "type": [
        +            "integer",
        +            "null"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    }
        +  },
        +  "description": "A page of results plus an opaque cursor for the next page, or null when this is the last\npage. Wire keys are frozen: `items` (already lowercase under the camelCase policy) and\n`next_cursor` (pinned explicitly — the policy alone would emit `nextCursor`).",
        +  "properties": {
        +    "_actions": {
        +      "additionalProperties": {
        +        "anyOf": [
        +          {
        +            "$ref": "#/$defs/ActionCapability"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "description": "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 runtime; safe to ignore. Present only on top-level resource responses — nested occurrences (e.g. a rule inside a targeting-config response) do not carry it.",
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    },
        +    "items": {
        +      "items": {
        +        "anyOf": [
        +          {
        +            "$ref": "#/$defs/PublicEnvironmentResponse"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "type": [
        +        "array",
        +        "null"
        +      ]
        +    },
        +    "next_cursor": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedlist_flags6 fields changed
      • addedInput schema / properties / cursor / description
        Added value: +"next_cursor from a previous response"
      • addedInput schema / properties / limit / description
        Added value: +"Page size (default 20)"
      • addedInput schema / properties / search / description
        Added value: +"Substring of the flag key or name"
      • addedInput schema / properties / tag / description
        Added value: +"Only flags carrying this tag"
      • addedInput schema / properties / type / description
        Added value: +"Only flags of this type"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$defs": {
        +    "ActionCapability": {
        +      "description": "One entry in a resource's `_actions` block: may the caller perform it, and if not, why.",
        +      "properties": {
        +        "allowed": {
        +          "type": [
        +            "boolean",
        +            "null"
        +          ]
        +        },
        +        "reason": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    },
        +    "PublicFlagListItem": {
        +      "description": "Public list-item representation of a feature flag, returned by\n`GET .../flags`. Narrower than PublicFlagResponse — drops\nVariations (a summary-only shape upstream) and\nStaleness, matching the \"list is narrower than detail\"\nsplit already present on the Application-layer DTOs.\nEffectiveExpiresAtUtc is when the flag counts as past expiry, from its own ExpiresAtUtc\nor its project's default lifetime; ExpirySource says which (`explicit` / `project-default`),\nboth null when neither applies.",
        +      "properties": {
        +        "clientSideVisible": {
        +          "type": [
        +            "boolean",
        +            "null"
        +          ]
        +        },
        +        "createdAt": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "effectiveExpiresAtUtc": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "expiresAtUtc": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "expirySource": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "id": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "isArchived": {
        +          "type": [
        +            "boolean",
        +            "null"
        +          ]
        +        },
        +        "isPermanent": {
        +          "type": [
        +            "boolean",
        +            "null"
        +          ]
        +        },
        +        "key": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "name": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "owner": {
        +          "anyOf": [
        +            {
        +              "$ref": "#/$defs/PublicFlagOwner"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        },
        +        "removalPrUrl": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "tags": {
        +          "items": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "type": [
        +            "array",
        +            "null"
        +          ]
        +        },
        +        "type": {
        +          "description": "Allowed values: Boolean, String, Number, Json.",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "updatedAt": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    },
        +    "PublicFlagOwner": {
        +      "description": "A flag's owner as returned on flag reads. Null means the flag is unowned.",
        +      "properties": {
        +        "email": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "id": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "name": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    }
        +  },
        +  "description": "A page of results plus an opaque cursor for the next page, or null when this is the last\npage. Wire keys are frozen: `items` (already lowercase under the camelCase policy) and\n`next_cursor` (pinned explicitly — the policy alone would emit `nextCursor`).",
        +  "properties": {
        +    "_actions": {
        +      "additionalProperties": {
        +        "anyOf": [
        +          {
        +            "$ref": "#/$defs/ActionCapability"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "description": "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 runtime; safe to ignore. Present only on top-level resource responses — nested occurrences (e.g. a rule inside a targeting-config response) do not carry it.",
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    },
        +    "items": {
        +      "items": {
        +        "anyOf": [
        +          {
        +            "$ref": "#/$defs/PublicFlagListItem"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "type": [
        +        "array",
        +        "null"
        +      ]
        +    },
        +    "next_cursor": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedlist_projects1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$defs": {
        +    "ActionCapability": {
        +      "description": "One entry in a resource's `_actions` block: may the caller perform it, and if not, why.",
        +      "properties": {
        +        "allowed": {
        +          "type": [
        +            "boolean",
        +            "null"
        +          ]
        +        },
        +        "reason": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    },
        +    "ProjectResponse": {
        +      "description": "Public representation of a project, returned by `GET /api/v1/orgs/{org}/projects` (list),\n`GET .../projects/{project}` (detail), and the body of a successful create/update. Drops\nthe dashboard-only nested `Environments` collection from ProjectDto — the\npublic API surfaces environments via their own endpoint (Task 6), not embedded here.\nUpdatedAt is only populated from ProjectDto (the detail/create\nshape); ProjectListItemDto doesn't carry it, so list rows leave it `null`.\nDefaultFlagLifetimeDays is the project's default flag lifetime in days, or null (#3194).",
        +      "properties": {
        +        "_actions": {
        +          "additionalProperties": {
        +            "anyOf": [
        +              {
        +                "$ref": "#/$defs/ActionCapability"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          },
        +          "description": "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 runtime; safe to ignore. Present only on top-level resource responses — nested occurrences (e.g. a rule inside a targeting-config response) do not carry it.",
        +          "type": [
        +            "object",
        +            "null"
        +          ]
        +        },
        +        "createdAt": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "defaultFlagLifetimeDays": {
        +          "type": [
        +            "integer",
        +            "null"
        +          ]
        +        },
        +        "description": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "id": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "key": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "name": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "updatedAt": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    }
        +  },
        +  "description": "A page of results plus an opaque cursor for the next page, or null when this is the last\npage. Wire keys are frozen: `items` (already lowercase under the camelCase policy) and\n`next_cursor` (pinned explicitly — the policy alone would emit `nextCursor`).",
        +  "properties": {
        +    "_actions": {
        +      "additionalProperties": {
        +        "anyOf": [
        +          {
        +            "$ref": "#/$defs/ActionCapability"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "description": "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 runtime; safe to ignore. Present only on top-level resource responses — nested occurrences (e.g. a rule inside a targeting-config response) do not carry it.",
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    },
        +    "items": {
        +      "items": {
        +        "anyOf": [
        +          {
        +            "$ref": "#/$defs/ProjectResponse"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "type": [
        +        "array",
        +        "null"
        +      ]
        +    },
        +    "next_cursor": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedlist_removal_candidates3 fields changed
      • addedInput schema / properties / cursor / description
        Added value: +"next_cursor from a previous response"
      • addedInput schema / properties / limit / description
        Added value: +"Page size (default 20)"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$defs": {
        +    "PublicFlagRemovalCandidate": {
        +      "description": "One dead flag the Featureflip Flag Cleanup Action should remove, returned by\n`GET .../flags/removal-candidates`. `Treatment` is the kill decision: true → keep the\nflag's on-branch, false → keep the off-branch. `Status` is the flag's staleness tier\n(`\"Stale\"` or `\"Dead\"`, never `\"Active\"`) — lets a caller distinguish the two when\n`?staleness=stale` widens the response to include both tiers. This is the ONLY public\nprojection of staleness — PublicFlagResponse and PublicFlagListItem\nstill omit it by design. `BlockedBy` names the live flags that still list this one as a\nprerequisite, sorted by key; while it is non-empty the flag cannot be archived\n(`FLAG_HAS_DEPENDENTS`), so a caller should remove those dependents first.",
        +      "properties": {
        +        "blockedBy": {
        +          "items": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "type": [
        +            "array",
        +            "null"
        +          ]
        +        },
        +        "key": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "reason": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "status": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "treatment": {
        +          "type": [
        +            "boolean",
        +            "null"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    }
        +  },
        +  "description": "A page of results plus an opaque cursor for the next page, or null when this is the last\npage. Wire keys are frozen: `items` (already lowercase under the camelCase policy) and\n`next_cursor` (pinned explicitly — the policy alone would emit `nextCursor`).",
        +  "properties": {
        +    "items": {
        +      "items": {
        +        "anyOf": [
        +          {
        +            "$ref": "#/$defs/PublicFlagRemovalCandidate"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "type": [
        +        "array",
        +        "null"
        +      ]
        +    },
        +    "next_cursor": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "type": "object"
        +}
    • Addedlist_sdk_keys
    • Changedlist_segments3 fields changed
      • addedInput schema / properties / cursor / description
        Added value: +"next_cursor from a previous response"
      • addedInput schema / properties / limit / description
        Added value: +"Page size (default 20)"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$defs": {
        +    "ActionCapability": {
        +      "description": "One entry in a resource's `_actions` block: may the caller perform it, and if not, why.",
        +      "properties": {
        +        "allowed": {
        +          "type": [
        +            "boolean",
        +            "null"
        +          ]
        +        },
        +        "reason": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    },
        +    "PublicSegmentConditionDto": {
        +      "description": "A single targeting condition on a segment, used both as input (create/update) and output\n(Conditions). Operator is a bare string on\nboth sides of the wire — on write it's parsed to\nOperatorType by `SegmentsController` (an unknown\nvalue fails closed with a 400, never silently dropped or defaulted); on read it's mapped\nstraight through from Operator, which is already a string.",
        +      "properties": {
        +        "attribute": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "negate": {
        +          "type": [
        +            "boolean",
        +            "null"
        +          ]
        +        },
        +        "operator": {
        +          "description": "Allowed values: Equals, NotEquals, Contains, NotContains, GreaterThan, LessThan, GreaterThanOrEqual, LessThanOrEqual, In, NotIn, MatchesRegex, StartsWith, EndsWith, Before, After, SemverEquals, SemverGreaterThan, SemverGreaterThanOrEqual, SemverLessThan, SemverLessThanOrEqual.",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "values": {
        +          "items": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "type": [
        +            "array",
        +            "null"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    },
        +    "PublicSegmentResponse": {
        +      "description": "Public representation of a user segment, returned by `GET .../segments`,\n`GET .../segments/{segment}`, and the body of a successful create.",
        +      "properties": {
        +        "_actions": {
        +          "additionalProperties": {
        +            "anyOf": [
        +              {
        +                "$ref": "#/$defs/ActionCapability"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          },
        +          "description": "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 runtime; safe to ignore. Present only on top-level resource responses — nested occurrences (e.g. a rule inside a targeting-config response) do not carry it.",
        +          "type": [
        +            "object",
        +            "null"
        +          ]
        +        },
        +        "conditions": {
        +          "items": {
        +            "anyOf": [
        +              {
        +                "$ref": "#/$defs/PublicSegmentConditionDto"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          },
        +          "type": [
        +            "array",
        +            "null"
        +          ]
        +        },
        +        "createdAt": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "description": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "id": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "key": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "name": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "updatedAt": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    }
        +  },
        +  "description": "A page of results plus an opaque cursor for the next page, or null when this is the last\npage. Wire keys are frozen: `items` (already lowercase under the camelCase policy) and\n`next_cursor` (pinned explicitly — the policy alone would emit `nextCursor`).",
        +  "properties": {
        +    "_actions": {
        +      "additionalProperties": {
        +        "anyOf": [
        +          {
        +            "$ref": "#/$defs/ActionCapability"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "description": "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 runtime; safe to ignore. Present only on top-level resource responses — nested occurrences (e.g. a rule inside a targeting-config response) do not carry it.",
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    },
        +    "items": {
        +      "items": {
        +        "anyOf": [
        +          {
        +            "$ref": "#/$defs/PublicSegmentResponse"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "type": [
        +        "array",
        +        "null"
        +      ]
        +    },
        +    "next_cursor": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedlist_webhook_deliveries1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$defs": {
        +    "PublicWebhookDeliveryResponse": {
        +      "description": "One delivery attempt record. `status` is `Pending` (awaiting its first attempt,\nbacking off, or in flight), `Succeeded` or `DeadLettered`.",
        +      "properties": {
        +        "attemptCount": {
        +          "type": [
        +            "integer",
        +            "null"
        +          ]
        +        },
        +        "completedAt": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "createdAt": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "id": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "lastError": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "lastResponseStatusCode": {
        +          "type": [
        +            "integer",
        +            "null"
        +          ]
        +        },
        +        "nextAttemptAt": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "status": {
        +          "description": "Allowed values: Pending, Succeeded, DeadLettered.",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "webhookEventId": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    }
        +  },
        +  "description": "A page of results plus an opaque cursor for the next page, or null when this is the last\npage. Wire keys are frozen: `items` (already lowercase under the camelCase policy) and\n`next_cursor` (pinned explicitly — the policy alone would emit `nextCursor`).",
        +  "properties": {
        +    "items": {
        +      "items": {
        +        "anyOf": [
        +          {
        +            "$ref": "#/$defs/PublicWebhookDeliveryResponse"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "type": [
        +        "array",
        +        "null"
        +      ]
        +    },
        +    "next_cursor": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedlist_webhooks1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$defs": {
        +    "ActionCapability": {
        +      "description": "One entry in a resource's `_actions` block: may the caller perform it, and if not, why.",
        +      "properties": {
        +        "allowed": {
        +          "type": [
        +            "boolean",
        +            "null"
        +          ]
        +        },
        +        "reason": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    },
        +    "PublicWebhookSecretResponse": {
        +      "description": "A signing secret's id and lifecycle. A secret with no `retiredAt` is active and signs every delivery.",
        +      "properties": {
        +        "createdAt": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "id": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "retiredAt": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    },
        +    "PublicWebhookSubscriptionResponse": {
        +      "description": "A webhook subscription. Never carries secret material: signing secrets are listed by id and\nlifecycle only — the value itself is returned once, when it is created or rotated.\n`overPlanLimit` is true when the organization has more subscriptions than its plan\nallows, which happens after a downgrade. The oldest subscriptions up to the limit keep\ndelivering. The rest receive nothing and cannot be re-enabled, tested or redelivered to until\nthe plan is upgraded or older subscriptions are deleted.",
        +      "properties": {
        +        "_actions": {
        +          "additionalProperties": {
        +            "anyOf": [
        +              {
        +                "$ref": "#/$defs/ActionCapability"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          },
        +          "description": "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 runtime; safe to ignore. Present only on top-level resource responses — nested occurrences (e.g. a rule inside a targeting-config response) do not carry it.",
        +          "type": [
        +            "object",
        +            "null"
        +          ]
        +        },
        +        "autoDisabledAt": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "consecutiveFailureCount": {
        +          "type": [
        +            "integer",
        +            "null"
        +          ]
        +        },
        +        "createdAt": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "environmentIds": {
        +          "items": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "type": [
        +            "array",
        +            "null"
        +          ]
        +        },
        +        "eventTypes": {
        +          "items": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "type": [
        +            "array",
        +            "null"
        +          ]
        +        },
        +        "id": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "isEnabled": {
        +          "type": [
        +            "boolean",
        +            "null"
        +          ]
        +        },
        +        "name": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "overPlanLimit": {
        +          "type": [
        +            "boolean",
        +            "null"
        +          ]
        +        },
        +        "projectIds": {
        +          "items": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "type": [
        +            "array",
        +            "null"
        +          ]
        +        },
        +        "provider": {
        +          "description": "Allowed values: GenericHttp.",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "secrets": {
        +          "items": {
        +            "anyOf": [
        +              {
        +                "$ref": "#/$defs/PublicWebhookSecretResponse"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          },
        +          "type": [
        +            "array",
        +            "null"
        +          ]
        +        },
        +        "updatedAt": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "url": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    }
        +  },
        +  "description": "A page of results plus an opaque cursor for the next page, or null when this is the last\npage. Wire keys are frozen: `items` (already lowercase under the camelCase policy) and\n`next_cursor` (pinned explicitly — the policy alone would emit `nextCursor`).",
        +  "properties": {
        +    "_actions": {
        +      "additionalProperties": {
        +        "anyOf": [
        +          {
        +            "$ref": "#/$defs/ActionCapability"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "description": "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 runtime; safe to ignore. Present only on top-level resource responses — nested occurrences (e.g. a rule inside a targeting-config response) do not carry it.",
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    },
        +    "availableEventTypes": {
        +      "description": "Event types a subscription can filter on",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "items": {
        +      "items": {
        +        "anyOf": [
        +          {
        +            "$ref": "#/$defs/PublicWebhookSubscriptionResponse"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "type": [
        +        "array",
        +        "null"
        +      ]
        +    },
        +    "next_cursor": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "type": "object"
        +}
    • Addedmanage_environment
    • Addedmanage_project
    • Addedmanage_sdk_key
    • Addedmanage_segment
    • Addedmanage_targeting_rule
    • Changedmanage_variation6 fields changed
      • addedInput schema / properties / action / description
        Added value: +"add needs key + value; update and remove need variationId"
      • addedInput schema / properties / description / description
        Added value: +"What this variation means"
      • addedInput schema / properties / flag / description
        Added value: +"Flag key or id"
      • addedInput schema / properties / name / description
        Added value: +"Display name"
      • addedInput schema / properties / project / description
        Added value: +"Project key"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$defs": {
        +    "ActionCapability": {
        +      "description": "One entry in a resource's `_actions` block: may the caller perform it, and if not, why.",
        +      "properties": {
        +        "allowed": {
        +          "type": [
        +            "boolean",
        +            "null"
        +          ]
        +        },
        +        "reason": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    },
        +    "PublicVariationResponse": {
        +      "description": "A single variation on a flag, as returned in Variations.",
        +      "properties": {
        +        "_actions": {
        +          "additionalProperties": {
        +            "anyOf": [
        +              {
        +                "$ref": "#/$defs/ActionCapability"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          },
        +          "description": "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 runtime; safe to ignore. Present only on top-level resource responses — nested occurrences (e.g. a rule inside a targeting-config response) do not carry it.",
        +          "type": [
        +            "object",
        +            "null"
        +          ]
        +        },
        +        "description": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "id": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "key": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "name": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "value": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    }
        +  },
        +  "anyOf": [
        +    {
        +      "$ref": "#/$defs/PublicVariationResponse"
        +    },
        +    {
        +      "properties": {
        +        "updated": {
        +          "description": "Id of the updated variation",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "updated"
        +      ],
        +      "type": "object"
        +    },
        +    {
        +      "properties": {
        +        "removed": {
        +          "description": "Id of the removed variation",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "removed"
        +      ],
        +      "type": "object"
        +    }
        +  ],
        +  "type": "object"
        +}
    • Changedmanage_webhook2 fields changed
      • addedInput schema / properties / action / description
        Added value: +"What to do; every action except create needs id"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$defs": {
        +    "PublicCreateWebhookSubscriptionResponse": {
        +      "description": "The created subscription's id and its signing secret. The secret is shown only here.",
        +      "properties": {
        +        "id": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "secret": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "warning": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    },
        +    "PublicRotateWebhookSecretResponse": {
        +      "description": "A newly added signing secret. The secret is shown only here.",
        +      "properties": {
        +        "secret": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "secretId": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "warning": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    }
        +  },
        +  "anyOf": [
        +    {
        +      "$ref": "#/$defs/PublicCreateWebhookSubscriptionResponse"
        +    },
        +    {
        +      "properties": {
        +        "environmentIds": {
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": [
        +            "array",
        +            "null"
        +          ]
        +        },
        +        "eventTypes": {
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": [
        +            "array",
        +            "null"
        +          ]
        +        },
        +        "id": {
        +          "type": "string"
        +        },
        +        "isEnabled": {
        +          "type": [
        +            "boolean",
        +            "null"
        +          ]
        +        },
        +        "name": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "projectIds": {
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": [
        +            "array",
        +            "null"
        +          ]
        +        },
        +        "updated": {
        +          "type": "boolean"
        +        },
        +        "url": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        }
        +      },
        +      "required": [
        +        "id",
        +        "updated"
        +      ],
        +      "type": "object"
        +    },
        +    {
        +      "properties": {
        +        "deleted": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "deleted"
        +      ],
        +      "type": "object"
        +    },
        +    {
        +      "$ref": "#/$defs/PublicRotateWebhookSecretResponse"
        +    },
        +    {
        +      "properties": {
        +        "id": {
        +          "type": "string"
        +        },
        +        "retiredSecretId": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "id",
        +        "retiredSecretId"
        +      ],
        +      "type": "object"
        +    }
        +  ],
        +  "type": "object"
        +}
    • Changedrestore_flag3 fields changed
      • addedInput schema / properties / flag / description
        Added value: +"Flag key or id"
      • addedInput schema / properties / project / description
        Added value: +"Project key"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "archived": {
        +      "type": "boolean"
        +    },
        +    "flag": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "flag",
        +    "archived"
        +  ],
        +  "type": "object"
        +}
    • Addedset_default_flag_lifetime
    • Changedset_flag_expiry2 fields changed
      • addedInput schema / properties / project / description
        Added value: +"Project key"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "expiresAtUtc": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "flag": {
        +      "type": "string"
        +    },
        +    "project": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "project",
        +    "flag",
        +    "expiresAtUtc"
        +  ],
        +  "type": "object"
        +}
    • Changedset_flag_owner2 fields changed
      • addedInput schema / properties / project / description
        Added value: +"Project key"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "flag": {
        +      "type": "string"
        +    },
        +    "owner": {
        +      "description": "Owner email now set, or null when unowned",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "project": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "project",
        +    "flag",
        +    "owner"
        +  ],
        +  "type": "object"
        +}
    • Addedset_flag_permanent
    • Changedtoggle_flag3 fields changed
      • addedInput schema / properties / enabled / description
        Added value: +"true to turn the flag on in this environment, false to turn it off"
      • addedInput schema / properties / project / description
        Added value: +"Project key"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "enabled": {
        +      "type": "boolean"
        +    },
        +    "environment": {
        +      "type": "string"
        +    },
        +    "flag": {
        +      "type": "string"
        +    },
        +    "project": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "project",
        +    "flag",
        +    "environment",
        +    "enabled"
        +  ],
        +  "type": "object"
        +}
    • Changedupdate_flag7 fields changed
      • addedInput schema / properties / clientSideVisible / description
        Added value: +"Expose to client-side SDKs (browser/mobile); false hides the flag from them entirely"
      • addedInput schema / properties / description / description
        Added value: +"New description; \"\" clears it"
      • addedInput schema / properties / ifMatch
        Added value: +{
        +  "description": "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.",
        +  "type": "string"
        +}
      • addedInput schema / properties / name / description
        Added value: +"New display name"
      • addedInput schema / properties / project / description
        Added value: +"Project key"
      • addedInput schema / properties / tags / description
        Added value: +"Replaces the whole tag list"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "etag": {
        +      "description": "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.",
        +      "type": "string"
        +    },
        +    "flag": {
        +      "type": "string"
        +    },
        +    "project": {
        +      "type": "string"
        +    },
        +    "updated": {
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "project",
        +    "flag",
        +    "updated"
        +  ],
        +  "type": "object"
        +}
    • Changedupdate_flag_environment_config5 fields changed
      • addedInput schema / properties / environment / description
        Added value: +"Environment key, e.g. production"
      • addedInput schema / properties / flag / description
        Added value: +"Flag key or id"
      • addedInput schema / properties / project / description
        Added value: +"Project key"
      • addedInput schema / properties / strategy / description
        Added value: +"Serving strategy; only SingleVariation is currently supported here"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "defaultVariationId": {
        +      "type": "string"
        +    },
        +    "environment": {
        +      "type": "string"
        +    },
        +    "flag": {
        +      "type": "string"
        +    },
        +    "prerequisites": {
        +      "items": {
        +        "properties": {
        +          "expectedVariationKey": {
        +            "type": "string"
        +          },
        +          "prerequisiteFlagKey": {
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "project": {
        +      "type": "string"
        +    },
        +    "strategy": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "project",
        +    "flag",
        +    "environment",
        +    "defaultVariationId"
        +  ],
        +  "type": "object"
        +}
    • Changedupdate_targeting6 fields changed
      • addedInput schema / properties / environment / description
        Added value: +"Environment key, e.g. production"
      • addedInput schema / properties / flag / description
        Added value: +"Flag key or id"
      • addedInput schema / properties / ifMatch
        Added value: +{
        +  "description": "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.",
        +  "type": "string"
        +}
      • addedInput schema / properties / project / description
        Added value: +"Project key"
      • addedInput schema / properties / rules / description
        Added value: +"The complete ordered rule list; rules left out are deleted"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "environment": {
        +      "type": "string"
        +    },
        +    "etag": {
        +      "description": "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.",
        +      "type": "string"
        +    },
        +    "flag": {
        +      "type": "string"
        +    },
        +    "project": {
        +      "type": "string"
        +    },
        +    "rulesReplaced": {
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "project",
        +    "flag",
        +    "environment",
        +    "rulesReplaced"
        +  ],
        +  "type": "object"
        +}
    • Changedwrap_feature3 fields changed
      • addedInput schema / properties / idempotency_key / description
        Added value: +"Idempotency-Key header for safe retries"
      • addedInput schema / properties / tags / description
        Added value: +"Tags for filtering, e.g. team or area"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$defs": {
        +    "ActionCapability": {
        +      "description": "One entry in a resource's `_actions` block: may the caller perform it, and if not, why.",
        +      "properties": {
        +        "allowed": {
        +          "type": [
        +            "boolean",
        +            "null"
        +          ]
        +        },
        +        "reason": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    },
        +    "PublicFlagOwner": {
        +      "description": "A flag's owner as returned on flag reads. Null means the flag is unowned.",
        +      "properties": {
        +        "email": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "id": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "name": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    },
        +    "PublicFlagResponse": {
        +      "description": "Public detail representation of a feature flag, returned by\n`GET .../flags/{flag}` and the body of a successful create. Drops internal/dashboard-only\nfields present on FeatureFlagDto — notably `ProjectId` (implicit in the\nroute) and `Staleness` (an internal analytics signal, not part of the public contract).\nEffectiveExpiresAtUtc is when the flag counts as past expiry, from its own ExpiresAtUtc\nor its project's default lifetime; ExpirySource says which (`explicit` / `project-default`),\nboth null when neither applies.",
        +      "properties": {
        +        "_actions": {
        +          "additionalProperties": {
        +            "anyOf": [
        +              {
        +                "$ref": "#/$defs/ActionCapability"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          },
        +          "description": "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 runtime; safe to ignore. Present only on top-level resource responses — nested occurrences (e.g. a rule inside a targeting-config response) do not carry it.",
        +          "type": [
        +            "object",
        +            "null"
        +          ]
        +        },
        +        "clientSideVisible": {
        +          "type": [
        +            "boolean",
        +            "null"
        +          ]
        +        },
        +        "createdAt": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "description": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "effectiveExpiresAtUtc": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "expiresAtUtc": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "expirySource": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "id": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "isArchived": {
        +          "type": [
        +            "boolean",
        +            "null"
        +          ]
        +        },
        +        "isPermanent": {
        +          "type": [
        +            "boolean",
        +            "null"
        +          ]
        +        },
        +        "key": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "name": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "owner": {
        +          "anyOf": [
        +            {
        +              "$ref": "#/$defs/PublicFlagOwner"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        },
        +        "removalPrUrl": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "tags": {
        +          "items": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "type": [
        +            "array",
        +            "null"
        +          ]
        +        },
        +        "type": {
        +          "description": "Allowed values: Boolean, String, Number, Json.",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "updatedAt": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "variations": {
        +          "items": {
        +            "anyOf": [
        +              {
        +                "$ref": "#/$defs/PublicVariationResponse"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          },
        +          "type": [
        +            "array",
        +            "null"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    },
        +    "PublicVariationResponse": {
        +      "description": "A single variation on a flag, as returned in Variations.",
        +      "properties": {
        +        "_actions": {
        +          "additionalProperties": {
        +            "anyOf": [
        +              {
        +                "$ref": "#/$defs/ActionCapability"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          },
        +          "description": "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 runtime; safe to ignore. Present only on top-level resource responses — nested occurrences (e.g. a rule inside a targeting-config response) do not carry it.",
        +          "type": [
        +            "object",
        +            "null"
        +          ]
        +        },
        +        "description": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "id": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "key": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "name": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "value": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        }
        +      },
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    }
        +  },
        +  "properties": {
        +    "flag": {
        +      "$ref": "#/$defs/PublicFlagResponse"
        +    },
        +    "integration": {
        +      "properties": {
        +        "code": {
        +          "type": "string"
        +        },
        +        "install": {
        +          "type": "string"
        +        },
        +        "language": {
        +          "type": "string"
        +        },
        +        "notes": {
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "next_steps": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "flag",
        +    "integration",
        +    "next_steps"
        +  ],
        +  "type": "object"
        +}
  2. 1 tool updatev0.1.10
    • Addedlist_removal_candidates
  3. 5 tool updatesv0.1.9
    • Changedcreate_flag2 fields changed
      • changedInput schema / properties / expiresAtUtc / description
        Previous value: -"Optional ISO-8601 UTC instant the flag is expected to be removed by (see set_flag_expiry)"New value: +"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)"
      • addedInput schema / properties / ownerEmail
        Added value: +{
        +  "description": "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",
        +  "type": "string"
        +}
    • Changedfind_stale_flags1 field changed
      • addedInput schema / properties / owner
        Added value: +{
        +  "description": "Only flags with this owner: an email, \"me\" for the token's own user, or \"none\" for unowned flags",
        +  "type": "string"
        +}
    • Changedlist_flags1 field changed
      • addedInput schema / properties / owner
        Added value: +{
        +  "description": "Only flags with this owner: an email, \"me\" for the token's own user, or \"none\" for unowned flags",
        +  "type": "string"
        +}
    • Changedset_flag_expiry1 field changed
      • changedInput schema / properties / expiresAtUtc / description
        Previous value: -"ISO-8601 UTC instant, or null to clear the expiry"New value: +"Date (YYYY-MM-DD, end of that UTC day) or ISO-8601 timestamp, or null to clear the expiry"
    • Addedset_flag_owner
  4. 6 tool updatesv0.1.8
    • Changedcreate_flag1 field changed
      • addedInput schema / properties / expiresAtUtc
        Added value: +{
        +  "description": "Optional ISO-8601 UTC instant the flag is expected to be removed by (see set_flag_expiry)",
        +  "type": "string"
        +}
    • Addeddeliver_webhook
    • Addedlist_webhook_deliveries
    • Addedlist_webhooks
    • Addedmanage_webhook
    • Addedset_flag_expiry
  5. 1 tool updatev0.1.7
    • Changedarchive_flag1 field changed
      • addedInput schema / properties / force
        Added value: +{
        +  "description": "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.",
        +  "type": "boolean"
        +}
  6. 19 tool updatesv0.1.6
    • First observedarchive_flag
    • First observedcreate_flag
    • First observeddelete_flag
    • First observedfind_stale_flags
    • First observedflag_status
    • First observedget_flag
    • First observedget_segment
    • First observedget_targeting
    • First observedlist_environments
    • First observedlist_flags
    • First observedlist_projects
    • First observedlist_segments
    • First observedmanage_variation
    • First observedrestore_flag
    • First observedtoggle_flag
    • First observedupdate_flag
    • First observedupdate_flag_environment_config
    • First observedupdate_targeting
    • First observedwrap_feature

TDQS

A3.8/5.0

Scored across 34 tools

Disambiguation4/5

Most tools target a distinct resource+action, and the descriptions explicitly disambiguate the tricky pairs (update_targeting = full replace vs manage_targeting_rule = single rule; delete_flag vs archive_flag; toggle_flag vs update_flag_environment_config). There is mild residual overlap between find_stale_flags / list_removal_candidates and between create_flag / wrap_feature, but the descriptions make the intended use clear.

Naming Consistency4/5

Strong, readable verb_noun pattern throughout (list_/get_/create_/update_/delete_/archive_/restore_/set_/toggle_) with a consistent 'manage_X' convention for multi-action tools. Minor deviations like flag_status (no verb) and the long update_flag_environment_config keep it from being perfectly uniform.

Tool Count3/5

At 34 tools this is on the heavy side (25+), spanning projects, environments, SDK keys, segments, flags, targeting, variations, webhooks and cleanup. The breadth is largely domain-driven rather than redundant, but tools like wrap_feature and toggle_flag suggest some consolidation is possible.

Completeness5/5

Coverage is excellent: full flag lifecycle (create/update/delete/archive/restore), targeting (both full-replace and single-rule), variations, segments CRUD, SDK keys with rotation, webhook management plus delivery diagnostics, and cleanup helpers. The only absences (project/environment deletion) are explicitly documented as unsupported by the API rather than surface gaps.

Maintenance

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables interaction with LaunchDarkly's feature flag platform through AI clients. Supports managing feature flags, AI configs, and their variations with operations like create, update, delete, and targeting configuration.
    26,880 npm
    27
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Enables AI assistants to manage Featureflow feature flags, including creating and updating features, controlling feature states across environments, and managing projects, environments, and targeting rules through natural language.
    22
    9 npm
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI coding assistants like Cursor and Claude to manage DevCycle feature flags directly from the development environment.
    11,794 npm
    20
    MIT