Skip to main content
Glama

Cooper Email

Update webhook

cooper_update_webhook
DestructiveIdempotent

Use this when a webhook URL, event list, inbox filter, or enabled flag should change. Requires auth. Inputs: webhook_id (required), url (optional http(s) URL), events (optional array), enabled (optional boolean; true re-enables and resets consecutive_failures, false disables and stops deliveries), inbox_ids (optional; at most 10 inbox ids). Returns the webhook with the secret redacted. A disabled hook receives no deliveries. Fails with 404 webhook_not_found, 400 too_many_inboxes, 400 invalid_url, or 404 inbox_not_found.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "webhook_id": "<webhook_id>"
    },
    "name": "cooper_update_webhook"
  }
}

Input Schema

NameRequiredDescriptionDefault
urlNoReplacement http(s) URL
eventsNoReplacement event list. At least one of message.received, message.held, message.sent, message.blocked, message.bounced, message.complained, task.received, owner.reply, domain.verified, draft.created, draft.approved, draft.rejected, draft.sent, account.sending_paused, account.sending_resumed, thread.assigned, thread.unassigned, thread.folder_updated, question.answered, or question.expired.
enabledNotrue re-enables the hook and resets consecutive_failures to 0. false disables it.
inbox_idsNoReplacement inbox filter, at most 10 ids. An empty array matches every inbox. More than 10 returns 400 too_many_inboxes.
webhook_idYesWebhook id (wh_…)

Output Schema

