Skip to main content
Glama
canopy-labs

Featureflip

Official

List webhook subscriptions

list_webhooks
Read-only

List an organization's outbound webhook subscriptions, including URLs, filters, enabled state, failure counts, and signing secret IDs, plus event types available for filtering.

Instructions

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.

Input Schema

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

Output Schema

NameRequiredDescriptionDefault
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

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"
      +      ]
      +    },
      +    "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"
      +}
  2. Addedv0.1.8

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.