Skip to main content
Glama
canopy-labs

Featureflip

Official

Get feature flag

get_flag
Read-only

Retrieve one Featureflip feature flag using its project key and flag key or ID to view variations, metadata, and owner (null when unowned).

Instructions

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

Input Schema

NameRequiredDescriptionDefault
flagYesFlag key or id
projectYesProject key

Output Schema

NameRequiredDescriptionDefault
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

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changedv0.3.0
    • 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"
      +}
  2. First observedv0.1.6

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.