NameRequiredDescriptionDefault
idNoStable id of the returned object. Pass it to the matching get, update, or delete tool.
urlNoURL that receives POST deliveries.
eventsNoEvent types this object delivers.
secretNoSigning secret. Shown in full once on create or rotate, redacted otherwise.
enabledNoTrue when the object is active.
headersNoExtra delivery headers. Values are redacted.
inbox_idNoInbox id (inb_…) this object belongs to. Null when it applies to every inbox.
client_idNoCaller idempotency key stored with the object, or null.
inbox_idsNoInbox ids this object is limited to. Empty means every inbox on the account.
created_atNoISO-8601 time the object was created.
disabled_atNoISO-8601 time Cooper disabled the hook, or null.
disabled_reasonNoWhy the hook was disabled, or null.
consecutive_failuresNoFailed deliveries in a row.
previous_secret_activeNoTrue while deliveries are also signed with the previous secret.
previous_secret_expires_atNoISO-8601 time the previous secret stops signing, or null.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / events / items / enum
      Previous value: -[
      -  "message.received",
      -  "message.held",
      -  "message.sent",
      -  "message.blocked",
      -  "message.bounced",
      -  "message.complained",
      -  "task.received",
      -  "owner.reply",
      -  "chat.message",
      -  "domain.verified",
      -  "draft.created",
      -  "draft.approved",
      -  "draft.rejected",
      -  "draft.sent",
      -  "account.sending_paused",
      -  "account.sending_resumed",
      -  "thread.assigned",
      -  "thread.unassigned",
      -  "thread.folder_updated",
      -  "question.answered",
      -  "question.expired",
      -  "rule.matched"
      -]New value: +[
      +  "message.received",
      +  "message.held",
      +  "message.sent",
      +  "message.blocked",
      +  "message.bounced",
      +  "message.complained",
      +  "task.received",
      +  "owner.reply",
      +  "chat.message",
      +  "domain.verified",
      +  "draft.created",
      +  "draft.approved",
      +  "draft.rejected",
      +  "draft.sent",
      +  "account.sending_paused",
      +  "account.sending_resumed",
      +  "thread.assigned",
      +  "thread.unassigned",
      +  "thread.folder_updated",
      +  "question.answered",
      +  "question.expired",
      +  "rule.matched",
      +  "key.leak_reported"
      +]
  2. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "additionalProperties": true,
      +  "description": "The webhook after the update, secret redacted.",
      +  "properties": {
      +    "client_id": {
      +      "description": "Caller idempotency key stored with the object, or null."
      +    },
      +    "consecutive_failures": {
      +      "description": "Failed deliveries in a row."
      +    },
      +    "created_at": {
      +      "description": "ISO-8601 time the object was created."
      +    },
      +    "disabled_at": {
      +      "description": "ISO-8601 time Cooper disabled the hook, or null."
      +    },
      +    "disabled_reason": {
      +      "description": "Why the hook was disabled, or null."
      +    },
      +    "enabled": {
      +      "description": "True when the object is active."
      +    },
      +    "events": {
      +      "description": "Event types this object delivers."
      +    },
      +    "headers": {
      +      "description": "Extra delivery headers. Values are redacted."
      +    },
      +    "id": {
      +      "description": "Stable id of the returned object. Pass it to the matching get, update, or delete tool."
      +    },
      +    "inbox_id": {
      +      "description": "Inbox id (inb_…) this object belongs to. Null when it applies to every inbox."
      +    },
      +    "inbox_ids": {
      +      "description": "Inbox ids this object is limited to. Empty means every inbox on the account."
      +    },
      +    "previous_secret_active": {
      +      "description": "True while deliveries are also signed with the previous secret."
      +    },
      +    "previous_secret_expires_at": {
      +      "description": "ISO-8601 time the previous secret stops signing, or null."
      +    },
      +    "secret": {
      +      "description": "Signing secret. Shown in full once on create or rotate, redacted otherwise."
      +    },
      +    "url": {
      +      "description": "URL that receives POST deliveries."
      +    }
      +  },
      +  "type": "object"
      +}
  3. Changed2 schema fields changed
    • changedInput schema / properties / events / description
      Previous value: -"Replacement event list. At least one of message.received, message.held, message.sent, message.blocked, message.bounced, message.complained, task.received, owner.reply, domain.verified, draft.created, draft.approved, draft.rejected, draft.sent, account.sending_paused, account.sending_resumed, thread.assigned, thread.unassigned, or thread.folder_updated."New value: +"Replacement event list. At least one of message.received, message.held, message.sent, message.blocked, message.bounced, message.complained, task.received, owner.reply, domain.verified, draft.created, draft.approved, draft.rejected, draft.sent, account.sending_paused, account.sending_resumed, thread.assigned, thread.unassigned, thread.folder_updated, question.answered, or question.expired."
    • changedInput schema / properties / events / items / enum
      Previous value: -[
      -  "message.received",
      -  "message.held",
      -  "message.sent",
      -  "message.blocked",
      -  "message.bounced",
      -  "message.complained",
      -  "task.received",
      -  "owner.reply",
      -  "chat.message",
      -  "domain.verified",
      -  "draft.created",
      -  "draft.approved",
      -  "draft.rejected",
      -  "draft.sent",
      -  "account.sending_paused",
      -  "account.sending_resumed",
      -  "thread.assigned",
      -  "thread.unassigned",
      -  "thread.folder_updated",
      -  "rule.matched"
      -]New value: +[
      +  "message.received",
      +  "message.held",
      +  "message.sent",
      +  "message.blocked",
      +  "message.bounced",
      +  "message.complained",
      +  "task.received",
      +  "owner.reply",
      +  "chat.message",
      +  "domain.verified",
      +  "draft.created",
      +  "draft.approved",
      +  "draft.rejected",
      +  "draft.sent",
      +  "account.sending_paused",
      +  "account.sending_resumed",
      +  "thread.assigned",
      +  "thread.unassigned",
      +  "thread.folder_updated",
      +  "question.answered",
      +  "question.expired",
      +  "rule.matched"
      +]
  4. Changed1 schema field changed
    • changedInput schema / properties / events / items / enum
      Previous value: -[
      -  "message.received",
      -  "message.held",
      -  "message.sent",
      -  "message.blocked",
      -  "message.bounced",
      -  "message.complained",
      -  "task.received",
      -  "owner.reply",
      -  "chat.message",
      -  "domain.verified",
      -  "draft.created",
      -  "draft.approved",
      -  "draft.rejected",
      -  "draft.sent",
      -  "account.sending_paused",
      -  "account.sending_resumed",
      -  "thread.assigned",
      -  "thread.unassigned",
      -  "thread.folder_updated"
      -]New value: +[
      +  "message.received",
      +  "message.held",
      +  "message.sent",
      +  "message.blocked",
      +  "message.bounced",
      +  "message.complained",
      +  "task.received",
      +  "owner.reply",
      +  "chat.message",
      +  "domain.verified",
      +  "draft.created",
      +  "draft.approved",
      +  "draft.rejected",
      +  "draft.sent",
      +  "account.sending_paused",
      +  "account.sending_resumed",
      +  "thread.assigned",
      +  "thread.unassigned",
      +  "thread.folder_updated",
      +  "rule.matched"
      +]
  5. Changed2 schema fields changed
    • changedInput schema / properties / events / description
      Previous value: -"Replacement event list. At least one of message.received, message.held, message.sent, message.blocked, message.bounced, message.complained, task.received, owner.reply, domain.verified, draft.created, draft.approved, draft.rejected, draft.sent, account.sending_paused, account.sending_resumed, thread.assigned, or thread.unassigned."New value: +"Replacement event list. At least one of message.received, message.held, message.sent, message.blocked, message.bounced, message.complained, task.received, owner.reply, domain.verified, draft.created, draft.approved, draft.rejected, draft.sent, account.sending_paused, account.sending_resumed, thread.assigned, thread.unassigned, or thread.folder_updated."
    • changedInput schema / properties / events / items / enum
      Previous value: -[
      -  "message.received",
      -  "message.held",
      -  "message.sent",
      -  "message.blocked",
      -  "message.bounced",
      -  "message.complained",
      -  "task.received",
      -  "owner.reply",
      -  "chat.message",
      -  "domain.verified",
      -  "draft.created",
      -  "draft.approved",
      -  "draft.rejected",
      -  "draft.sent",
      -  "account.sending_paused",
      -  "account.sending_resumed",
      -  "thread.assigned",
      -  "thread.unassigned"
      -]New value: +[
      +  "message.received",
      +  "message.held",
      +  "message.sent",
      +  "message.blocked",
      +  "message.bounced",
      +  "message.complained",
      +  "task.received",
      +  "owner.reply",
      +  "chat.message",
      +  "domain.verified",
      +  "draft.created",
      +  "draft.approved",
      +  "draft.rejected",
      +  "draft.sent",
      +  "account.sending_paused",
      +  "account.sending_resumed",
      +  "thread.assigned",
      +  "thread.unassigned",
      +  "thread.folder_updated"
      +]
  6. Changed1 schema field changed
    • changedInput schema / properties / events / items / enum
      Previous value: -[
      -  "message.received",
      -  "message.held",
      -  "message.sent",
      -  "message.blocked",
      -  "message.bounced",
      -  "message.complained",
      -  "task.received",
      -  "owner.reply",
      -  "domain.verified",
      -  "draft.created",
      -  "draft.approved",
      -  "draft.rejected",
      -  "draft.sent",
      -  "account.sending_paused",
      -  "account.sending_resumed",
      -  "thread.assigned",
      -  "thread.unassigned"
      -]New value: +[
      +  "message.received",
      +  "message.held",
      +  "message.sent",
      +  "message.blocked",
      +  "message.bounced",
      +  "message.complained",
      +  "task.received",
      +  "owner.reply",
      +  "chat.message",
      +  "domain.verified",
      +  "draft.created",
      +  "draft.approved",
      +  "draft.rejected",
      +  "draft.sent",
      +  "account.sending_paused",
      +  "account.sending_resumed",
      +  "thread.assigned",
      +  "thread.unassigned"
      +]
  7. Changed2 schema fields changed
    • changedInput schema / properties / events / description
      Previous value: -"Replacement event list. At least one of message.received, message.held, message.sent, message.blocked, message.bounced, message.complained, task.received, owner.reply, domain.verified, draft.created, draft.approved, draft.rejected, draft.sent."New value: +"Replacement event list. At least one of message.received, message.held, message.sent, message.blocked, message.bounced, message.complained, task.received, owner.reply, domain.verified, draft.created, draft.approved, draft.rejected, draft.sent, account.sending_paused, account.sending_resumed, thread.assigned, or thread.unassigned."
    • changedInput schema / properties / events / items / enum
      Previous value: -[
      -  "message.received",
      -  "message.held",
      -  "message.sent",
      -  "message.blocked",
      -  "message.bounced",
      -  "message.complained",
      -  "task.received",
      -  "owner.reply",
      -  "domain.verified",
      -  "draft.created",
      -  "draft.approved",
      -  "draft.rejected",
      -  "draft.sent"
      -]New value: +[
      +  "message.received",
      +  "message.held",
      +  "message.sent",
      +  "message.blocked",
      +  "message.bounced",
      +  "message.complained",
      +  "task.received",
      +  "owner.reply",
      +  "domain.verified",
      +  "draft.created",
      +  "draft.approved",
      +  "draft.rejected",
      +  "draft.sent",
      +  "account.sending_paused",
      +  "account.sending_resumed",
      +  "thread.assigned",
      +  "thread.unassigned"
      +]
  8. Changed2 schema fields changed
    • changedInput schema / properties / events / description
      Previous value: -"Replacement event list. At least one of message.received, message.held, message.sent, message.blocked, message.bounced, message.complained, task.received, owner.reply, domain.verified."New value: +"Replacement event list. At least one of message.received, message.held, message.sent, message.blocked, message.bounced, message.complained, task.received, owner.reply, domain.verified, draft.created, draft.approved, draft.rejected, draft.sent."
    • changedInput schema / properties / events / items / enum
      Previous value: -[
      -  "message.received",
      -  "message.held",
      -  "message.sent",
      -  "message.blocked",
      -  "message.bounced",
      -  "message.complained",
      -  "task.received",
      -  "owner.reply",
      -  "domain.verified"
      -]New value: +[
      +  "message.received",
      +  "message.held",
      +  "message.sent",
      +  "message.blocked",
      +  "message.bounced",
      +  "message.complained",
      +  "task.received",
      +  "owner.reply",
      +  "domain.verified",
      +  "draft.created",
      +  "draft.approved",
      +  "draft.rejected",
      +  "draft.sent"
      +]
  9. Changed2 schema fields changed
    • changedInput schema / properties / events / description
      Previous value: -"Replacement event list. At least one of message.received, message.sent, message.blocked, message.bounced, message.complained, task.received, owner.reply, domain.verified."New value: +"Replacement event list. At least one of message.received, message.held, message.sent, message.blocked, message.bounced, message.complained, task.received, owner.reply, domain.verified."
    • changedInput schema / properties / events / items / enum
      Previous value: -[
      -  "message.received",
      -  "message.sent",
      -  "message.blocked",
      -  "message.bounced",
      -  "message.complained",
      -  "task.received",
      -  "owner.reply",
      -  "domain.verified"
      -]New value: +[
      +  "message.received",
      +  "message.held",
      +  "message.sent",
      +  "message.blocked",
      +  "message.bounced",
      +  "message.complained",
      +  "task.received",
      +  "owner.reply",
      +  "domain.verified"
      +]
  10. Changed2 schema fields changed
    • changedInput schema / properties / events / description
      Previous value: -"Replacement event list. At least one of message.received, message.sent, message.blocked, task.received, owner.reply, domain.verified."New value: +"Replacement event list. At least one of message.received, message.sent, message.blocked, message.bounced, message.complained, task.received, owner.reply, domain.verified."
    • changedInput schema / properties / events / items / enum
      Previous value: -[
      -  "message.received",
      -  "message.sent",
      -  "message.blocked",
      -  "task.received",
      -  "owner.reply",
      -  "domain.verified"
      -]New value: +[
      +  "message.received",
      +  "message.sent",
      +  "message.blocked",
      +  "message.bounced",
      +  "message.complained",
      +  "task.received",
      +  "owner.reply",
      +  "domain.verified"
      +]
  11. Added

