Skip to main content
Glama

Cluby MCP

Update benefit

update_benefit
DestructiveIdempotent

Edit a benefit (benefitId is the id from list_benefits). Only the fields sent change; content and activation are merged field by field, so send just the keys being edited. Requires the admin role on the benefit's venue. To change the photo, call import_image and pass its images as content.images. Set status to hidden to hide it from members or active to show it again. visibleToStatusCards: [] makes it visible to every member; activation.schedules: null removes its schedules. Fields owned by a campaign or the partner product catalogue (see campaign and productVariantId) can be overwritten by them later.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
orgIdNoOrganization public id, the `id` field from list_orgs. Omit it when the API key reaches exactly one organization.
statusNo
contentNo
venueIdsNoVenue IDs where this benefit is available
benefitIdYesBenefit `id` from list_benefits
sortOrderNo
activationNo
campaignIdNo
productVariantIdNo
visibleToStatusCardsNoStatus card IDs. Undefined = no change, empty array = public benefit

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • removedInput schema / properties / content / properties / icon
      Removed value: -{
      -  "properties": {
      -    "name": {
      -      "default": "star",
      -      "type": "string"
      -    },
      -    "variant": {
      -      "default": "solid",
      -      "enum": [
      -        "solid",
      -        "regular",
      -        "light"
      -      ],
      -      "type": "string"
      -    }
      -  },
      -  "type": "object"
      -}
  2. Changed6 schema fields changed
    • changedInput schema / properties / content / properties / images / items / properties / attribution / description
      Previous value: -"Attribution metadata for images sourced from third-party providers (e.g. Unsplash). Stored on each image variant so attribution travels with the image data wherever it's persisted."New value: +"Attribution metadata for images sourced from third-party providers (Unsplash, Pexels, Wikimedia Commons). Stored on each image variant so attribution travels with the image data wherever it's persisted. Wikimedia images under a CC BY or CC BY-SA license must be displayed with the photographer, license and source link."
    • addedInput schema / properties / content / properties / images / items / properties / attribution / properties / license
      Added value: +{
      +  "description": "Wikimedia only, e.g. \"CC BY-SA 4.0\"",
      +  "type": "string"
      +}
    • addedInput schema / properties / content / properties / images / items / properties / attribution / properties / licenseUrl
      Added value: +{
      +  "format": "uri",
      +  "type": "string"
      +}
    • removedInput schema / properties / content / properties / images / items / properties / attribution / properties / source / const
      Removed value: -"unsplash"
    • addedInput schema / properties / content / properties / images / items / properties / attribution / properties / source / enum
      Added value: +[
      +  "unsplash",
      +  "pexels",
      +  "wikimedia"
      +]
    • changedInput schema / properties / content / properties / images / items / properties / attribution / required
      Previous value: -[
      -  "source",
      -  "photoId",
      -  "photographerName",
      -  "photographerProfileUrl",
      -  "sourceUrl"
      -]New value: +[
      +  "source",
      +  "photoId",
      +  "photographerName",
      +  "sourceUrl"
      +]
  3. Changed10 schema fields changed
    • addedInput schema / properties / content / properties / description / anyOf
      Added value: +[
      +  {
      +    "description": "A localized string with a required default value and optional locale-specific translations",
      +    "properties": {
      +      "cs": {
      +        "type": "string"
      +      },
      +      "da": {
      +        "type": "string"
      +      },
      +      "de": {
      +        "type": "string"
      +      },
      +      "default": {
      +        "type": "string"
      +      },
      +      "en": {
      +        "type": "string"
      +      },
      +      "es": {
      +        "type": "string"
      +      },
      +      "et": {
      +        "type": "string"
      +      },
      +      "fi": {
      +        "type": "string"
      +      },
      +      "fr": {
      +        "type": "string"
      +      },
      +      "it": {
      +        "type": "string"
      +      },
      +      "ka": {
      +        "type": "string"
      +      },
      +      "lt": {
      +        "type": "string"
      +      },
      +      "lv": {
      +        "type": "string"
      +      },
      +      "nb": {
      +        "type": "string"
      +      },
      +      "nl": {
      +        "type": "string"
      +      },
      +      "pl": {
      +        "type": "string"
      +      },
      +      "pt": {
      +        "type": "string"
      +      },
      +      "ru": {
      +        "type": "string"
      +      },
      +      "sk": {
      +        "type": "string"
      +      },
      +      "sv": {
      +        "type": "string"
      +      },
      +      "uk": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "default"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / content / properties / description / description
      Previous value: -"A localized string with a required default value and optional locale-specific translations"New value: +"null clears the description"
    • removedInput schema / properties / content / properties / description / properties
      Removed value: -{
      -  "cs": {
      -    "type": "string"
      -  },
      -  "da": {
      -    "type": "string"
      -  },
      -  "de": {
      -    "type": "string"
      -  },
      -  "default": {
      -    "type": "string"
      -  },
      -  "en": {
      -    "type": "string"
      -  },
      -  "es": {
      -    "type": "string"
      -  },
      -  "et": {
      -    "type": "string"
      -  },
      -  "fi": {
      -    "type": "string"
      -  },
      -  "fr": {
      -    "type": "string"
      -  },
      -  "it": {
      -    "type": "string"
      -  },
      -  "ka": {
      -    "type": "string"
      -  },
      -  "lt": {
      -    "type": "string"
      -  },
      -  "lv": {
      -    "type": "string"
      -  },
      -  "nb": {
      -    "type": "string"
      -  },
      -  "nl": {
      -    "type": "string"
      -  },
      -  "pl": {
      -    "type": "string"
      -  },
      -  "pt": {
      -    "type": "string"
      -  },
      -  "ru": {
      -    "type": "string"
      -  },
      -  "sk": {
      -    "type": "string"
      -  },
      -  "sv": {
      -    "type": "string"
      -  },
      -  "uk": {
      -    "type": "string"
      -  }
      -}
    • removedInput schema / properties / content / properties / description / required
      Removed value: -[
      -  "default"
      -]
    • removedInput schema / properties / content / properties / description / type
      Removed value: -"object"
    • addedInput schema / properties / content / properties / offer
      Added value: +{
      +  "anyOf": [
      +    {
      +      "properties": {
      +        "type": {
      +          "enum": [
      +            "price",
      +            "percent_off"
      +          ],
      +          "type": "string"
      +        },
      +        "value": {
      +          "description": "For `price`: the amount in the minor unit of the organization's currency (500 = 5.00 EUR; 0 = free). For `percent_off`: basis points (2000 = 20 % off), at most 10000.",
      +          "maximum": 2147483647,
      +          "minimum": 0,
      +          "type": "integer"
      +        }
      +      },
      +      "required": [
      +        "type",
      +        "value"
      +      ],
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "The benefit's value: a price or a percentage off. null or absent for a benefit with no value shown."
      +}
    • changedInput schema / properties / content / properties / valueDisplay / description
      Previous value: -"A localized string with a required default value and optional locale-specific translations"New value: +"Read-only and refused: send content.offer"
    • removedInput schema / properties / content / properties / valueDisplay / properties
      Removed value: -{
      -  "cs": {
      -    "type": "string"
      -  },
      -  "da": {
      -    "type": "string"
      -  },
      -  "de": {
      -    "type": "string"
      -  },
      -  "default": {
      -    "type": "string"
      -  },
      -  "en": {
      -    "type": "string"
      -  },
      -  "es": {
      -    "type": "string"
      -  },
      -  "et": {
      -    "type": "string"
      -  },
      -  "fi": {
      -    "type": "string"
      -  },
      -  "fr": {
      -    "type": "string"
      -  },
      -  "it": {
      -    "type": "string"
      -  },
      -  "ka": {
      -    "type": "string"
      -  },
      -  "lt": {
      -    "type": "string"
      -  },
      -  "lv": {
      -    "type": "string"
      -  },
      -  "nb": {
      -    "type": "string"
      -  },
      -  "nl": {
      -    "type": "string"
      -  },
      -  "pl": {
      -    "type": "string"
      -  },
      -  "pt": {
      -    "type": "string"
      -  },
      -  "ru": {
      -    "type": "string"
      -  },
      -  "sk": {
      -    "type": "string"
      -  },
      -  "sv": {
      -    "type": "string"
      -  },
      -  "uk": {
      -    "type": "string"
      -  }
      -}
    • removedInput schema / properties / content / properties / valueDisplay / required
      Removed value: -[
      -  "default"
      -]
    • removedInput schema / properties / content / properties / valueDisplay / type
      Removed value: -"object"
  4. Added

TDQS

A4.6/5.0
Behavior5/5

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

Annotations declare idempotentHint/destructiveHint but say nothing about mechanics; the description supplies the merge semantics ('content and activation are merged field by field'), the admin-role requirement, the destructive caveat that campaign or product-catalogue fields can be overwritten later, and explicit clearing semantics ('visibleToStatusCards: []', 'activation.schedules: null'). This is rich context beyond structured data.

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?

Seven sentences, each carrying distinct operational value — identity, merge rule, permission, cross-tool, visibility toggle, clearing syntax, ownership warning — and front-loaded with purpose before caveats. 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 10-param, deeply nested mutation tool with no output schema, the description covers the hard parts: partial update semantics, permissions, cross-tool image flow, clearing values, and ownership conflicts. Gaps remain around venueIds/sortOrder semantics, but the critical behavioral risks are disclosed.

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?

With only 40% schema coverage across 10 params, the description compensates by explaining benefitId provenance, merge behavior for content/activation, status enum meaning, and empty-array-vs-undefined for visibleToStatusCards. It still leaves venueIds, sortOrder, and the precise role of orgId/campaignId thin, so it is strong but not complete.

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 benefit') and immediately identifies the identity source ('benefitId is the id from list_benefits'), which cleanly separates it from list_benefits and create_benefit. An agent can pick 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 Guidelines4/5

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

Gives concrete when-to-use guidance: send only keys being edited, use import_image (a named sibling) for photo changes, and set status to hidden/active to control visibility. It does not explicitly contrast with create_benefit or list_benefits, but the partial-update framing makes the intended context clear.

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.

Resources