TDQS

A4.1/5.0
Behavior5/5

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

Goes well beyond the annotations by disclosing that enabling resets consecutive_failures, that a disabled hook receives no deliveries, that the returned webhook has its secret redacted, and the exact failure codes (404 webhook_not_found, 400 too_many_inboxes, 400 invalid_url, 404 inbox_not_found). That is real operational context an agent cannot get from readOnlyHint/destructiveHint/idempotentHint 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?

Front-loaded with the when-to-use clause, then the auth requirement, then parameters, then return value and errors — a sensible priority order with no filler. The 'Inputs:' enumeration duplicates the schema and could be trimmed, but it stays compact.

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?

Annotations cover the safety profile (destructive, idempotent, open-world), an output schema exists so return values needn't be explained, and the description still supplies auth requirements, side effects, and error taxonomy. Nothing an agent needs in order to invoke this correctly is absent.

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 url, events, enabled, inbox_ids, and webhook_id in comparable detail; the description largely restates those descriptions rather than adding new meaning. The only marginal addition is tying failures to specific parameters (too_many_inboxes, invalid_url), which is useful but thin.

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 first sentence names a specific verb-and-resource pair ('webhook ... should change') and enumerates the exact fields in scope (URL, event list, inbox filter, enabled flag), which separates it from a create/register or a delete operation. It stops short of naming a sibling outright, so an agent must infer that e.g. secret rotation or delivery testing belongs to cooper_rotate_webhook_secret / cooper_test_webhook.

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?

'Use this when a webhook URL, event list, inbox filter, or enabled flag should change' gives a concrete triggering condition, and the auth prerequisite is stated up front. It does not explicitly exclude alternatives (registering a new hook, deleting, rotating the secret, sending a test delivery), so a routing hint like 'use cooper_register_webhook to create one' is missing.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.